adc0804数字电压表

AC-DC/DC-DC转换

116人已加入

描述

  一. 实验器件介绍

  1. ADC0804芯片介绍

  ADC0804是一个8位CMOS型逐次比较式A/D转换器,具有三态锁存输出功能,最短转换时间为100us,其芯片实物图和引脚图如下:


数字电压表

  CS:片选信号,低电平有效;

  RD:外部读取转换结果的控制信号,当RD为高电平时,DB0-DB7为高阻态;当RD为低电平

  时,数据才会通过DB0-DB7输出; WR:A/D转换器启动控制信号,当WR由高电平变为低电平时,转换器被清零,当WR由低电平变为高电平时,A/D转换正式开始;

  CLK IN和CLK R:时钟输入端,在ADC0804片内有时钟发生器,采用内部时钟时,在CLK IN CLK R 和地线之间连接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

  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》

  #define uchar unsigned char

  #define uint unsigned int

  sbit lcd_rs=P2^0; sbit lcd_en=P2^1;

  sbit cs=P2^7; //AD片选 sbit rd=P2^6; sbit wr=P2^5;

  sbit INTR=P3^2;//中断请求信号 uint temp,D1,D2,D3,D4; uint shu;

  uint AD_read();

  void delay(uint z);

  void write_com(uchar com); void write_date(uchar date); void lcd_init();

  void display(uchar qian,uchar bai,uchar shi,uchar ge); void AD_init(); void AD_start();

  void main() {

  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

  }

  }

  void delay(uint z) {

  uint x,y;

  for(x=z;x》0;x--)

  for(y=110;y》0;y--);

  }

  void write_com(uchar com) {

  P0=com;

  lcd_rs=0;

  lcd_en=1;

  lcd_en=0;

  delay(2);

  }

  void write_shu(uchar shu)

  {

  P0=shu;

  lcd_rs=1;

  lcd_en=1;

  lcd_en=0;

  delay(5); }

  void lcd_init() {

  lcd_en=0;

  write_com(0x01);//清屏

  write_com(0x06);//指针加减与移动

  write_com(0x0c);//光标

  write_com(0x38);//液晶初始化命令 }

  void display(uchar qian,uchar bai,uchar shi,uchar ge) {

  write_com(0x80+0x02);

  write_shu(‘G’);

  write_com(0x80+0x03);

  write_shu(‘u’);

  write_com(0x80+0x04);

  write_shu(‘o’);

  write_com(0x80+0x06);

  write_shu(‘L’);

  write_com(0x80+0x07);

  write_shu(‘v’);

  write_com(0x80+0x09);

  write_shu(‘C’);

  write_com(0x80+0x0a);

  write_shu(‘h’);

  write_com(0x80+0x0b);

  write_shu(‘a’);

  write_com(0x80+0x0c);

  write_shu(‘o’);

  write_com(0x80+0x44);

  write_shu(0x30+qian);//0x30代表数字0

  write_com(0x80+0x45);

  write_shu(‘。’);

  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);

  write_shu(‘V’);

  }

  void AD_init()//AD初始化函数 {

  cs=1; wr=1; rd=1; }

  void AD_start()//AD启动 {

  P1=0xff; cs=0;//开 wr=0;

  wr=1;//写完后关闭 cs=1; }

  uint AD_read() {

  cs=0; rd=0; delay(1);

  temp=P1;

  rd=1;

  cs=1;

  return(temp); }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
杨子由你玩赛艇 2019-05-03
0 回复 举报
电流表 收起回复
杨子由你玩赛艇 2019-05-03
0 回复 举报
求大神指导,如何将其改成电流变。量程0-1000mA  精度10mA. 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分