C语言实现以AT89C51单片机为核心,ADC0808为AD转换器,采用中断方式,对0~5V的模拟电压进行循环采集,采集的数据送LED数码管显示,并存入内存,超过5V界限指示灯闪烁
时间: 2024-05-12 09:15:06 浏览: 160
以下是一个简单的C语言程序实现以AT89C51单片机为核心,ADC0808为AD转换器,采用中断方式,对0~5V的模拟电压进行循环采集,采集的数据送LED数码管显示,并存入内存,超过5V界限指示灯闪烁。
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P1^4; //ADC芯片选择信号
sbit OE=P1^5; //ADC芯片输出使能信号
sbit CLK=P1^6; //ADC芯片时钟信号
sbit EOC=P1^7; //ADC芯片转换完成信号
uchar AD_Value; //存储ADC转换结果的变量
uchar LED_Buffer[8]; //存储LED数码管显示的缓冲区
uchar Flag; //标志位,用来表示是否超过5V界限
void delay(uint n) //延时函数
{
uint i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
void ADC_Read() interrupt 5 //中断服务程序
{
uchar i;
CS=0; //ADC芯片选择
OE=0; //使能输出
_nop_(); //空指令
_nop_();
_nop_();
CLK=1; //时钟信号上升沿
_nop_();
_nop_();
_nop_();
CLK=0; //时钟信号下降沿
AD_Value=P1; //读取ADC转换结果
CS=1; //ADC芯片取消选择
OE=1; //禁止输出
EOC=0; //清除转换完成标志
if(AD_Value>=0xC8) //超过5V界限
Flag=1; //设置标志位
else
Flag=0; //清除标志位
for(i=0;i<8;i++) //将AD_Value转换成8位二进制数
{
LED_Buffer[i]=AD_Value%2;
AD_Value/=2;
}
}
void main()
{
uchar i,j,k;
TMOD=0x10; //定时器1工作在模式1,16位自动重装载计数器
TH1=(65535-50000)/256; //定时器初值
TL1=(65535-50000)%256;
ET1=1; //开启定时器1中断
EA=1; //开启总中断
TR1=1; //启动定时器1
while(1)
{
for(i=0;i<8;i++) //循环显示AD_Value的二进制数
{
P0=LED_Buffer[i]<<i; //点亮LED数码管
delay(2); //延时一段时间
P0=0; //熄灭LED数码管
delay(2); //延时一段时间
}
if(Flag) //如果超过5V界限
{
for(j=0;j<8;j++) //指示灯闪烁
{
P2=0x00; //灭
delay(10); //延时
P2=0xFF; //亮
delay(10); //延时
}
}
for(k=0;k<8;k++) //将AD_Value存入内存
Memory[k]=LED_Buffer[k];
}
}
```
需要注意的是,此程序仅供参考,具体实现需要根据实际情况进行调整。同时也需要注意单片机与ADC芯片的连接方式和电气特性,以确保程序正常运行。
阅读全文