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

QQ登錄

只需一步,快速開始

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

ADC0809+51單片機(jī)采集0-5v模擬量

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
純?cè)瓌?chuàng),此篇只在51黑電子論壇發(fā)過(guò),所以不用擔(dān)心重復(fù)。

內(nèi)容:已知有ADC0809模數(shù)轉(zhuǎn)換器,有一模擬電壓0—5V,電壓高低有電位器控制。
功能:1.使用51單片機(jī)完成設(shè)計(jì)。
                  2.使用0809上的IN3采集模擬電壓值。
                 3.將采集到的電壓值用3位數(shù)碼管顯示,整數(shù)位占1位,顯示小數(shù)點(diǎn),小數(shù)占兩位。
                 4.0809轉(zhuǎn)換的結(jié)果以區(qū)間的方式用8LED顯示。
      原理圖:

      代碼如下:
  1. /**************************************/
  2. /*                  功能:ADC轉(zhuǎn)換與顯示               */
  3. /*                    AD芯片:ADC0809                  */
  4. /*                    控制器:AT89C52                   */
  5. /*                  主時(shí)鐘頻率:12MHz                  */
  6. /*                     作者:溫爾暖                      */
  7. /*                   QQ:648232352                    */
  8. /**************************************/

  9. /******************調(diào)用頭文件*******************/
  10. #include "reg52.h"
  11. #include "intrins.h"

  12. /*****************定義地址**********************/
  13. sbit KEY   = P1^0;            //按鍵
  14. sbit ADD_C = P1^2;
  15. sbit ADD_B = P1^3;
  16. sbit ADD_A = P1^4;            // 選輸入口

  17. sbit CLK =   P1^5;            // 時(shí)鐘
  18. sbit START = P1^6;            // 轉(zhuǎn)換啟動(dòng)信號(hào)
  19. sbit EOC =   P1^7;            // 轉(zhuǎn)換結(jié)束信號(hào)
  20. sbit OE =    P1^1;            // 輸出允許信號(hào)

  21. /*****************定義全局變量********************/
  22. int flag = 0;

  23. /*****************數(shù)碼管段碼**********************/
  24. unsigned char code DUAN[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};    //不帶小數(shù)點(diǎn)
  25. unsigned char code DUAN1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};   //帶小數(shù)點(diǎn)

  26. /*****************電壓值區(qū)間******************/
  27. float JS[] = {0,62.5,125,187.5,250,312.5,375,437.5,500};
  28. /*******************讀ADC*******************/
  29. void read_adc(void)
  30. {
  31.                 START = 0;
  32.                 _nop_();
  33.                 START = 1;
  34.                 _nop_();
  35.                 START = 0;
  36.                 while(EOC==0);
  37.                 OE=1;
  38. }

  39. /*****************AD值區(qū)間計(jì)算*********************/
  40. int LED_JS(float AD)
  41. {
  42.         int t0 = 0;
  43.         int i = 0;
  44.         for(; i<8 ;i++)
  45.         {
  46.                 if(AD >= JS[i])
  47.                         if(AD <= JS[i+1])
  48.                                 t0 = i;
  49.         }
  50.         return t0+1;
  51. }

  52. /*****************不精確延時(shí)**********************/
  53. void delay_ms(int i)
  54. {
  55.         int j=0;
  56.         while(i--)
  57.         {
  58.                 for(j=0;j<120;j++);
  59.         }
  60. }

  61. /*****************數(shù)碼管顯示**********************/
  62. void display1(unsigned char ADC1_PORT)
  63. {
  64.         int AD1 = ADC1_PORT * 500.0/255.0;
  65.         P2 = 0xFD;   P0 = DUAN1[AD1/100];     delay_ms(5);     // 位選:P2^1  個(gè)位
  66.         P2 = 0xFB;   P0 = DUAN[(AD1/10)%10];  delay_ms(5);     // 位選:P2^2  小數(shù)點(diǎn)后一位
  67.         P2 = 0xF7;   P0 = DUAN[AD1%10];       delay_ms(5);     // 位選:P2^3  小數(shù)點(diǎn)后兩位
  68. }

  69. /*****************LED顯示**********************/
  70. void display2(unsigned char ADC2_PORT)
  71. {
  72.         float AD2 = ADC2_PORT * 1.96;
  73.         P2 = 0xFF;                  // 清屏
  74.   switch(LED_JS(AD2))
  75.         {
  76.                 case 1: P0 = 0xff; break;
  77.                 case 2: P0 = 0xfe; break;
  78.                 case 3: P0 = 0xfc; break;
  79.                 case 4: P0 = 0xf8; break;
  80.                 case 5: P0 = 0xe0; break;
  81.                 case 6: P0 = 0xc0; break;
  82.                 case 7: P0 = 0x80; break;
  83.                 case 8: P0 = 0x00; break;
  84.                 default:P0 = 0xef;
  85.         }
  86. }

  87. /*******************初始化*******************/
  88. void init()
  89. {
  90.         
  91.         ADD_C=0;
  92.         ADD_B=1;
  93.         ADD_A=1;           // 選擇第三通道
  94.         
  95.         CLK=0;             //時(shí)鐘
  96.         START=1;           // 內(nèi)部寄存器清零
  97.         EOC=1;             // 轉(zhuǎn)換結(jié)束
  98.         OE=0;              // 使能
  99.         
  100.         TMOD=0x02;      // 0000_0010 8位 0~255
  101.         TH0=200;
  102.         TL0=200;        // 裝載初值
  103.         EA=1;           // 開總中斷
  104.         ET0=1;          // 開定時(shí)器中斷
  105.         TR0=1;          // 開定時(shí)器
  106. }

  107. /****************mAin函數(shù)*******************/
  108. void main()
  109. {
  110.         init();         // 初始化
  111.         while(1)
  112.         {
  113.                 if(KEY == 0)               // 檢測(cè)到按鍵
  114.                 {
  115.                         delay_ms(5);             // 防抖
  116.                         if(KEY == 0)
  117.                         {
  118.                                 while(!KEY);           // 等松手
  119.                                 flag ++;               // 加1
  120.                                 flag &= 0x01;          // 與0x01相與 保證每次進(jìn)入flag都為0或1
  121.                         }
  122.                 }
  123.                
  124.                 if(flag == 0)
  125.                 {
  126.                         read_adc();
  127.                         display1(P3);
  128.                         OE=0;
  129.                 }
  130.                
  131.                 if(flag == 1)
  132.                 {               
  133.                         read_adc();
  134.                         display2(P3);
  135.                         OE=0;
  136.                 }
  137.         }
  138. }

  139. /****************中斷服務(wù)程序*******************/
  140. void TIM0_Serves() interrupt 1         // 用于產(chǎn)生CLK
  141. {
  142.         CLK = !CLK;
  143. }
復(fù)制代碼





評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:299034 發(fā)表于 2020-4-11 23:14 | 只看該作者
看到Proteus還以為有人能使用在Proteus中帶ADC的單片機(jī)仿真。。QWQ
害,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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