找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 547|回复: 2
收起左侧

单片机湿度计 无法显示湿度传感器的数据

[复制链接]
ID:1053020 发表于 2024-5-15 11:06 | 显示全部楼层 |阅读模式
要求:上电或案件复位后自动显示"P",进入测量准备阶段;按测量开始键开始测量,当前环境的湿度在显示器上稳定显示;按测量结束键停止测量并返回"P"状态。问题:LCD无法显示"P";在按下“开始建”后,只显示个别字符(如图)且10秒(左右)后就消失了;无法显示湿度传感器的数据;按下“结束键”任何反应。

求各位大佬指点指点,在此谢过了
  1. /******************************
  2. 基于51单片机的湿度计
  3. 主代码
  4. ********************************/
  5. #include <reg52.h>
  6. #include <intrins.h>
  7. #include <absacc.h>
  8. #include <math.h>
  9. #include "DHT11.h"
  10. #include "LCD.h"
  11. #include "delay.h"
  12.         
  13. sbit Key_Begin = P2^0;
  14. sbit Key_Over = P2^1;

  15. unsigned char humiH,humiL;

  16. void main()
  17. {
  18.         while(1)
  19.         {
  20.                 LCD1602_Init();//LCD1602初始化
  21.                 LCD1602_Write_Cmd(0x82);//确定显示位置
  22.                 LCD1602_Write_Data('P');//确定显示"P"
  23.         
  24.                 while(Key_Begin == 0)
  25.                 {
  26.                         LCD1602_Init();//LCD1602初始化
  27.                         LCD1602_Come();//显示字符
  28.                         
  29.                         DHT11_Rst();//DHT11初始化
  30.                         DHT11_Check();//DHT11校验
  31.                         DHT11_Read_Byte();//DHT11读取数据
  32.                         DHT11_Read_Date(&humiH,&humiL);
  33.                         Delay1000ms();
  34.                         
  35.                         LCD1602_Write_Cmd(0x87);//确定显示地址
  36.                         LCD1602_Write_Data(humiH);//确定显示内容 humiH
  37.                         LCD1602_Write_Cmd(0x88);//地址
  38.                         LCD1602_Write_Data(humiL);//内容 humiL
  39.                 }
  40.                 if(Key_Over ==0)
  41.                 {
  42.                         LCD1602_Init();//LCD1602初始化
  43.                         LCD1602_Write_Cmd(0x82);//确定显示位置:第一行第一个
  44.                         LCD1602_Write_Data('P');//确定显示"P"
  45.                 }
  46.         }
  47. }

  48. /************************************
  49. 函数名称:LCD1602_Write_Cmd
  50. 输入参数:cmd-指令
  51. 输出参数:无
  52. 函数功能:LCD1602写指令
  53. *********************************/
  54. void LCD1602_Write_Cmd(char cmd)//接收数据
  55. {
  56.         RS = 0;
  57.         RW = 0;
  58.         EN = 0;
  59.         //配置DB0-DB7的电平
  60.         Lcd_DataPort = cmd;
  61.         _nop_();
  62.         //延时tsp+tsp2的时间
  63.         EN = 1;
  64.         //EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
  65.         _nop_();
  66.         //延时tpm一段时间
  67.         EN = 0;
  68.         _nop_();
  69.         //延时tc-tpw时间
  70. }

  71. void LCD1602_Write_Data(char cmd)//读取数据
  72. {
  73.         RS = 1;
  74.         RW = 0;
  75.         EN = 0;
  76.         //配置DB0-DB7的电平
  77.         Lcd_DataPort = cmd;
  78.         _nop_();
  79.         //延时tsp+tsp2的时间
  80.         EN = 1;
  81.         //EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
  82.         _nop_();
  83.         //延时tpm一段时间
  84.         EN = 0;
  85.         _nop_();
  86.         //延时tc-tpw时间
  87. }

  88. void LCD1602_Init(void)//初始化
  89. {
  90.         //Delay15ms();
  91.         LCD1602_Write_Cmd(0x38);//写指令38H
  92. //        Delay5ms();
  93.         LCD1602_Write_Cmd(0x38);//显示模式设置
  94.         //Delay5ms();
  95.         LCD1602_Write_Cmd(0x38);//显示模式设置
  96.         LCD1602_Busy_Check();
  97.         LCD1602_Write_Cmd(0x38);
  98.         LCD1602_Busy_Check();
  99.         LCD1602_Write_Cmd(0x08);//显示关闭
  100.         LCD1602_Busy_Check();
  101.         LCD1602_Write_Cmd(0x01);//显示清屏
  102.         LCD1602_Busy_Check();
  103.         LCD1602_Write_Cmd(0x06);//显示光标移动设置
  104.         LCD1602_Busy_Check();
  105.         LCD1602_Write_Cmd(0x0c);//显示开及光标设置
  106. }

  107. void LCD1602_Busy_Check(void)//LCD1602忙信号检测
  108. {
  109.         char tmp;//用来保存Lcd_date的电平状态
  110.         Lcd_DataPort = 0xff;//一开始的时候,Lcd_date设置成输入状态
  111.         do{
  112.                 RS = 0;
  113.                 RW = 1;
  114.                 EN = 1;
  115.                 _nop_();
  116.                 //延时CP
  117.                 tmp = Lcd_DataPort;
  118.                 _nop_();
  119.                 //延时PQ
  120.                  EN = 0;
  121.                 }while(tmp&0x80);//判断最高位是否为1
  122. }

  123. void LCD1602_Come(void)//LCD1602的读取主函数之字符显示
  124. {
  125.         LCD1602_Write_Cmd(0x83);//确定显示位置
  126.         LCD1602_Write_Data('H');//确定显示内容
  127.         LCD1602_Write_Cmd(0x84);//地址
  128.         LCD1602_Write_Data('u');//内容,H
  129.         LCD1602_Write_Cmd(0x85);//地址
  130.         LCD1602_Write_Data('m');//内容,H
  131.         LCD1602_Write_Cmd(0x86);//地址
  132.         LCD1602_Write_Data(0x3A);//内容,:
  133.         LCD1602_Write_Cmd(0x89);//地址
  134.         LCD1602_Write_Data(0x25);//内容,%
  135.         while(1);
  136. }


  137. /**************************************************
复制代码



51hei图片仿真.png
回复

使用道具 举报

ID:619259 发表于 2024-5-15 22:26 | 显示全部楼层
第22行,初始化请放到 while(1) 的前面

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:161164 发表于 2024-5-16 09:00 | 显示全部楼层
LCD1602无需频繁刷写
更无需频繁初始化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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