标题: ADC0804A/D转换器设计数字电压表设计报告与源码 [打印本页]

作者: xxmmba    时间: 2018-5-24 17:46
标题: ADC0804A/D转换器设计数字电压表设计报告与源码
用51单片机和ADC0804A/D转换器制作数字电压表

                 专业:通信工程
                 年级:2009级
                  学生:郭吕超
           目录
  
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位数字输出端。
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:背光电源地线;
式中,V为计算出的模拟电压值,D为A/D转换器转换后的数字量。
//珞珈09级通信单片机实验 《AD转换器设计数字电压表》
  1. #include<reg51.h>                                                            
  2. #define uchar unsigned char        
  3. #define uint unsigned int        
  4. sbit lcd_rs=P2^0;                                             
  5. sbit lcd_en=P2^1;                          
  6. sbit cs=P2^7; //AD片选                                
  7. sbit rd=P2^6;                              
  8. sbit wr=P2^5;
  9. sbit INTR=P3^2;//中断请求信号                                 
  10. uint  temp,D1,D2,D3,D4;      
  11. uint shu;
  12. uint AD_read();
  13. void delay(uint z);
  14. void write_com(uchar com);
  15. void write_date(uchar date);
  16. void lcd_init();
  17. void display(uchar qian,uchar bai,uchar shi,uchar ge);
  18. void AD_init();
  19. void AD_start();

  20. void main()
  21. {                           
  22.         write_com(0x01);//清屏
  23.         lcd_init();        
  24.                             AD_init              ();
  25.         while(1)
  26.         {

  27.                 AD_start();
  28.                                                         while(INTR==1);//AD转换是否结束,结束为低电平
  29.                                                           INTR=0;
  30.                                                         shu=AD_read();
  31.                 shu=shu*196;
  32.                D1=shu/10000;//整数部分,0.0196v是最小变化量
  33.                shu=shu%10000;
  34.                D2=shu/1000;//十分位数
  35.                shu=shu%1000;
  36.                D3=shu/100;//百分位数
  37.                shu=shu%100;
  38.                  D4=shu/10;//千分位数
  39.                 display(D1,D2,D3,D4);//显示LcD1602

  40.            }               
  41. }



  42. void delay(uint z)
  43. {
  44.         uint x,y;
  45.         for(x=z;x>0;x--)
  46.                 for(y=110;y>0;y--);
  47. }



  48. void write_com(uchar com)
  49. {
  50.         P0=com;
  51.         lcd_rs=0;
  52.         lcd_en=1;
  53.         lcd_en=0;
  54.          delay(2);
  55. }



  56. void write_shu(uchar shu)
  57. {
  58.         P0=shu;
  59.         lcd_rs=1;
  60.         lcd_en=1;
  61.         lcd_en=0;
  62.         delay(5);
  63. }



  64. void lcd_init()
  65. {


  66.         lcd_en=0;
  67.     write_com(0x01);//清屏
  68.   write_com(0x06);//指针加减与移动
  69.   write_com(0x0c);//光标
  70.   write_com(0x38);//液晶初始化命令

  71. }


  72. void display(uchar qian,uchar bai,uchar shi,uchar ge)
  73. {   
  74.               write_com(0x80+0x02);
  75.              write_shu('G');
  76.                write_com(0x80+0x03);
  77.              write_shu('u');
  78.                 write_com(0x80+0x04);
  79.              write_shu('o');
  80.                 write_com(0x80+0x06);
  81.              write_shu('L');
  82.                write_com(0x80+0x07);
  83.              write_shu('v');
  84.                 write_com(0x80+0x09);
  85.              write_shu('C');
  86.                  write_com(0x80+0x0a);
  87.              write_shu('h');
  88.                write_com(0x80+0x0b);
  89.              write_shu('a');
  90.                 write_com(0x80+0x0c);
  91.              write_shu('o');

  92.                write_com(0x80+0x44);
  93.              write_shu(0x30+qian);//0x30代表数字0

  94.                write_com(0x80+0x45);
  95.              write_shu('.');

  96.                 write_com(0x80+0x46);
  97.              write_shu(0x30+bai);
  98.                                                          
  99.                                                           write_com(0x80+0x47);
  100.              write_shu(0x30+shi);

  101.                                              write_com(0x80+0x48);
  102.              write_shu(0x30+ge);

  103.                                           write_com(0x80+0x49);
  104.              write_shu('V');
  105. }                       


  106.   void AD_init()//AD初始化函数
  107. {
  108.     cs=1;
  109.               wr=1;
  110.               rd=1;
  111.   }
  112.   void AD_start()//AD启动
  113. {              P1=0xff;
  114.     cs=0;//开
  115.               wr=0;
  116.               wr=1;//写完后关闭
  117.               cs=1;
  118. }
  119. uint AD_read()
  120. {
  121.     cs=0;
  122.               rd=0;
  123.               delay(1);
  124.               temp=P1;
  125.               rd=1;
  126.               cs=1;

  127.               return(temp);
  128. }
复制代码

人间处处单片机

完整的Word格式文档51黑下载地址:
用ADC0804制作的数字电压表.doc (1.3 MB, 下载次数: 35)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1