找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2008|回复: 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 单片机教程网

快速回复 返回顶部 返回列表