最新AD转换的数字电压表汇总Word文档下载推荐.docx
《最新AD转换的数字电压表汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新AD转换的数字电压表汇总Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。
片选信号,低电平有效;
RD:
外部读取转换结果的控制信号,当RD为高电平时,DB0-DB7为高阻态;
当RD为低电平时,数据才会通过DB0-DB7输出;
WR:
A/D转换器启动控制信号,当WR由高电平变为低电平时,转换器被清零,当WR由低电平变为高电平时,A/D转换正式开始;
CLKIN和CLKR:
时钟输入端,在ADC0804片内有时钟发生器,采用内部时钟时,在CLKIN
CLKR和地线之间连接RC电路即可,ADC0804的工作频率约为100-1460khz,若使RC
电路作为时钟,其振荡频率为1/(1.1RC);
INTR:
中断请求输出信号,当A/D转换结束时,INTR引脚输出低电平,只有当数据被取走后(单片机发出读数据指令),此引脚才会变为高电平;
VIN+和VIN-:
差动模拟电压输入端,若输入为单端正电压,VIN-应接地,若差动输入,则输入信号直接加入VIN+和VIN-;
AGND.DGND:
模拟信号地与数字信号地,若系统对抗干扰要求严格,则这两条地线必须分接
地;
VREF/2:
参考电压值的一半,若在ADC0804组成的电路中需要的参考电压为5V,则此引脚可以悬空。
若电路中需要使用的参考电压小于5V,即参考电压值的一半小于2.5V,这时可将此引脚连接到需要的参考电压值(如4V)的1/2电压值上(如2V),在ADC0804芯片内部会自动判断参考电压的选择,当VREF/2引脚的电压值低于2.5V时,芯片会自动选择由VREF/2引脚电压放大2倍以后的电压值作为参考电压。
DB0-DB7:
8位数字输出端。
2.LCD1602液晶介绍
1602字符型LCD有16个引脚,其芯片实物图和引脚图如下:
1602字符型LCD具有较丰富的指令集,如下表:
下面介绍LCD1602引脚功能:
VSS:
电源地;
VDD:
+5V逻辑电源;
VEE:
液晶驱动电源;
RS:
寄存器选择(RS=1,数据;
RS=0,命令);
R/W:
读.写操作选择(R/W=1,读;
R/W=0,写);
E:
使能信号;
DB0-DB7:
数据总线;
Black1:
背光电源线;
Black2:
背光电源地线;
二.数字电压表仿真图
三.实验设计原理
1.实验硬件设备:
LCD1602液晶显示器一块,ADC0804芯片一片,两个滑动变阻器,一个150pF电容,两个200欧姆的电阻,一个10K欧姆的电阻,STC89C51芯片,电源,地线,按键(复位电路和晶振电路另加),杜邦线诺干。
2.ADC0804在使用时,外围电压的连接比较简单,只需要对参考电压和时钟输入端进行设计即可。
通常情况下,时钟的输入可以选用RC谐振电路,ADC0804可以进行A/D转换的时钟频率为100—1460KHZ,典型值为640KHZ,这里选用R=10K欧姆.C=150PF的谐振电路,利用公式1/(1.1RC)计算后,此时的时钟频率约为606KHZ,与典型值十分接近。
3.模拟电压的计算:
这里选用的是8位A/D转换器,数值的变化范围是0—255(00H-FFH),模拟电压的输入范围是0-5V,每个数码的变化,对应的电压值的变化为0.0196V,所以要计算模拟电压值,就可以利用下面的公式进行计算:
V=D*0.0196
式中,V为计算出的模拟电压值,D为A/D转换器转换后的数字量。
4.克服浮点运算方法:
从上式不难看出,在计算过程,需要乘以一个0.0196,这是一个小数,在计算机中称为浮点数。
而对于8位单片机来说,不具有浮点运算能力,如果一定要计算浮点数,将占用单片机中大量的内存单元和CPU时间。
这里采用一种简单的方法:
就是将从A/D读取进来的数字量直接乘以196,即进行整数运算,运算结果是真正值的1000倍,这个整数运算的速度是非常快的,不会占用过多的CPU时间。
由于是两个8位的二进制数相乘,得到的结果不会超过16位二进制数。
5.电压值的显示:
最常用到的二进制转换成BCD码的方法是用除法。
先用得到的16位二进制数除以10000,得到的商就是模拟电压值的整数部分(模拟电压的输入为0-5V,所以整数部分只有1位),得到的余数是模拟电压值的小数部分;
接下来用余数除以1000,商是十分位,余数作为被除数再除以100,商为百分位,余数再除以10,商为千分位。
这样就将16位的二进制数转换成了4位BCD码。
四.数字电压表C语言程序
//珞珈09级通信单片机实验《AD转换器设计数字电压表》
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitlcd_rs=P2^0;
sbitlcd_en=P2^1;
sbitcs=P2^7;
//AD片选
sbitrd=P2^6;
sbitwr=P2^5;
sbitINTR=P3^2;
//中断请求信号
uinttemp,D1,D2,D3,D4;
uintshu;
uintAD_read();
voiddelay(uintz);
voidwrite_com(ucharcom);
voidwrite_date(uchardate);
voidlcd_init();
voiddisplay(ucharqian,ucharbai,ucharshi,ucharge);
voidAD_init();
voidAD_start();
voidmain()
{
write_com(0x01);
//清屏
lcd_init();
AD_init();
while
(1)
{
AD_start();
while(INTR==1);
//AD转换是否结束,结束为低电平
INTR=0;
shu=AD_read();
shu=shu*196;
D1=shu/10000;
//整数部分,0.0196v是最小变化量
shu=shu%10000;
D2=shu/1000;
//十分位数
shu=shu%1000;
D3=shu/100;
//百分位数
shu=shu%100;
D4=shu/10;
//千分位数
display(D1,D2,D3,D4);
//显示LcD1602
}
}
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(ucharcom)
P0=com;
lcd_rs=0;
lcd_en=1;
lcd_en=0;
delay
(2);
voidwrite_shu(ucharshu)
P0=shu;
lcd_rs=1;
delay(5);
voidlcd_init()
write_com(0x06);
//指针加减与移动
write_com(0x0c);
//光标
write_com(0x38);
//液晶初始化命令
voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)
{
write_com(0x80+0x02);
write_shu('
G'
);
write_com(0x80+0x03);
u'
write_com(0x80+0x04);
o'
write_com(0x80+0x06);
L'
write_com(0x80+0x07);
v'
write_com(0x80+0x09);
C'
write_com(0x80+0x0a);
h'
write_com(0x80+0x0b);
a'
write_com(0x80+0x0c);
write_com(0x80+0x44);
write_shu(0x30+qian);
//0x30代表数字0
write_com(0x80+0x45);
.'
write_com(0x80+0x46);
write_shu(0x30+bai);
write_com(0x80+0x47);
write_shu(0x30+shi);
write_com(0x80+0x48);
write_shu(0x30+ge);
write_com(0x80+0x49);
V'
voidAD_init()//AD初始化函数
cs=1;
wr=1;
rd=1;
}
voidAD_start()//AD启动
{P1=0xff;
cs=0;
//开
wr=0;
//写完后关闭
uintAD_read()
rd=0;
delay
(1);
temp=P1;
return(temp);
人间处处单片机!