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

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)ADC0832轉(zhuǎn)換MQ3酒精傳感器OLED顯示程序與Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
如果仿真打不開,把Proteus升級(jí)到8.13版本。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<oled.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. uchar Get_AD_Result();   //模數(shù)轉(zhuǎn)換結(jié)果
  7. uint boundaries=80;//初始酒精報(bào)警設(shè)定為80
  8. uint vt;
  9. uchar AD;
  10. uint x,y;

  11. //ADC0832引腳定義
  12. sbit CS   = P1^0;
  13. sbit CLK  = P1^2;
  14. sbit DIDO = P1^1;
  15. sbit K1 = P2^2;
  16. sbit K2 = P2^3;
  17. sbit LEDR=P0^0;
  18. sbit Beep=P2^7;

  19. void Delayms(unsigned int n)//延時(shí)函數(shù)
  20. {
  21. unsigned int i,j;
  22. for(j=n;j>0;j--)
  23. for(i=112;i>0;i--);
  24. }

  25. void main()                        
  26. {         
  27.    OLED_Init();//初始化OLED
  28.          OLED_ColorTurn(0);//0正常顯示,1 反色顯示
  29.    OLED_DisplayTurn(1);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示
  30.         
  31.          OLED_ShowChinese(0,0,0,16);
  32.          OLED_ShowChinese(16,0,1,16);
  33.          OLED_ShowChinese(32,0,2,16);
  34.          OLED_ShowChinese(48,0,3,16);
  35.          OLED_ShowChinese(64,0,4,16);
  36.          OLED_ShowChinese(80,0,5,16);//顯示酒精濃度測(cè)試
  37.          Delayms(2000);
  38.          OLED_Clear();
  39.          OLED_ShowChinese(0,0,0,16);//顯示酒
  40.          OLED_ShowChinese(16,0,1,16);//顯示精
  41.          OLED_ShowChinese(0,2,6,16);//顯示設(shè)
  42.          OLED_ShowChinese(16,2,7,16);//顯示定
  43.          OLED_ShowString(32,0,":",16);//顯示:
  44.          OLED_ShowString(32,2,":",16);//顯示:
  45.          OLED_ShowString(88,2,"mg/ml",16);//顯示mg/ml
  46.          OLED_ShowString(88,0,"mg/ml",16);//顯示mg/ml

  47.    CLK = 0;      //ADC0832初始化
  48.    CS   = 1;   
  49.    while(1)
  50.          {
  51.           AD = Get_AD_Result();
  52.     vt = (500.0/256.0)*AD;//得到輸出電壓
  53.           x=(vt-3)/2.778;//酒精濃度
  54.           y=x/10;
  55.           OLED_ShowNum(40,0,x,3,16);//顯示整數(shù)
  56.           OLED_ShowNum(72,0,y,1,16);//顯示小數(shù)
  57.           OLED_ShowString(64,0,".",16);//顯示小數(shù)點(diǎn)
  58.           OLED_ShowNum(40,2,boundaries,3,16);//顯示設(shè)定值
  59.                 if(x>=boundaries)//酒精濃度大于等于設(shè)定,蜂鳴器響,紅燈亮
  60.                 {
  61.                         Beep=0;
  62.                         LEDR=0;
  63.                 }
  64.                 else//酒精濃度小于設(shè)定值,蜂鳴器不響,紅燈不亮
  65.                 {
  66.           Beep=1;
  67.                 LEDR=1;
  68.                 }
  69.                
  70.                 if(K1==0)//按下K1時(shí),設(shè)定值減1
  71.                 {
  72.                         Delayms(15);//消抖
  73.                         if(K1==0)
  74.                         {
  75.                          boundaries--;
  76.                         }
  77.                  while(!K1);//判斷K1是否彈起
  78.                 }
  79.                  
  80.                 if(K2==0)//按下K2時(shí),設(shè)定值減+
  81.                 {
  82.                         Delayms(15);//消抖
  83.                         if(K2==0)
  84.                         {
  85.                                 boundaries++;
  86.                         }
  87.                  while(!K2);//判斷K2是否彈起
  88.                 }
  89.          }
  90. }





  91. //------------------------------
  92. //     獲取AD轉(zhuǎn)換結(jié)果(0通道)
  93. //------------------------------
  94. uchar Get_AD_Result()         //包含11個(gè)CLK下降沿      
  95. {
  96.     uchar i, dat;
  97.     CS = 1;              //ADC0832未工作時(shí),CS端為高電平,此時(shí)芯片禁用
  98.     _nop_;               //對(duì)于延時(shí)很短的,要求在us級(jí)的,采用“_nop_”函數(shù)      
  99.     CLK =1;                  
  100.     CS = 0;
  101.     DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一個(gè)下降沿來到時(shí),DI = 1啟動(dòng)ADC0832
  102.     DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二個(gè)下降沿
  103.     DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三個(gè)下降沿,發(fā)送1,0選擇通道cho
  104.     DIDO = 1;                                //釋放總線
  105.     for(i = 0; i < 8; i++)                  //第4個(gè)下降沿到第11個(gè)下降沿
  106.     {
  107.         CLK = 0;                           //clk處于下降沿,每一個(gè)下降沿DO端輸入下一個(gè)
  108.         _nop_;                              //對(duì)于延時(shí)很短的,要求在us級(jí)的,采用_nop_函數(shù)      
  109.         if(DIDO) dat |= 0x01;              // dat = dat | 0x01,dat和0x01做“或”的運(yùn)算,意思是最低位置1,其它位保持不變。
  110.         CLK = 1; _nop_;                      //clk處于上升沿
  111.         dat <<= 1;                          //數(shù)據(jù)左移
  112.     }
  113.     return (dat);
  114.     CS = 1;                                  //ADC0832停止工作
  115. }
復(fù)制代碼

Keil代碼與Proteus8.13版本的仿真(注意其他版本打不開的)下載:
51酒精報(bào)警.zip (91.61 KB, 下載次數(shù): 71)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1139033 發(fā)表于 2024-12-9 14:21 | 只看該作者
用的lcd?代碼里咋寫oled
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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