欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)+PCF8591有毒氣體濃度報(bào)警器仿真設(shè)計(jì)與源碼(LCD1602顯示) [打印本頁(yè)]

作者: 皮官品    時(shí)間: 2018-1-9 21:57
標(biāo)題: 單片機(jī)+PCF8591有毒氣體濃度報(bào)警器仿真設(shè)計(jì)與源碼(LCD1602顯示)
分享一個(gè)基于89C51單片機(jī)+LCD1602液晶顯示+PCF8591 ad轉(zhuǎn)換的有毒氣體濃度報(bào)警器設(shè)計(jì)資料
內(nèi)含     C 程序    isis仿真圖  
操作注意事項(xiàng)

作品由小皮提供:

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

有毒氣體濃度報(bào)警器的仿真原理圖如下(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;                //起動(dòng)總線函數(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) ;        //無(wú)子地址發(fā)送多字節(jié)數(shù)據(jù)函數(shù)   
  51. extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //無(wú)子地址讀字節(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í)函數(shù)(12M晶振下測(cè)試)

  61. //寫指令
  62. void LCD1602_write_com(uchar com)
  63. {
  64.         LCD1602_RS = 0;                 //1602液晶顯示屏的數(shù)據(jù)/命令選擇端置0,數(shù)據(jù)/命令(H/L),此時(shí)選擇寫命令操作
  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í)選擇寫數(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)有無(wú)設(shè)置、光標(biāo)閃爍設(shè)置
  97.         LCD1602_write_com(0x06);                        //寫一個(gè)字符后指針加一
  98.         LCD1602_write_com(0x01);                        //清屏指令
  99. }
  100. /*******************************************************************
  101.                      起動(dòng)總線函數(shù)               
  102. 函數(shù)原型: void  Start_I2c();  
  103. 功能:     啟動(dòng)I2C總線,即發(fā)送I2C起始條件.  
  104. ********************************************************************/
  105. void Start_I2c()
  106. {
  107.   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
  108.   _Nop();
  109.   SCL=1;
  110.   _Nop();        /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
  111.   _Nop();
  112.   _Nop();
  113.   _Nop();
  114.   _Nop();   
  115.   SDA=0;         /*發(fā)送起始信號(hào)*/
  116.   _Nop();        /* 起始條件鎖定時(shí)間大于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ù)信號(hào)*/
  133.   _Nop();       /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
  134.   SCL=1;      /*結(jié)束條件建立時(shí)間大于4μs*/
  135.   _Nop();
  136.   _Nop();
  137.   _Nop();
  138.   _Nop();
  139.   _Nop();
  140.   SDA=1;      /*發(fā)送I2C總線結(jié)束信號(hào)*/
  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)答,并對(duì)
  150.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)     
  151.            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
  152. ********************************************************************/
  153. void  SendByte(uchar  c)
  154. {
  155. uchar  BitCnt;

  156. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
  157.     {
  158.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  159.        else  SDA=0;               
  160.      _Nop();
  161.      SCL=1;               /*置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  162.       _Nop();
  163.       _Nop();             /*保證時(shí)鐘高電平周期大于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)答信號(hào)*/
  181.     SCL=0;
  182.     _Nop();
  183.     _Nop();
  184. }

  185. /*******************************************************************
  186.                  字節(jié)數(shù)據(jù)接收函數(shù)               
  187. 函數(shù)原型: UCHAR  RcvByte();
  188. 功能:        用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
  189.           發(fā)完后請(qǐng)用應(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;                  /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  202.         _Nop();
  203.         _Nop();                 /*時(shí)鐘低電平周期大于4.7μs*/
  204.         _Nop();
  205.         _Nop();
  206.         _Nop();
  207.         SCL=1;                  /*置時(shí)鐘線為高使數(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)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
  224. ********************************************************************/
  225. void Ack_I2c(bit a)
  226. {
  227.   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號(hào) */
  228.   else SDA=1;
  229.   _Nop();
  230.   _Nop();
  231.   _Nop();      
  232.   SCL=1;
  233.   _Nop();
  234.   _Nop();                    /*時(shí)鐘低電平周期大于4μs*/
  235.   _Nop();
  236.   _Nop();
  237.   _Nop();  
  238.   SCL=0;                     /*清時(shí)鐘線,鉗住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();              //啟動(dòng)總線
  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();          //啟動(dòng)總線
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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



作者: 天宗灬    時(shí)間: 2018-1-11 13:25
附件里硬件圖都沒(méi)有,光能找到個(gè)程序,沒(méi)啥用
作者: 皮官品    時(shí)間: 2018-4-13 13:09
proteus 仿真就是硬件圖哦
作者: dyxy2    時(shí)間: 2018-5-11 22:22
很好的設(shè)計(jì) 急需
作者: dyxy2    時(shí)間: 2018-5-11 22:32
這個(gè)設(shè)計(jì)很有借鑒意義
作者: 1234wq    時(shí)間: 2019-5-17 16:00
附件在哪里
作者: Strongest丶星空    時(shí)間: 2019-5-17 18:54
學(xué)到了東西
作者: xixixi123123    時(shí)間: 2019-5-21 15:08
真的很有用啊。!
作者: abc111111    時(shí)間: 2019-6-13 01:55
為什么不是12864顯示呢?




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