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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

1602LCD顯示溫濕度、超聲波測距和煙霧濃度,但是顯示不出來,求大神們幫忙看看

[復制鏈接]
跳轉到指定樓層
樓主
ID:669473 發表于 2019-12-27 12:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned int u16;          //對數據類型進行聲明定義
  4. typedef unsigned char u8;
  5. sbit rs = P0 ^ 4;                 //LCD管腳
  6. sbit rw = P0 ^ 3;
  7. sbit e = P0 ^ 2;
  8. sbit trig=P1^4;                        //超聲波管腳
  9. sbit echo=P1^5;int i=0;
  10. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  11. u8 num[16]=' ';
  12. u8 yw[16]=' ';
  13. bit state;                        //讀狀態標志位
  14. u16 dis;                        //距離放在這里
  15. unsigned char code cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
  16. unsigned char buf[9] = {0};
  17. unsigned char nub = 0;
  18. unsigned int value = 0;
  19. unsigned char flag = 1;
  20. unsigned char w;
  21. sbit P2_0 = P2^0;
  22. bit nug;
  23. unsigned char shidu_int;
  24. unsigned char shidu_point;
  25. unsigned char tem_int;
  26. unsigned char tem_point;
  27. unsigned char check;
  28. unsigned char self_check;
  29. bit state;

  30. void delay5ms()                //@11.0592MHz**************************延時函數
  31. {
  32.         u8 i, j;

  33.         i = 9;
  34.         j = 244;
  35.         do
  36.         {
  37.                 while (--j);
  38.         } while (--i);
  39. }

  40. void delay15ms()                //@11.0592MHz
  41. {
  42.         u8 i, j;
  43.         i = 27;
  44.         j = 226;
  45.         do
  46.         {
  47.                 while (--j);
  48.         } while (--i);
  49. }

  50. void Delay12us()                //@11.0592MHz
  51. {
  52.         unsigned char i;
  53.         _nop_();
  54.         _nop_();
  55.         _nop_();
  56.         i = 30;
  57.         while (--i);
  58. }
  59. void delay_ms(unsigned int ms)        //延時
  60. {
  61.         unsigned int i;
  62.         unsigned char j;   
  63.         for(i=0;i<ms;i++)  
  64.         {      
  65.                 for(j=0;j<200;j++);     
  66.                 for(j=0;j<102;j++);
  67.         }
  68. }

  69. bit read_busy()                        //讀狀態
  70. {               
  71.         e = 0;
  72.         rs = 0;
  73.         rw = 1;
  74.         e = 1;
  75.         state = P2 >> 7 | 0;
  76.         delay5ms();
  77.         e = 0;
  78.         return state;
  79. }

  80. void write_cmd(unsigned char cmd)                //寫指令
  81. {        
  82.         while(read_busy());                        //等待lcd屏不忙
  83.         e = 0;
  84.         rs = 0;
  85.         rw = 0;
  86.         P2 = cmd;
  87.         e = 1;
  88.         delay5ms();
  89.         e = 0;
  90. }

  91. void write_data(unsigned char date)
  92. {
  93.         while(read_busy());                        //等待lcd屏不忙
  94.         e = 0;
  95.         rs = 1;
  96.         rw = 0;
  97.         P2 = date;
  98.         e = 1;
  99.         delay5ms();
  100.         e = 0;
  101. }

  102. void init_dht11()
  103. {
  104.         //啟動dht11采集數據 《-》 初始化dht11
  105.         P2_0 = 1;
  106.         P2_0 = 0;
  107.         delay_ms(20);
  108.         P2_0 = 1;
  109.         delay_ms(0.04);
  110. }

  111. unsigned char read_io()
  112. {
  113.         unsigned char i;
  114.         unsigned char date = 0;
  115.                 for(i = 0; i < 8; i++)
  116.                 {
  117.                         while(P2_0 == 0);  //過掉50us的時間間隙
  118.                         nug = 0;
  119.                         delay_ms(0.03);
  120.                         if(P2_0 == 1)
  121.                         {        
  122.                                 nug = 1;
  123.                         }
  124.                         date = date << 1;
  125.                         date = date | nug;
  126.                         while(P2_0 == 1);                //過掉收到的數據位為1的那段時間
  127.                 }
  128.                 return date;
  129. }
  130. void init_serial()         //********************************************煙霧濃度模塊
  131. {
  132.         //1.配置串口通信方式1 接收使能
  133.         //SCON
  134.         SM0 = 0;
  135.         SM1 = 1;        //配置串口通信的方式1
  136.         REN = 1;        //接收使能
  137.         //2.配置波特率為9600
  138.         TMOD = 0x20;        //配置定時器1的工作方式2  8位自動重裝
  139.         TH1 = 0xFD;                //配置定時器計數寄存器高8位的重裝值
  140.         TL1 = 0xFD;                //配置定時器計數寄存器低8位的起始計數值
  141.         TR1 = 1;                //開啟定時器1
  142.         EA = 1;                        //開啟總中斷
  143.         ES = 0;                        //關閉串口中斷
  144. }
  145. void uart(void) interrupt 4
  146. {
  147.         if(RI == 1)
  148.         {
  149.                 buf[nub] = SBUF;//接收數據
  150.                 RI = 0;      //清除接收標志位
  151.                 nub++;
  152.         }
  153.         if(nub == 9)
  154.         {        
  155.                 ES = 0; //關閉串口中斷
  156.                 if(buf[0] == 0xFF && buf[1] == 0x86)
  157.                 {
  158.                         value = buf[2] << 8 | buf[3];   //煙霧濃度值
  159.                 }
  160.                 nub = 0;
  161.                 flag = 1;
  162.         }
  163. }

  164. void Timerinit()           //初始化定時器  **********************************超聲波測距模塊
  165. {
  166.         TMOD=0x01;
  167.         TH0=0;
  168.         TL0=0;
  169. }

  170. unsigned int distance()                //算距離的函數
  171. {
  172.         u16 y,z;
  173.         echo=0;
  174.         trig=1;
  175.         Delay12us();
  176.         trig=0;
  177.         while(echo == 0);
  178.         TR0 = 1;
  179.         while(echo == 1);
  180.         TR0 = 0;
  181.         y=TH0*256+TL0;   //計算高電平的時間
  182.         z=(y*1.7)/100;
  183.         TH0 = 0x00;
  184.         TL0 = 0x00;
  185.         return z;        
  186. }

  187. void init_lcd()                        //初始化lcd屏幕
  188. {
  189.         //1.延遲15ms
  190.         delay15ms();
  191.         //2.寫指令38H
  192.         write_cmd(0x38);
  193.         //3.延遲5ms
  194.         delay5ms();
  195.         //4.寫指令38H
  196.         write_cmd(0x38);
  197.         //5.延遲5ms
  198.         delay5ms();
  199.         //6.寫指令38H
  200.         write_cmd(0x38);
  201.         //7.以后每次寫指令、讀/寫數據之前均需檢測忙信號
  202.         //8.寫指令38H:顯示設置模式
  203.         //while(read_busy());
  204.         write_cmd(0x38);
  205.         //9.寫指令08H:顯示關閉
  206.         //while(read_busy());
  207.         write_cmd(0x08);
  208.         //10.寫指令01H:顯示清屏
  209.         //while(read_busy());
  210.         write_cmd(0x01);
  211.         //11.寫指令06H:顯示光標移動設置
  212.         //while(read_busy());
  213.         write_cmd(0x06);
  214.         //12.寫指令0CH:顯示開及光標設置
  215.         //while(read_busy());
  216.         write_cmd(0x0C);
  217. }



  218. void  xianshi( )        
  219. {

  220.         u8 i;                                
  221.     init_serial();
  222.         Timerinit();                //初始化定時器
  223.         while(1)
  224.         {
  225.                 dis = distance();                                                 //****************************************距離
  226.                 for(i=4;i>0;i--)
  227.                 {
  228.                         num[i]=ASCII[dis%10];
  229.                         dis/=10;
  230.                 }
  231.                 write_cmd(0x80);   //設置數據指針的位置
  232.                 write_data('J');
  233.                 for(i=0;i<5;i++)  //寫數據
  234.                 {
  235.                         write_data(num[i]);
  236.                 }
  237.                 if(flag == 1)                                                   //*************************************煙霧濃度
  238.                 {        
  239.                         //調用數碼管顯示函數display(value);
  240.                         write_cmd(0x80+0x08);   //設置數據指針的位置
  241.                     write_data('Y');                           
  242.                         ES = 1;          //關閉串口中斷
  243.                         for(w = 0; w < 9; w++)
  244.                         {
  245.                                 SBUF = cmd[w];
  246.                                 while(TI == 0);   //等待數據發送完成
  247.                                 TI = 0;                          //軟件清零 清除發送完成中斷標志位
  248.                         }  
  249.                         write_data(SBUF/1000);
  250.                         write_data(SBUF%1000/100);
  251.                         write_data(SBUF%1000%100/10);
  252.                         write_data(SBUF%1000);
  253.                         flag = 0;
  254.                         ES = 0;                                 //開啟串口中斷
  255.                 }
  256.         
  257.                 //啟動dht11采集數據 《-》 初始化dht11         ******************************************溫濕度
  258.                 init_dht11();
  259.                 if(P2_0 == 0) //dht11響應了
  260.                 {
  261.                         while(P2_0 == 0);  //過掉dht11的響應信號
  262.                         while(P2_0 == 1);  //過掉dht11把總線拉高的80us
  263.                         shidu_int = read_io();
  264.                         shidu_point = read_io();
  265.                         tem_int = read_io();
  266.                         tem_point = read_io();
  267.                         check = read_io();
  268.                         self_check = shidu_int + shidu_point + tem_int + tem_point;
  269.                         if(check == self_check)
  270.                         {
  271.                                 write_cmd(0x80+0x40);                //設置數據指針
  272.                                 write_data('S');                        //顯示濕度
  273.                                 //調用lcd顯示函數write_date()
  274.                                 write_data(shidu_int/10);
  275.                                 write_data(shidu_int%10);
  276.                                 write_data(shidu_point/10);
  277.                                 write_data(shidu_point%10);
  278.                                 write_cmd(0x80+0x48);                //設置數據指針
  279.                                 write_data('W');                        //顯示溫度
  280.                                 write_data(tem_int/10);
  281.                                 write_data(tem_int%10);
  282.                                 write_data(tem_point%10);
  283.                         }
  284.                 }
  285.         }
  286. }

  287. void main()
  288. {
  289.         init_lcd();                        //初始化顯示屏
  290.         xianshi( );                        //顯示程序
  291. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久久久入口 | 中文在线a在线 | 精品一区二区三区在线视频 | 国产日韩精品视频 | 欧美一区二区三区大片 | 欧美日韩在线一区二区 | 不卡一区 | 欧美精品一区二区三区在线播放 | 亚洲一区在线日韩在线深爱 | 国产高清在线观看 | 亚洲电影免费 | 日韩成人在线网站 | 麻豆一区一区三区四区 | 欧美aⅴ片 | 国产精品日日做人人爱 | 在线看日韩 | 久久99精品久久久久 | 国产精品区一区二 | 日韩欧美在线视频 | 成年人网站免费 | 69av网| 综合精品 | 亚洲a视频 | 欧美成人免费在线视频 | 国产一区二区三区 | av中文字幕在线 | 一级黄色片网址 | 精品自拍视频在线观看 | 国产精品爱久久久久久久 | 久久久久久免费看 | 成人在线观看免费 | 色婷婷综合久久久中文字幕 | 一级午夜aaa免费看三区 | 伊人久久免费 | 久久国产精品一区二区 | 午夜天堂精品久久久久 | 欧美日韩国产精品激情在线播放 | 亚洲综合区| 毛片黄片免费看 | 欧美一区二区三区在线观看视频 | 久久色视频 |