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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6370|回復: 9
打印 上一主題 下一主題
收起左側

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

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

作品由小皮提供:

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

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

單片機源程序如下:
  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.             /*應答標志位*/

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

  44. // 函數申明
  45. extern bit ack;                //起動總線函數
  46. extern void Start_I2c();        //結束總線函數  
  47. extern void Stop_I2c();                //應答子函數
  48. extern void Ack_I2c(bit a);                //字節數據發送函數
  49. extern void  SendByte(uchar  c);        //有子地址發送多字節數據函數               
  50. extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) ;        //無子地址發送多字節數據函數   
  51. extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //無子地址讀字節數據函數               
  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延時函數(12M晶振下測試)

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

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

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

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

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

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

  156. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數據長度為8位*/
  157.     {
  158.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發送位*/
  159.        else  SDA=0;               
  160.      _Nop();
  161.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數據位*/
  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位發送完后釋放數據線,準備接收應答位*/
  173.     _Nop();
  174.     _Nop();   
  175.     SCL=1;
  176.     _Nop();
  177.     _Nop();
  178.     _Nop();
  179.     if(SDA==1)ack=0;     
  180.        else ack=1;        /*判斷是否接收到應答信號*/
  181.     SCL=0;
  182.     _Nop();
  183.     _Nop();
  184. }

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

  220. /********************************************************************
  221.                      應答子函數
  222. 函數原型:  void Ack_I2c(bit a);
  223. 功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
  224. ********************************************************************/
  225. void Ack_I2c(bit a)
  226. {
  227.   if(a==0)SDA=0;              /*在此發出應答或非應答信號 */
  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總線以便繼續接收*/
  239.   _Nop();
  240.   _Nop();   
  241. }


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

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

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

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

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


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

7#
ID:502682 發表于 2019-5-17 18:54 | 只看該作者
學到了東西
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清在线 | av永久| 天天躁日日躁狠狠很躁 | 国产精品日韩欧美一区二区三区 | 天天色综 | 中文字幕在线一区 | 亚洲精品国产第一综合99久久 | 在线免费亚洲视频 | 美女黄18岁以下禁止观看 | 男人天堂99| 久久久www成人免费精品 | 日本精品一区二区三区在线观看视频 | 噜噜噜噜狠狠狠7777视频 | 亚洲欧美一区二区三区国产精品 | 欧美黄 片免费观看 | 日韩视频在线观看 | 日韩精品免费一区二区在线观看 | h视频在线免费观看 | 国产成人免费视频网站高清观看视频 | 国产在线精品一区二区 | 欧美一区二区三区在线看 | 久久国产精品99久久久大便 | 欧美一级片免费看 | 欧美日韩亚洲视频 | 日本在线观看网址 | 国产高清精品在线 | 国产精品国产三级国产aⅴ中文 | 久久草在线视频 | 欧洲成人免费视频 | 人人亚洲| 国产一区二区三区在线免费观看 | 国产精品18久久久久久久 | 国产成人网 | 国产黄色av电影 | 国产精品久久久久久久久免费相片 | 一级黄色夫妻生活 | 中文字幕亚洲欧美日韩在线不卡 | 国产福利小视频 | 中文字幕高清 | 在线看av的网址 | 免费毛片网站在线观看 |