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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+PCF8591有毒氣體濃度報警器仿真設(shè)計與源碼(LCD1602顯示)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
分享一個基于89C51單片機(jī)+LCD1602液晶顯示+PCF8591 ad轉(zhuǎn)換的有毒氣體濃度報警器設(shè)計資料
內(nèi)含     C 程序    isis仿真圖  
操作注意事項(xiàng)

作品由小皮提供:

傳感器 MQ -2
采集器 PCF8591
處理器 STC89c51
顯示器 LCD1602
按鍵調(diào)整加減報警值 初始值為50%

有毒氣體濃度報警器的仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機(jī)源程序如下:
  1. #include<reg52.h>   
  2. #include <intrins.h>

  3. #define ulong unsigned long
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define LCD1602_PORT P1               
  7. #define  PCF8591 0x90   
  8. #define  NOP()   _nop_()   
  9. #define  _Nop()  _nop_()  


  10. sbit SCL=P2^1;      
  11. sbit SDA=P2^0;      
  12. sbit LCD1602_RS = P2^5;         
  13. sbit LCD1602_RW = P2^4;         
  14. sbit LCD1602_EN = P2^3;        
  15. bit ack;     
  16. sbit key1= P0^4;
  17. sbit key2 = P0^5;
  18. sbit buzz = P2^6;
  19. int g=50;
  20. void delay_ms(uint n)        
  21. {
  22.         unsigned int  i,j;
  23.         for(i=0;i<n;i++)
  24.                 for(j=0;j<123;j++);
  25. }

  26. void key()
  27. {
  28.         key1 = 1;
  29.         delay_ms(50);
  30.         if(key1==0)g=g+1;
  31.                 if(g>99)g==0;
  32.         key2 = 1;        
  33.                 delay_ms(50);
  34.         if(key2==0)g=g-1;
  35.         if(g<0)g==99;
  36.         
  37. }
  38.             /*應(yīng)答標(biāo)志位*/

  39. // 變量定義
  40. uchar AD_CHANNEL;
  41. ulong xdata  LedOut[8];          //單片機(jī)內(nèi)部存取器
  42. ulong  f,v,a,cj;
  43. uchar date;

  44. // 函數(shù)申明
  45. extern bit ack;                //起動總線函數(shù)
  46. extern void Start_I2c();        //結(jié)束總線函數(shù)  
  47. extern void Stop_I2c();                //應(yīng)答子函數(shù)
  48. extern void Ack_I2c(bit a);                //字節(jié)數(shù)據(jù)發(fā)送函數(shù)
  49. extern void  SendByte(uchar  c);        //有子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)               
  50. extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) ;        //無子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)   
  51. extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //無子地址讀字節(jié)數(shù)據(jù)函數(shù)               
  52. extern uchar RcvByte();

  53. void LCD1602_delay_ms(uint n);
  54. void LCD1602_write_com(uchar com);
  55. void LCD1602_write_data(ulong dat);
  56. void LCD1602_write_word(uchar *s);
  57. void Init_LCD1602();

  58. bit ISendByte(uchar sla,uchar c);
  59. uchar IRcvByte(uchar sla);

  60. //MS延時函數(shù)(12M晶振下測試)

  61. //寫指令
  62. void LCD1602_write_com(uchar com)
  63. {
  64.         LCD1602_RS = 0;                 //1602液晶顯示屏的數(shù)據(jù)/命令選擇端置0,數(shù)據(jù)/命令(H/L),此時選擇寫命令操作
  65.         delay_ms(1);
  66.         LCD1602_EN = 1;                 //使能,也就是打開液晶接收數(shù)據(jù)命令的通道
  67.         LCD1602_PORT = com;         //把命令送給P2口
  68.         delay_ms(1);
  69.         LCD1602_EN = 0;
  70. }

  71. //寫數(shù)據(jù)
  72. void LCD1602_write_data(ulong dat)
  73. {
  74.         LCD1602_RS = 1;                 //1602液晶顯示屏的數(shù)據(jù)/命令選擇端置0,數(shù)據(jù)/命令(H/L),此時選擇寫數(shù)據(jù)操作
  75.         delay_ms(1);        
  76.         LCD1602_PORT = dat;         //把數(shù)據(jù)送給P2口
  77.         LCD1602_EN = 1;
  78.         delay_ms(1);
  79.         LCD1602_EN = 0;
  80. }

  81. //連續(xù)寫字符
  82. void LCD1602_write_word(uchar *s)
  83. {
  84.         while(*s>0)
  85.         {
  86.                 LCD1602_write_data(*s);
  87.                 s++;
  88.         }
  89. }

  90. //1602初始化函數(shù)
  91. void Init_LCD1602()                                       
  92. {
  93.         LCD1602_EN = 0;
  94.         LCD1602_RW = 0;                                                //設(shè)置為寫狀態(tài)
  95.         LCD1602_write_com(0x38);                        //顯示模式設(shè)定
  96.         LCD1602_write_com(0x0c);                        //開關(guān)顯示、光標(biāo)有無設(shè)置、光標(biāo)閃爍設(shè)置
  97.         LCD1602_write_com(0x06);                        //寫一個字符后指針加一
  98.         LCD1602_write_com(0x01);                        //清屏指令
  99. }
  100. /*******************************************************************
  101.                      起動總線函數(shù)               
  102. 函數(shù)原型: void  Start_I2c();  
  103. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  104. ********************************************************************/
  105. void Start_I2c()
  106. {
  107.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  108.   _Nop();
  109.   SCL=1;
  110.   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  111.   _Nop();
  112.   _Nop();
  113.   _Nop();
  114.   _Nop();   
  115.   SDA=0;         /*發(fā)送起始信號*/
  116.   _Nop();        /* 起始條件鎖定時間大于4μs*/
  117.   _Nop();
  118.   _Nop();
  119.   _Nop();
  120.   _Nop();      
  121.   SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  122.   _Nop();
  123.   _Nop();
  124. }

  125. /*******************************************************************
  126.                       結(jié)束總線函數(shù)               
  127. 函數(shù)原型: void  Stop_I2c();  
  128. 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.  
  129. ********************************************************************/
  130. void Stop_I2c()
  131. {
  132.   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  133.   _Nop();       /*發(fā)送結(jié)束條件的時鐘信號*/
  134.   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  135.   _Nop();
  136.   _Nop();
  137.   _Nop();
  138.   _Nop();
  139.   _Nop();
  140.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  141.   _Nop();
  142.   _Nop();
  143.   _Nop();
  144.   _Nop();
  145. }

  146. /*******************************************************************
  147.                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  148. 函數(shù)原型: void  SendByte(UCHAR c);
  149. 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  150.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  151.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  152. ********************************************************************/
  153. void  SendByte(uchar  c)
  154. {
  155. uchar  BitCnt;

  156. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  157.     {
  158.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  159.        else  SDA=0;               
  160.      _Nop();
  161.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  162.       _Nop();
  163.       _Nop();             /*保證時鐘高電平周期大于4μs*/
  164.       _Nop();
  165.       _Nop();
  166.       _Nop();         
  167.      SCL=0;
  168.     }
  169.    
  170.     _Nop();
  171.     _Nop();
  172.     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  173.     _Nop();
  174.     _Nop();   
  175.     SCL=1;
  176.     _Nop();
  177.     _Nop();
  178.     _Nop();
  179.     if(SDA==1)ack=0;     
  180.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  181.     SCL=0;
  182.     _Nop();
  183.     _Nop();
  184. }

  185. /*******************************************************************
  186.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  187. 函數(shù)原型: UCHAR  RcvByte();
  188. 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  189.           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。  
  190. ********************************************************************/   
  191. uchar   RcvByte()
  192. {
  193.   uchar  retc;
  194.   uchar  BitCnt;
  195.   
  196.   retc=0;
  197.   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  198.   for(BitCnt=0;BitCnt<8;BitCnt++)
  199.       {
  200.         _Nop();           
  201.         SCL=0;                  /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  202.         _Nop();
  203.         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  204.         _Nop();
  205.         _Nop();
  206.         _Nop();
  207.         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  208.         _Nop();
  209.         _Nop();
  210.         retc=retc<<1;
  211.         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  212.         _Nop();
  213.         _Nop();
  214.       }
  215.   SCL=0;   
  216.   _Nop();
  217.   _Nop();
  218.   return(retc);
  219. }

  220. /********************************************************************
  221.                      應(yīng)答子函數(shù)
  222. 函數(shù)原型:  void Ack_I2c(bit a);
  223. 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  224. ********************************************************************/
  225. void Ack_I2c(bit a)
  226. {
  227.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  228.   else SDA=1;
  229.   _Nop();
  230.   _Nop();
  231.   _Nop();      
  232.   SCL=1;
  233.   _Nop();
  234.   _Nop();                    /*時鐘低電平周期大于4μs*/
  235.   _Nop();
  236.   _Nop();
  237.   _Nop();  
  238.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  239.   _Nop();
  240.   _Nop();   
  241. }


  242. /*******************************************************************
  243. ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)               
  244. *******************************************************************/
  245. bit ISendByte(uchar sla,uchar c)
  246. {
  247.    Start_I2c();              //啟動總線
  248.    SendByte(sla);            //發(fā)送器件地址
  249.    if(ack==0)return(0);
  250.    SendByte(c);              //發(fā)送數(shù)據(jù)
  251.    if(ack==0)return(0);
  252.    Stop_I2c();               //結(jié)束總線
  253.    return(1);
  254. }

  255. /*******************************************************************
  256. ADC讀字節(jié)數(shù)據(jù)函數(shù)               
  257. *******************************************************************/
  258. uchar IRcvByte(uchar sla)
  259. {  
  260.    uchar c;
  261.    Start_I2c();          //啟動總線
  262.    SendByte(sla+1);      //發(fā)送器件地址
  263.    if(ack==0)return(0);
  264.    c=RcvByte();          //讀取數(shù)據(jù)0
  265.    Ack_I2c(1);           //發(fā)送非就答位
  266.    Stop_I2c();           //結(jié)束總線
  267.    return(c);
  268. }

  269. //        字符顯示函數(shù)
  270. void Display()
  271. {
  272.         LCD1602_write_com(0x80);                        //指針設(shè)置,指向1602液晶第一行第一列
  273. ……………………

  274. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于89C51 LCD1602 PCF8591有毒氣體濃度報警器.zip (104.05 KB, 下載次數(shù): 148)


評分

參與人數(shù) 1黑幣 +5 收起 理由
hickey + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:274493 發(fā)表于 2018-1-11 13:25 | 只看該作者
附件里硬件圖都沒有,光能找到個程序,沒啥用
回復(fù)

使用道具 舉報

板凳
ID:273715 發(fā)表于 2018-4-13 13:09 | 只看該作者
proteus 仿真就是硬件圖哦
回復(fù)

使用道具 舉報

地板
ID:86862 發(fā)表于 2018-5-11 22:22 | 只看該作者
很好的設(shè)計 急需
回復(fù)

使用道具 舉報

5#
ID:86862 發(fā)表于 2018-5-11 22:32 | 只看該作者
這個設(shè)計很有借鑒意義
回復(fù)

使用道具 舉報

6#
ID:540768 發(fā)表于 2019-5-17 16:00 來自手機(jī) | 只看該作者
附件在哪里
回復(fù)

使用道具 舉報

7#
ID:502682 發(fā)表于 2019-5-17 18:54 | 只看該作者
學(xué)到了東西
回復(fù)

使用道具 舉報

8#
ID:543817 發(fā)表于 2019-5-21 15:08 | 只看該作者
真的很有用啊!!!
回復(fù)

使用道具 舉報

9#
ID:557774 發(fā)表于 2019-6-13 01:55 來自手機(jī) | 只看該作者
為什么不是12864顯示呢?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 网黄在线 | av网站在线看 | 精品国产欧美在线 | 久久男人天堂 | 国产成人精品久久 | av网站在线免费观看 | 四虎影院美女 | 亚洲第一视频网站 | 亚洲第一成人影院 | 日韩欧美国产精品 | 日韩中文久久 | 99热热99| av色站| 日韩久草| 久久久久久久国产 | 亚洲日日夜夜 | 日韩精品免费视频 | 欧美日韩在线播放 | 99精品国产一区二区青青牛奶 | 97天天干 | 欧美亚洲激情 | 久草视频在线播放 | 久久久久久一区 | 亚洲成人一区 | 国产午夜精品一区二区三区嫩草 | 国产精品久久久久久久久久久新郎 | 国产精品自产拍 | 精品一区二区视频 | 久久精品久久久 | 亚洲超碰在线观看 | 国产激情在线看 | 精品视频国产 | 国产欧美一区二区在线观看 | 一区二区三区四区在线 | 国产视频h | 伊人在线视频 | 98久久| 精品一区在线看 | 黄网站在线观看 | 久久精品中文 | 午夜成人免费视频 |