標題: 基于51單片機ADC0832轉換MQ3酒精傳感器OLED顯示程序與Proteus仿真 [打印本頁]

作者: binggg    時間: 2022-11-12 17:30
標題: 基于51單片機ADC0832轉換MQ3酒精傳感器OLED顯示程序與Proteus仿真
如果仿真打不開,把Proteus升級到8.13版本。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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ù)轉換結果
  7. uint boundaries=80;//初始酒精報警設定為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ù)
  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 屏幕翻轉顯示
  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);//顯示酒精濃度測試
  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);//顯示設
  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ù)點
  58.           OLED_ShowNum(40,2,boundaries,3,16);//顯示設定值
  59.                 if(x>=boundaries)//酒精濃度大于等于設定,蜂鳴器響,紅燈亮
  60.                 {
  61.                         Beep=0;
  62.                         LEDR=0;
  63.                 }
  64.                 else//酒精濃度小于設定值,蜂鳴器不響,紅燈不亮
  65.                 {
  66.           Beep=1;
  67.                 LEDR=1;
  68.                 }
  69.                
  70.                 if(K1==0)//按下K1時,設定值減1
  71.                 {
  72.                         Delayms(15);//消抖
  73.                         if(K1==0)
  74.                         {
  75.                          boundaries--;
  76.                         }
  77.                  while(!K1);//判斷K1是否彈起
  78.                 }
  79.                  
  80.                 if(K2==0)//按下K2時,設定值減+
  81.                 {
  82.                         Delayms(15);//消抖
  83.                         if(K2==0)
  84.                         {
  85.                                 boundaries++;
  86.                         }
  87.                  while(!K2);//判斷K2是否彈起
  88.                 }
  89.          }
  90. }





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

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

作者: tens1on    時間: 2024-12-9 14:21
用的lcd?代碼里咋寫oled




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1