单片机ADC0809实现设计数字电压表
IN0-IN7:模拟量输入通道。就是说它可以分时地分别对八个模拟量进行测量转换。
ADDA-C:地址线。也就是通过这三根地址线的不同编码来选择对哪个模拟量进行测量转换。
ALE:地址锁存允许信号。在低电平时向ADDA-C写地址,当ALE跳至高电平后ADDA-C上的数据被锁存
START:启动转换信号。当它为上升沿后,将内部寄存器清0。当它为下降沿后,开始A/D转换。
D0-D7:数据输出口。转换后的数字数据量就是从这输出给S52的。
OE:输出允许信号,是对D0-D7的输出控制端,OE=0,输出端呈高阻态,OE=1,输出转换得到的数据。
CLOCK:时种信号。ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。
EOC:转换结束状态信号。EOC=0,正在进行转换。EOC=1,转换结束,可以进行下一步输出操作
Vref(+)、Vref(-):参考电压。参考电压用来与输入的模拟量进行比较,作为测量的基准。一般Vref(+)=5v ,Vref(-)=0V。
这个单芯片数据采集系统的核心是其8位模拟数字转换器。该转换器是
旨在在宽温度范围内提供快速、准确和可重复的转换。转换器
分为3个主要部分:256 R阶梯网络、递进逼近寄存器和
比较器转换器的数字输出为正。
选择256 R阶梯网络方法(图3)而不是传统的R/2 R阶梯,因为它
固有的单调性,确保不会丢失数字代码。单调性在封闭中尤其重要
环路反馈控制系统。非单调关系可能会导致振荡,这将是灾难性的
the system.此外,256 R网络不会导致参考电压的负载变化。
图3中阶梯网络的底部电阻和顶部电阻的值与
网络的其余部分。这些电阻的差异导致输出特性对称
具有传输曲线的零点和满刻度点。当模拟信号
已达到+%LB,并且在满规模之前每1个LB发生一次后续的输出转换。
连续逼近寄存器(SAR)执行8次迭代来逼近输入电压。任何
SAR型转换器,n位转换器需要n次迭代。图4显示了3位的典型示例
转换器.在ADC 0808、ADC 0809中,使用256 R将逼近技术扩展到8位
网络
A/D转换器的逐步逼近寄存器(SAR)在开始转换的正沿重置
启动脉冲转换在开始转换脉冲的下降沿开始。正在进行中的转换
将因接收到新的开始转换脉冲而中断。连续转换可以通过以下方式完成
将转换结束(EOC)输出绑定到SC输入。如果在此模式下使用,外部启动转换脉冲
应在通电后使用。上升后,转换结束将在0到8个时钟脉冲之间变低
开始转换的边缘。
A/D转换器最重要的部分是比较器。正是这个部分负责
整个转换器的终极准确性。比较器漂移也对影响最大
设备的可重复性。切碎机稳定比较器提供了满足所有要求的最有效方法
转换器要求。
斩波稳定比较器将DC输入信号转换为AC信号。然后这个信号通过
高增益交流放大器,并恢复直流电平。这种技术限制了放大器的漂移分量
因为漂移是不被AC放大器通过的DC分量。这使得整个A/D转换器
对温度、长期漂移和输入失调误差极其不敏感
*/
通过网盘分享的文件:ADC0809
链接: https://pan.baidu.com/s/1m-ZGY2FHUEpVSnU9j7astg 提取码: 8sim
#define uint unsigned int
#define uchar unsigned char
uchar code shuzi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
uint dianya,vtime; //电压值测定值
uchar addr;//测量地址位
sbit wei_1=P2^3; //对应第4个数码管
sbit wei_2=P2^2; //对应第3个数码管
sbit wei_3=P2^1; //对应第2个数码管
sbit wei_4=P2^0; //对应第1个数码管
sbit wei_5=P1^4;//指示当前显示的是第几个转换值
sbit CLK=P2^4; //时钟信号
sbit START=P2^5; //转换启动开关
sbit EOC=P2^6; //转换结束标志
sbit OE=P2^7;//定义ADC0809各脚
/**********************************************************/
//函数名:delay(uint ms)
//功能:延时程序 改变测量地址
//调用函数:
//输入参数:ms
//输出参数:
//说明:程序的延时时间为x乘以01ms 每5s改变测量地址位
/**********************************************************/
void delay(uint ms)
{
uchar y,j;
for(y=0;y<ms;y++)
for(j=0;j<110;j++);//该步运行时间约为1ms
vtime++;
if(vtime==1000)
{
vtime=0;
addr++;
if(addr==3) //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
addr=0;//以上语句实现测量地址位的改变
}
}
/**********************************************************/
//函数名:ADC()
//功能:数模转换程序
//调用函数:
//输入参数:
//输出参数:
//说明:将转换好的测定值保存在变量dianya中
/**********************************************************/
void ADC()
{
EA=1;//开中断
//确保进入正常AD转换状态?
START=0;
START=1;
START=0;//ad开始转换
while(EOC==0); //等待转换结束
OE=1; //输出数据标志为真
EA=0;//关中断
dianya=P3;//获取转换值保存到volt中,(P3为转换后数据)
dianya=dianya*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
OE=0;//输出转换结束 (要在获取转换值之后)
}
/**********************************************************/
//函数名:display()
//功能:4位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值显示在4位数码管上
/**********************************************************/
void display()
{
P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
wei_1=0;
P0=~shuzi[dianya/10000]&0x7f;//带小数点1伏显示位
delay(2);
P0=0xff;
wei_1=1;
wei_2=0;
P0=~shuzi[(dianya/1000)%10];//100毫伏显示位
delay(2);
P0=0xff;
wei_2=1;
wei_3=0;
P0=~shuzi[(dianya/100)%10];//10毫伏显示位
delay(2);
P0=0xff;
wei_3=1;
wei_4=0;
P0=~shuzi[(dianya/10)%10];//1毫伏显示位
delay(2);
P0=0xff;
wei_4=1;
wei_5=0;
P0=~shuzi[addr+1];//显示电压测量位
delay(2);
wei_5=1;//指示当前显示的是第几个转换值
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
EA=1;//开总中断
TMOD=0x01;//设定定时计数工作方式
//为定时器初赋值
TH0=0XFF;
TL0=0XB4;
ET0=1;//开定时器0中断
TR0=1;//开启定时器0
while(1)
{
P1=addr;//装入测量地址
wei_5=1;
ADC();//调用模数转换程序
display();//调用显示程序
}
}
/**********************************************************/
//函数名:clock() interrupt 1
//功能:定时中断0响应程序
//调用函数:
//输入参数:
//输出参数:
//说明:为ADC提供时钟信号
/**********************************************************/
void clock() interrupt 1
{
//初值重置
TH0=0XFF;
TL0=0XF0;
CLK=~CLK;//取反 产生时钟信号
}








最新发布