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

QQ登錄

只需一步,快速開始

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

單片機(jī)自動(dòng)換擋電壓表仿真與源程序 ADC0809+1602顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)電壓表仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

word格式的詳細(xì)教程(實(shí)驗(yàn)指導(dǎo)):

A/D芯片ADC0809的應(yīng)用原理;
1602數(shù)字字符液晶模塊的應(yīng)用原理
自動(dòng)換擋數(shù)字電壓表就是一個(gè)能自動(dòng)切換擋程的數(shù)字電壓表,可以測(cè)量0~20V的電壓,并且有0~0.2V、0~2V和0~20V三個(gè)擋程可供選擇,當(dāng)待測(cè)量電壓值發(fā)生變化之后,電壓表可以根據(jù)輸入電壓的情況自動(dòng)選擇合適的擋程進(jìn)行測(cè)量,并且把測(cè)量結(jié)果顯示出來(lái)。


單片機(jī)源程序如下:
  1. #include <AT89X52.H>
  2. #define LEDDATA P0 //LCD連接引腳
  3. #define v20_on {s3=0;s2=0;s1=1;} //宏定義不同量程,不同的開關(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;        //RS端
  17. sbit lcden=P2^1;    //E使能端                                       
  18. sbit s3=P3^7;             //地址輸入引腳,用于選擇輸入通道
  19. sbit s2=P3^6;           //通道s1,s2,s3
  20. sbit s1=P3^5;
  21. sbit OE=P3^0;            //輸出允許控制端,用于打開三態(tài)數(shù)據(jù)輸出鎖存器
  22. sbit EOC=P3^1;          //轉(zhuǎn)換結(jié)束信號(hào)輸出引腳,開始轉(zhuǎn)換時(shí)為低電平,當(dāng)轉(zhuǎn)換結(jié)束時(shí)為高電平
  23. sbit ST=P3^2;    //ADC中start開始,時(shí)鐘信號(hào)輸入引腳

  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)   //寫命令子函數(shù)
  31. {
  32.         lcdrs=0;                //低電平選擇為 寫指令
  33.         lcden=0;               
  34.         LEDDATA=c;               //把指令寫入P0口
  35.         delay(5);               //參考時(shí)序圖
  36.         lcden=1;                //開使能
  37.         delay(5);               //讀取指令
  38.         lcden=0;                //關(guān)閉使能         
  39. }

  40. void write_data(unsigned char d)  //寫數(shù)據(jù)子函數(shù)
  41. {
  42.         lcdrs=1;             //高電平選擇為 寫數(shù)據(jù)
  43.         LEDDATA=d;                //把數(shù)據(jù)寫入P0口
  44.         delay(5);            //參考時(shí)序圖
  45.         lcden=1;             //開使能
  46.         delay(5);            //讀取數(shù)據(jù)
  47.         lcden=0;                 //關(guān)閉使能
  48. }
  49. void initialize()      //LCD初始化函數(shù)
  50. {   
  51.     unsigned char num;
  52.         lcden=0;           //關(guān)閉使能
  53.         write_com(0x38);   //設(shè)置16x2顯示,5x7點(diǎn)陣顯示,8位數(shù)據(jù)接口
  54.         write_com(0x0c);   //00001DCB,D(開關(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);           //第二行,從第一格開始顯示         
  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)   //測(cè)試電壓值
  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();        //LCD顯示屏初始化
  105.    while(1)
  106. _20v:
  107.      {
  108.        v20_on;    //選擇通道s1              
  109.        ST=0;                  
  110.        ST=1;
  111.        ST=0;   
  112.           while(EOC==0); //轉(zhuǎn)換結(jié)束信號(hào)輸出引腳,開始轉(zhuǎn)換時(shí)為低電平
  113.           OE=1;                  //輸出允許控制端,用于打開三態(tài)數(shù)據(jù)輸出鎖存器
  114.                   getdata=P1;           //將p1口值經(jīng)過轉(zhuǎn)換賦給getdata
  115.           OE=0;                  //關(guān)閉三態(tài)數(shù)據(jù)輸出鎖存器
  116.                    if(getdata<21)            
  117.            {
  118.              goto _2v;
  119.            }
  120.                   l=3;                //v20_on {s3=0;s2=0;s1=1;}
  121.                             //l=3表示第3位,s1通道
  122.               temp=getdata;      
  123.           temp=(temp*1000/51)/2;
  124.                   goto disp;

  125. _2v:                        
  126.          v2_on;           //通道s2  
  127.           ST=0;
  128.           ST=1;
  129.           ST=0;   
  130.           while(EOC==0);   //開始轉(zhuǎn)換
  131.            OE=1;
  132.            getdata=P1;
  133.            OE=0;
  134.            if(getdata<21)
  135.            {
  136.              goto _02v;
  137.            }
  138.            else if(getdata>200)
  139.            {
  140.              goto _20v;
  141.            }
  142.            l=2;          //v2_on  {s3=0;s2=1;s1=0;}
  143.                           // l=2表示第2位,s2通道
  144.            temp=getdata;
  145.            temp=(temp*1000/51)/2;
  146.            goto disp;

  147. _02v:                    
  148.           v02_on;        //通道s3
  149.           ST=0;
  150.           ST=1;
  151.           ST=0;   
  152.           while(EOC==0);
  153.            OE=1;
  154.            getdata=P1;
  155.            OE=0;
  156.           if(getdata>200)
  157.            {
  158.              goto _2v;
  159.            }
  160.            l=1;           //v02_on {s3=1;s2=0;s1=0;}
  161.                           // l=1表示第1位,s3通道
  162.            temp=getdata;
  163.            temp=(temp*1000/51)/2;
  164.                    m=temp%10;
  165.                    if(m>5){temp=temp/10+1;}
  166.                    else{temp=temp/10;}
  167.                    goto disp;

  168. disp:          for(i=0;i<=3;i++)         
  169. ……………………

  170. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

全部資料51hei下載地址:
自動(dòng)換擋電壓表.rar (4.13 MB, 下載次數(shù): 307)


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

使用道具 舉報(bào)

沙發(fā)
ID:258584 發(fā)表于 2018-1-30 17:03 | 只看該作者
我想問下,如何更改電壓表的量程,還有如何算出它的最大量程
回復(fù)

使用道具 舉報(bào)

板凳
ID:273292 發(fā)表于 2018-1-30 21:12 | 只看該作者
Mark一波,沒準(zhǔn)能用到呢,哈哈
回復(fù)

使用道具 舉報(bào)

地板
ID:294541 發(fā)表于 2018-3-20 15:26 | 只看該作者
我想說,壓縮包下載不下來(lái)怎么辦?
回復(fù)

使用道具 舉報(bào)

5#
ID:301797 發(fā)表于 2018-4-8 00:29 | 只看該作者
下載了 試運(yùn)行不了 不過哦還是謝謝樓主的辛苦勞動(dòng)
回復(fù)

使用道具 舉報(bào)

6#
ID:428824 發(fā)表于 2018-12-18 10:56 | 只看該作者
樓主,為啥我下載下來(lái),proteus仿真錯(cuò)誤。。。
還有那個(gè)EDA文件是不是PCB呀,能不能給我破解下,我剛好課程設(shè)計(jì)是這個(gè)。。
回復(fù)

使用道具 舉報(bào)

7#
ID:447922 發(fā)表于 2018-12-18 14:30 | 只看該作者
謝謝大佬
回復(fù)

使用道具 舉報(bào)

8#
ID:273035 發(fā)表于 2019-1-7 10:06 來(lái)自手機(jī) | 只看該作者
感謝的分享
回復(fù)

使用道具 舉報(bào)

9#
ID:272434 發(fā)表于 2019-1-7 15:36 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:283315 發(fā)表于 2019-1-8 10:10 | 只看該作者
大佬 原理圖仿真有錯(cuò)怎么破啊
回復(fù)

使用道具 舉報(bào)

11#
ID:106422 發(fā)表于 2019-1-8 12:18 | 只看該作者
學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

12#
ID:459513 發(fā)表于 2019-1-19 16:51 | 只看該作者
請(qǐng)問樓主碰到過以下這種情況嗎?采集0—5V電壓,并用1602顯示時(shí),2.5V以下顯示正常,超過2.5V均顯示為0;怎么解決?
回復(fù)

使用道具 舉報(bào)

13#
ID:459513 發(fā)表于 2019-1-19 16:53 | 只看該作者
大佬碰到過這種情況嗎?2.5V以下顯示正常,超過2.5V均顯示為0;
回復(fù)

使用道具 舉報(bào)

14#
ID:659598 發(fā)表于 2019-12-9 14:29 來(lái)自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

15#
ID:659598 發(fā)表于 2019-12-9 15:37 | 只看該作者
韻墨星塵 發(fā)表于 2018-1-30 17:03
我想問下,如何更改電壓表的量程,還有如何算出它的最大量程

你好,可以把下載的程序給我發(fā)一下嗎,感謝
回復(fù)

使用道具 舉報(bào)

16#
ID:1142899 發(fā)表于 2025-1-11 17:54 | 只看該作者
感謝的分享!感謝的分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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