久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1814|回復: 0
收起左側

單片機酒精檢測代碼

[復制鏈接]
ID:639814 發表于 2019-11-13 17:33 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>
  2. #include<string.h>
  3. #include <stdio.h>
  4. #include"intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
  8. uchar code table1[]="ALC warn=90mg/L";                 //初始顯示
  9. uchar code table2[]="current=";                                //報警濃度和實測濃度表示
  10. uchar code table3[]="mg/L";
  11. sbit led=P2^2;
  12. sbit beep=P1^5;
  13. sbit lcdrs=P2^5;               //1602液晶的RS腳接在P2.3口上
  14. sbit lcdrw=P2^6;               //1602液晶的RW腳接在P2.4口上
  15. sbit lcden=P2^7;               //1602液晶的E腳接在P2.5口上
  16. sbit SDA=P2^1;                                                         
  17. sbit SCL=P2^3;
  18. int count,t,num;
  19. uchar cur1,cur2,cur3;                                
  20. uint cur_bj=90;                         //CO報警值
  21. unsigned char ADbuf;//設置8位的寄存器用來暫存A/D轉換結果
  22. void delay(unsigned int z)
  23. {
  24.         uint i,j;
  25.         for(i=z;i>0;i--)
  26.           for(j=110;j>0;j--);
  27. }

  28. /*******************************延時函數*********************************/
  29. void delayms(unsigned int ms)
  30. {
  31.         unsigned char i=100,j;
  32.         for(;ms;ms--)
  33.         {
  34.                 while(--i)
  35.                 {
  36.                         j=10;
  37.                         while(--j);
  38.                 }
  39.         }
  40. }





  41. /*******************************報警函數*********************************/
  42. void led_warn()                                                
  43. {
  44.         led=~led;
  45.         delay(200);
  46. }
  47. void beep_warn()

  48. {
  49.         beep=~beep;
  50.         delay(200);
  51. }





  52.    /******************************寫命令函數********************************/
  53. void write_com(uchar com)
  54. {
  55.          lcdrs=0;
  56.          P0=com;                                //讀命令
  57.          delay(1);
  58.          lcden=1;                                //啟動脈沖
  59.          delay(1);
  60.          lcden=0;
  61. }
  62. /******************************寫數據函數********************************/
  63. void write_data(uchar date)
  64. {
  65.          lcdrs=1;
  66.          P0=date;                                //寫命令
  67.          delay(1);
  68.          lcden=1;                                //啟動脈沖
  69.          delay(1);
  70.          lcden=0;
  71. }
  72. /******************************LCD初始化*********************************/
  73. void init_1602()
  74. {
  75.          lcden=0;
  76.          write_com(0x38);                        //設置16*2顯示;5*7點陣;8位數據接口
  77.          write_com(0x0c);                        //設置開顯示,不顯示光標
  78.          write_com(0x06);                        //寫一個字符后地址指針自動加1
  79.          write_com(0x01);                        //設置清0,數據指針清零
  80. }





  81. void IICstart(void)
  82. {
  83.      SDA=1;                //先將SDA=1,以準備在SCL=1時,將SDA=0
  84.      SCL=1;                //時鐘總線拉高
  85.      _nop_();                          //略做延時
  86.      _nop_();                          //略做延時
  87.      SDA=0;                //SCL=1時,將SDA拉低即產生啟動信號
  88.      _nop_();                          //略做延時
  89.      _nop_();                          //略做延時
  90.      SCL=0;                //將SCL=0,完成啟動信號操作      
  91. }


  92. /*****************************IIC停止信號函數***********************************/
  93. void IICstop(void)
  94. {
  95.      SDA=0;                //先將SDA=0,以準備在SCL=1時,將SDA=1
  96.      SCL=1;                //時鐘總線拉高
  97.      _nop_();                          //略做延時
  98.      _nop_();                          //略做延時
  99.      SDA=1;                //SCL=1時,將SDA拉高即產生停止信號
  100.      _nop_();                          //略做延時
  101.      _nop_();                          //略做延時
  102.      SCL=0;                //將SCL=0,完成啟動信號操作      
  103. }

  104. /*****************************向IIC總線寫入1個字節函數**************************/
  105. void Write1Byte(unsigned char Buf1)
  106. {
  107.      unsigned char k;      //1個字節要分8次寫入,需要定義一個寄存器用來計數
  108.      for(k=0;k<8;k++)      //做一個8次的循環,每次寫入1位,需要寫8次
  109.      {
  110.          if(Buf1&0x80)     //從最高位開始寫
  111.          {
  112.              SDA=1;        //如果欲寫入數據為1,就將數據線置1
  113.          }
  114.          else
  115.          {
  116.              SDA=0;        //如果欲寫入數據為0,就將數據線寫0
  117.          }
  118.          _nop_();          //略做延時
  119.          _nop_();          //略做延時
  120.          SCL=1;            //時鐘線做一個上升沿,將一位數據寫入
  121.          Buf1=Buf1<<1;     //數據左移一位,將下次要寫入的位數據移到最高位
  122.          _nop_();          //略做延時
  123.          SCL=0;            //將SCL=0,以準備通過上升沿將數據寫入
  124.          _nop_();          //略做延時
  125.      }
  126.      SDA=1;                //將SDA=1,準備讀應答信號
  127.      _nop_();              //略做延時
  128.      SCL=1;                //將SCL=1,做個上升沿準備讀應答信號
  129.      _nop_();              //略做延時
  130.      _nop_();              //略做延時
  131.      SCL=0;                //將SCL=0,結束應答信號讀操作
  132. }

  133. /****************************從IIC總線讀入1個字節函數******************************/
  134. unsigned char Read1Byte(void)
  135. {
  136.      unsigned char k;      //1個字節要分8次讀出,需要定義一個寄存器用來計數
  137.      unsigned char t=0;    //定義一個寄存器用保存讀出數據
  138.      for(k=0;k<8;k++)      //做一個8次的循環,每次讀入1位,需要讀8次
  139.      {
  140.          t=t<<1;           //數據左移一位,空出最低位以準備保存讀入的一位數據
  141.          SDA=1;            //將SDA寫1準備讀
  142.          SCL=1;            //將SCL=1,做個上升沿準備讀一位數據
  143.          _nop_();          //略做延時
  144.          _nop_();          //略做延時
  145.          if(SDA==1)        //讀一位數據,并判斷
  146.          {
  147.              t=t|0x01;     //如果讀入數據為1,就將接收緩沖區最低一位置1
  148.          }
  149.          else
  150.          {
  151.              t=t&0xfe;     //如果讀入數據為0,就將接收緩沖區最低一位寫0
  152.          }
  153.          SCL=0;            //SCL恢復為0,結束一位數據讀操作
  154.          _nop_();          //略做延時
  155.          _nop_();          //略做延時
  156.      }
  157.      return t;             //將讀入的一個字節返回
  158. }

  159. /******************************軟件模擬IIC向PCF8591指定地址寫一個字節函數********************************/
  160. void WritePCF8591(unsigned char Databuf)
  161. {                          //直接調用本函數即可啟動PCF8591的D/A轉換
  162.     IICstart();            //IIC啟動信號

  163.     Write1Byte(0x90);      //發送PCF8591的器件地址和寫信號

  164.     Write1Byte(0x40);      //發送器件子地址

  165.     Write1Byte(Databuf);   //發送數據

  166.     IICstop();             //產生IIC停止信號
  167. }


  168. /******************************軟件模擬IIC從PCF8563指定地址讀一個字節函數************************************/
  169. unsigned char ReadPCF8591(unsigned char Ch)
  170. {                          //直接調用本函數即可從PCF8591的Ch通道讀出數據返回
  171.     unsigned char buf;     //定義一個寄存器用來暫存讀出的數據
  172.     IICstart();            //IIC啟動信號

  173.     Write1Byte(0x90);      //發送PCF8591的器件地址和寫信號

  174.     Write1Byte(0x40|Ch);   //發送器件通道參數Ch=0-3

  175.     IICstart();            //IIC啟動信號

  176.     Write1Byte(0x91);      //發送PCF8591的器件地址和讀信號

  177.     buf=Read1Byte();//讀一個字節數據

  178.     IICstop();             //產生IIC停止信號

  179.     return(buf);           //將讀出數據返回
  180. }


  181. /******************************顯示初始值函數**********************************/
  182. void dis_init()
  183. {
  184.         uchar a,b,c;
  185.         write_com(0x80+0x00);        //初始化顯示
  186.          for(a=0;a<15;a++)
  187.          {
  188.                   write_data(table1[a]);
  189.                   delay(1);
  190.          }
  191.         delay(200);
  192.         write_com(0x80+0x40);        //第二行顯示酒精濃度表示單位        
  193.          for(b=0;b<8;b++)
  194.          {
  195.                   write_data(table2[b]);
  196.                   delay(1);
  197.          }
  198.                  write_com(0x80+0x4B);        //第二行顯示酒精濃度表示單位        
  199.          for(c=0;c<4;c++)
  200.          {
  201.                   write_data(table3[c]);
  202.                   delay(1);
  203.          }

  204. }



  205. /*********************************1602顯示濃度數據h和酒精報警程序**************************/
  206. void dis_cur(uint t)
  207. {
  208.   uchar i;
  209.      t=t*100/255;
  210.    i=t/100;
  211.    write_com(0x80+0x48);           //顯示濃度百位
  212.    write_data(table[i]);
  213.    cur1=table[i];
  214.   i=t%100/10;

  215.     write_com(0x80+0x49);
  216.         write_data(table[i]);
  217.          cur2=table[i];
  218.   i=t%100%10;
  219.           write_com(0x80+0x4A);           //顯示濃度個位
  220.          write_data(table[i]);

  221.          cur3=table[i];


  222.          if(t>cur_bj)
  223.           {         
  224.                 led_warn();
  225.             beep_warn();
  226.           }

  227.     else
  228.           {
  229.                 led=1;
  230.                 beep=1;
  231.           }

  232. }

  233. /*******************************串口初始化********************************/
  234. void  UARTinit()
  235. {
  236. //   TMOD=0X21;
  237. //   SCON=0X40;
  238.   TMOD=0x20;
  239.   PCON=0x00;
  240.   SCON=0x50;
  241.    TH1=0XFF;
  242.    TL1=0XFD;
  243.    TH0=(65536-45872)/256;
  244.    TL0=(65536-45872)%256;
  245.    TR1=1;
  246.    TR0=1;
  247.    EA=1;
  248.    ES=1;
  249.    TI=0;
  250.    ET0=1;
  251. }
  252. /*******************************發送一個字節************************************/
  253. void UART_Send_Byte(unsigned char mydata)        
  254. {
  255.          ES=0;
  256.          TI=0;
  257.          SBUF=mydata;
  258.          while(!TI);
  259.          TI=0;
  260.          ES=1;
  261. }
  262. /****************************發送文本串****************************************/
  263. void UART_Send_Str(char *s)         
  264. {
  265.          int i=0;
  266.          while(s[i]!=0)
  267.          {
  268.                  UART_Send_Byte(s[i]);
  269.                  i++;
  270.          }

  271. }

  272. void T0_time() interrupt 1
  273. {
  274.    count++;
  275.    TH0=(65536-45872)/256;
  276.    TL0=(65536-45872)%256;
  277.            if(count==400)
  278.                 {
  279.                  count=0;
  280.                  num=1;
  281.                 }

  282. }


  283. main()
  284. {
  285. uchar g,s,b;

  286. //        uchar i = 0;
  287. //          uchar code Buffer[]="0" ;  //所要發送的數據
  288. //          uchar *p;

  289.         led=1;
  290.         beep=1;
  291.         lcdrw=0;                           //確定讀操作
  292.         init_1602();                   //初始化LCD1602
  293.         delay(5);
  294.         dis_init();                                //1602顯示初始化  
  295.         delay(2000);
  296.         UARTinit();                           //串口初始化



  297. //          Com_Init();
  298. //          p = Buffer;
  299.         while(1)        
  300.         {
  301.                    ADbuf=ReadPCF8591(0);     //將AIN0通道A/D轉換結果暫存在ADbuf
  302.                     dis_cur(ADbuf);        //濃度顯示
  303.                   b=ADbuf/100;
  304.                 s=ADbuf%100/10;
  305.                 g=ADbuf%100%10;
  306.                 if(num==1)
  307.                 {
  308.                         UART_Send_Byte(g);
  309.                         UART_Send_Byte(s);
  310.                         UART_Send_Byte(b);
  311.                 //        UART_Send_Str("hello");
  312. //                UART_Send_Str("ADbuf/100");
  313. //                UART_Send_Str("ADbuf%100/10");
  314. //                UART_Send_Str("ADbuf%100%10");

  315.                 }
  316.    /*
  317.                  SBUF = *p ;
  318.             while(!TI){  ;//如果發送完畢,硬件會置位TI
  319.               _nop_();   //此句似乎可以去掉
  320.             }
  321.             TI = 0;  //TI清零
  322.             p++;
  323.             if(*p == '\0')
  324.               break;  */
  325.         }  
  326. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区免费 | 欧美日韩综合精品 | 美女网站视频免费黄 | 亚洲视频一区二区三区四区 | 成人av在线播放 | 中文字幕精品一区 | 91久久| 久久网一区二区 | 国产成人在线播放 | 国产精品久久视频 | 国产一级淫片免费视频 | 精品福利在线视频 | www.99热这里只有精品 | 欧美激情综合网 | 国产精品av久久久久久毛片 | 久久精品播放 | 中文字幕日韩在线 | 麻豆av片 | 日韩av免费在线电影 | 亚洲国产福利视频 | 91爱爱·com | 在线免费观看色 | 免费看黄视频网站 | 成人三级网址 | 欧州一区二区三区 | 日本高清视频在线播放 | 亚洲精品久久久久久一区二区 | 国产毛片在线看 | 韩国毛片一区二区三区 | 国产一区二区三区在线免费观看 | 日韩精品视频在线 | 四虎影院新地址 | 亚洲国产视频一区二区 | 国产精品观看 | 久久www免费人成看片高清 | 天天澡天天狠天天天做 | 一级黄色绿像片 | 狠狠插狠狠操 | 天天插天天操 | 男女视频在线观看网站 | 嫩草黄色影院 |