找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機Proteus仿真ADC0809數(shù)字電壓表程序設(shè)計

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:860283 發(fā)表于 2020-12-22 08:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
源碼加電路圖


單片機源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管顯示0-9的電平碼
  5. uint volt,vtime; //電壓值測定值
  6. uchar addr;//測量地址位
  7. sbit LW1=P2^3; //對應(yīng)第4個數(shù)碼管
  8. sbit LW2=P2^2; //對應(yīng)第3個數(shù)碼管
  9. sbit LW3=P2^1; //對應(yīng)第2個數(shù)碼管
  10. sbit LW4=P2^0; //對應(yīng)第1個數(shù)碼管
  11. sbit LW5=P1^4;//指示當(dāng)前顯示的是第幾個轉(zhuǎn)換值
  12. sbit CLK=P2^4; //時鐘信號
  13. sbit START=P2^5; //轉(zhuǎn)換啟動開關(guān)
  14. sbit EOC=P2^6;        //轉(zhuǎn)換結(jié)束標志
  15. sbit OE=P2^7;//定義ADC0809各腳
  16. /**********************************************************/
  17. //函數(shù)名:delay(uint x)
  18. //功能:延時程序 改變測量地址         
  19. //調(diào)用函數(shù):
  20. //輸入?yún)?shù):x
  21. //輸出參數(shù):
  22. //說明:程序的延時時間為x乘以0.5ms 每5s改變測量地址位
  23. /**********************************************************/
  24. void delay(uint x)
  25. {
  26.         uchar y,z;
  27.         for(y=x;y>0;y--)
  28.                 for(z=250;z>0;z--);//該步運行時間約為0.5ms
  29.                 vtime++;
  30.                 if(vtime==1000)
  31.                 {
  32.                         vtime=0;
  33.                         addr++;
  34.                         if(addr==3)         //本例子一共有3個測量輸入值,輪流讀取這3個值并轉(zhuǎn)換顯示
  35.                                 addr=0;//以上語句實現(xiàn)測量地址位的改變               
  36.                 }        
  37. }
  38. /**********************************************************/
  39. //函數(shù)名:ADC()
  40. //功能:數(shù)模轉(zhuǎn)換程序
  41. //調(diào)用函數(shù):
  42. //輸入?yún)?shù):
  43. //輸出參數(shù):
  44. //說明:將轉(zhuǎn)換好的測定值保存在變量volt中
  45. /**********************************************************/
  46. void ADC()
  47. {
  48.         EA=1;//開中斷

  49.         //確保進入正常AD轉(zhuǎn)換狀態(tài)?
  50.         START=0;
  51.         START=1;

  52.         START=0;//ad開始轉(zhuǎn)換               
  53.         while(EOC==0); //等待轉(zhuǎn)換結(jié)束
  54.         OE=1; //輸出數(shù)據(jù)標志為真
  55.         
  56.         EA=0;//關(guān)中斷
  57.         volt=P3;//獲取轉(zhuǎn)換值保存到volt中,(P3為轉(zhuǎn)換后數(shù)據(jù))
  58.         volt=volt*196;//轉(zhuǎn)換值處理 (例子的滿量程為5V,轉(zhuǎn)換分辯率為8位即最大值是255,5/255=196mV,即1代表196mV)
  59.         
  60.         OE=0;//輸出轉(zhuǎn)換結(jié)束 (要在獲取轉(zhuǎn)換值之后)
  61. }
  62. /**********************************************************/
  63. //函數(shù)名:display()
  64. //功能:4位數(shù)碼管顯示
  65. //調(diào)用函數(shù):delay(uint x)
  66. //輸入?yún)?shù):
  67. //輸出參數(shù):
  68. //說明:將處理后的電壓值顯示在4位數(shù)碼管上
  69. /**********************************************************/
  70. void display()
  71. {
  72.         P0=0xff;//消隱 (相當(dāng)于全部滅燈,清除上次顯示效果)
  73.         LW1=0;
  74.         P0=~led[volt/10000]&0x7f;//帶小數(shù)點1伏顯示位
  75.         delay(2);
  76.         P0=0xff;
  77.         LW1=1;
  78.         LW2=0;
  79.         P0=~led[(volt/1000)%10];//100毫伏顯示位
  80.         delay(2);
  81.         P0=0xff;
  82.         LW2=1;
  83.         LW3=0;
  84.         P0=~led[(volt/100)%10];//10毫伏顯示位
  85.         delay(2);
  86.         P0=0xff;
  87.         LW3=1;
  88.         LW4=0;
  89.         P0=~led[(volt/10)%10];//1毫伏顯示位
  90.         delay(2);
  91.         P0=0xff;
  92.         LW4=1;
  93.         LW5=0;
  94.         P0=~led[addr+1];//顯示電壓測量位
  95.         delay(2);
  96.         LW5=1;//指示當(dāng)前顯示的是第幾個轉(zhuǎn)換值                                                               
  97. }
  98. /**********************************************************/
  99. //主程序
  100. /**********************************************************/
  101. void main()
  102. {
  103.         EA=1;//開總中斷                  
  104.     TMOD=0x01;//設(shè)定定時計數(shù)工作方式
  105.         //為定時器初賦值
  106.         TH0=0XFF;
  107.     TL0=0XB4;

  108.         ET0=1;//開定時器0中斷
  109.         TR0=1;//開啟定時器0
  110.         while(1)
  111.         {
  112.                 P1=addr;//裝入測量地址
  113.                 LW5=1;
  114.                 ADC();//調(diào)用模數(shù)轉(zhuǎn)換程序
  115.                 display();//調(diào)用顯示程序
  116.         }
  117. }
  118. /**********************************************************/
  119. //函數(shù)名:timer() interrupt 1
  120. //功能:定時中斷0響應(yīng)程序
  121. //調(diào)用函數(shù):
  122. //輸入?yún)?shù):
  123. //輸出參數(shù):
  124. //說明:為ADC提供時鐘信號
  125. /**********************************************************/
  126. void timer() interrupt 1
  127. {
  128.         //初值重置
  129.         TH0=0XFF;
  130.     TL0=0XF0;
  131.         CLK=~CLK;//取反 產(chǎn)生時鐘信號
  132. }
復(fù)制代碼

仿真代碼51hei提供下載:
數(shù)字電壓表(ADC0809)-2.rar (47.83 KB, 下載次數(shù): 70)

評分

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

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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