找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6099|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)+ADC0809自動(dòng)檔程數(shù)字電壓表Proteus仿真程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:849310 發(fā)表于 2020-12-13 11:10 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

基本功能
利用51單片機(jī)作為主控芯片,模擬量輸入范圍直流0v-5v。模擬量經(jīng)A/D(ADC0809)模數(shù)轉(zhuǎn)換芯片,把模擬量轉(zhuǎn)換為數(shù)字量輸入到單片機(jī)的P0口,再由單片機(jī)控制LCD1602液晶顯示模擬量輸入的電壓值。
1.1.2主要技術(shù)參數(shù)
測(cè)量電壓范圍:0v至5v
A/D轉(zhuǎn)換器:ADC0809(8位模數(shù)轉(zhuǎn)換器)。
顯示方式: LCD1602液晶
1.2設(shè)計(jì)原理
此次設(shè)計(jì)的是數(shù)字電壓表,要求的電壓范圍是0~5v。系統(tǒng)設(shè)計(jì)主要包括四個(gè)部分:分別是電源模塊、AD模數(shù)轉(zhuǎn)換部分、51單片機(jī)最小系統(tǒng)部分、數(shù)碼管顯示部分。首先由單片機(jī)初始化ADC0809模數(shù)轉(zhuǎn)換芯片和共陰數(shù)碼管顯示,當(dāng)外接被測(cè)電壓后,ADC0809將模擬電壓信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)輸入到單片機(jī)的I/O口,通過(guò)單片機(jī)處理后將電壓的大小顯示在LCD1602液晶上面。


硬件設(shè)計(jì)與原理
以AT89C51單片機(jī)為核心,起著控制作用。系統(tǒng)包括LCD1602液晶顯示電路、復(fù)位電路、時(shí)鐘電路、模數(shù)轉(zhuǎn)換電路電路。設(shè)計(jì)思路分為五個(gè)模塊:復(fù)位電路、晶振電路模塊、AT89C51、LCD1602液晶顯示電路、模數(shù)轉(zhuǎn)換器電路這五個(gè)模塊。


軟件設(shè)計(jì)的組成
該系統(tǒng)由延時(shí)子函數(shù)、LCD1602液晶忙檢測(cè)子函數(shù)、LCD1602液晶寫(xiě)命令/寫(xiě)數(shù)據(jù)子函數(shù)、漢字顯示子函數(shù)、LCD1602液晶顯示字符串子函數(shù)、LCD1602液晶初始化子函數(shù)、ADC0809轉(zhuǎn)換子函數(shù)、主函數(shù)和數(shù)據(jù)定義這幾部分組成。


自動(dòng)檔程電壓表的單片機(jī)源程序如下:
  1. #include <AT89X52.H>

  2. #define LEDDATA P0
  3. #define v20_on {s3=0;s2=0;s1=1;} //宏定義不同量程,不同的開(kāi)關(guān)狀態(tài)
  4. #define v2_on {s3=0;s2=1;s1=0;}
  5. #define v02_on {s3=1;s2=0;s1=0;}
  6. unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  7. unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
  8. unsigned char getdata;
  9. unsigned long temp;
  10. unsigned char i,k,l,m;
  11. unsigned char code  mytable0[]=" Welcome to use  ";
  12. unsigned char code  mytable1[]="Auto Voltmeter!";
  13. unsigned char code line0[]="  Voltmeter   ";    //初始化顯示
  14. unsigned char code line1[]=" Value:     V ";
  15. //引腳定義
  16. sbit lcdrs=P2^0;
  17. sbit lcden=P2^1;                                                        
  18. sbit s3=P3^7;  
  19. sbit s2=P3^6;
  20. sbit s1=P3^5;
  21. sbit OE=P3^0;
  22. sbit EOC=P3^1;
  23. sbit ST=P3^2;

  24. void delay(unsigned int z)      //延時(shí)子函數(shù)  z*1ms
  25. {
  26.         unsigned int x,y;
  27.         for(x=z;x>0;x--)
  28.                 for(y=110;y>0;y--);
  29. }
  30. void write_com(unsigned char c)   //寫(xiě)命令子函數(shù)
  31. {
  32.         lcdrs=0;                //低電平選擇為 寫(xiě)指令
  33.         lcden=0;               
  34.         LEDDATA=c;                   //把指令寫(xiě)入P0口
  35.         delay(5);               //參考時(shí)序圖
  36.         lcden=1;                //開(kāi)使能
  37.         delay(5);               //讀取指令
  38.         lcden=0;                //關(guān)閉使能         
  39. }

  40. void write_data(unsigned char d)  //寫(xiě)數(shù)據(jù)子函數(shù)
  41. {
  42.         lcdrs=1;             //高電平選擇為 寫(xiě)數(shù)據(jù)
  43.         LEDDATA=d;                //把數(shù)據(jù)寫(xiě)入P0口
  44.         delay(5);            //參考時(shí)序圖
  45.         lcden=1;             //開(kāi)使能
  46.         delay(5);            //讀取數(shù)據(jù)
  47.         lcden=0;                 //關(guān)閉使能
  48. }
  49. void initialize()      //LCD初始化函數(shù)
  50. {   
  51.     unsigned char num;
  52.         lcden=0;
  53.         write_com(0x38);   //設(shè)置16x2顯示,5x7點(diǎn)陣顯示,8位數(shù)據(jù)接口
  54.         write_com(0x0c);   //00001DCB,D(開(kāi)關(guān)顯示),C(是否顯示光標(biāo)),B(光標(biāo)閃爍,光標(biāo)不顯示)
  55.         write_com(0x06);   //000001N0,N(地址指針+-1)
  56.         write_com(0x01);      //清屏指令  每次顯示下一屏內(nèi)容時(shí),必須清屏            
  57.         write_com(0x80+0x10);           //第一行,頂格顯示                           
  58.         for(num=0;num<17;num++)        
  59.         {
  60.                 write_data(mytable0[num]);
  61.                 delay(10);
  62.         }
  63.         write_com(0x80+0x50);           //第二行,從第一格開(kāi)始顯示
  64.         for(num=0;num<15;num++)      
  65.         {
  66.                 write_data(mytable1[num]);
  67.                 delay(10);
  68.         }
  69.                 for(num=0;num<16;num++)
  70.         {
  71.                 write_com(0x1c);   //0001(S/C)(R/L)**;  S/C:高電平移動(dòng)字符,低電平移動(dòng)光標(biāo);  R/L:高電平左移,低電平右移
  72.                 delay(300);
  73.         }
  74.            delay(1000);
  75.                      
  76.         write_com(0x01);      //清屏指令  每次顯示下一屏內(nèi)容時(shí),必須清屏
  77.         write_com(0x80);                                    
  78.         for(num=0;num<14;num++)     
  79.         {
  80.                 write_data(line0[num]);
  81.                 delay(10);
  82.         }

  83.         write_com(0x80+0x40);         
  84.         for(num=0;num<15;num++)        
  85.         {
  86.                 write_data(line1[num]);
  87.                 delay(10);
  88.         }         
  89. }
  90. void value(unsigned char add,unsigned char dat)   
  91. {        
  92.          write_com(0x80+0x47+add);
  93.          if(l==3&&add==2||l!=3&&add==1)
  94.            {
  95.               write_data(0x2e);
  96.            }
  97.          else
  98.            {
  99.               write_data(0x30+dat);
  100.            }        
  101. }
  102. main()
  103. {
  104.    initialize();
  105.    while(1)
  106. _20v:
  107.      {
  108.        v20_on;                  
  109.        ST=0;                  
  110.        ST=1;
  111.        ST=0;   
  112.           while(EOC==0);
  113.           OE=1;
  114.                   getdata=P1;
  115.           OE=0;
  116.                    if(getdata<21)            
  117.            {
  118.              goto _2v;
  119.            }
  120.                   l=3;
  121.               temp=getdata;      
  122.           temp=(temp*1000/51)/2;
  123.                   goto disp;

  124. _2v:                          
  125.          v2_on;
  126.           ST=0;
  127.           ST=1;
  128.           ST=0;   
  129.           while(EOC==0);
  130.            OE=1;
  131.            getdata=P1;
  132.            OE=0;
  133.            if(getdata<21)
  134.            {
  135.              goto _02v;
  136.            }
  137.            else if(getdata>204)
  138.            {
  139.              goto _20v;
  140.            }
  141.            l=2;
  142.            temp=getdata;
  143.            temp=(temp*1000/51)/2;
  144.            goto disp;

  145. _02v:                     
  146.           v02_on;
  147.           ST=0;
  148.           ST=1;
  149.           ST=0;   
  150.           while(EOC==0);
  151.            OE=1;
  152.            getdata=P1;
  153.            OE=0;
  154.           if(getdata>204)
  155.            {
  156.              goto _2v;
  157.            }
  158.            l=1;
  159.            temp=getdata;
  160.            temp=(temp*1000/51)/2;
  161.                    m=temp%10;
  162.                    if(m>5){temp=temp/10+1;}
  163.                    else{temp=temp/10;}
  164.                    goto disp;

  165. disp:          for(i=0;i<=3;i++)         
  166.              {
  167.                dispbuf[i]=temp%10;
  168.                temp=temp/10;  
  169.              }
  170.                   if(l==3)
  171.                     {
  172.                            for(i=4;i>=3;i--)        
  173.                            dispbuf[i]=dispbuf[i-1];
  174.                     }
  175.                   else
  176.                    {
  177.                           dispbuf[4]=dispbuf[3];
  178.                    }
  179.               for(k=0;k<5;k++)            
  180.            {
  181.                       value(k,dispbuf[4-k]);
  182.                }
  183.                  if(l==2){goto _2v;}
  184.                  else if(l==1){goto _02v;}
  185.           }
  186. }
復(fù)制代碼

Keil代碼與Proteus8.13仿真下載:
基于51單片機(jī)數(shù)字電壓表的設(shè)計(jì).7z (3.8 MB, 下載次數(shù): 160)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

5#
ID:537530 發(fā)表于 2023-10-7 12:18 | 只看該作者
整個(gè)電路設(shè)計(jì)思路不錯(cuò)。但是子電路似乎有問(wèn)題,內(nèi)部運(yùn)放是+-12V和+-5V供電,但是輸入最大可達(dá)20V,仿真軟件要
回復(fù)

使用道具 舉報(bào)

地板
ID:537530 發(fā)表于 2023-10-6 02:53 | 只看該作者
12345;;; 發(fā)表于 2023-5-29 21:11
ADC0808右上角 CLOCK連接的那個(gè)叫什么?

時(shí)鐘,一般設(shè)置為500kHz就可以了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1080656 發(fā)表于 2023-5-29 21:11 | 只看該作者
ADC0808右上角 CLOCK連接的那個(gè)叫什么?
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:828888 發(fā)表于 2023-4-22 16:05 | 只看該作者
用Proteus8.13打開(kāi)
回復(fù)

使用道具 舉報(bào)

樓主
ID:284050 發(fā)表于 2020-12-16 20:38 | 只看該作者
實(shí)際應(yīng)用中,基準(zhǔn)電壓5V怎么獲得呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表