标题:
单片机湿度计 无法显示湿度传感器的数据
[打印本页]
作者:
懒爷驾到
时间:
2024-5-15 11:06
标题:
单片机湿度计 无法显示湿度传感器的数据
要求:上电或案件复位后自动显示"P",进入测量准备阶段;按测量开始键开始测量,当前环境的湿度在显示器上稳定显示;按测量结束键停止测量并返回"P"状态。问题:LCD无法显示"P";在按下“开始建”后,只显示个别字符(如图)且10秒(左右)后就消失了;无法显示湿度传感器的数据;按下“结束键”任何反应。
求各位大佬指点指点,在此谢过了
/******************************
基于51单片机的湿度计
主代码
********************************/
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include "DHT11.h"
#include "LCD.h"
#include "delay.h"
sbit Key_Begin = P2^0;
sbit Key_Over = P2^1;
unsigned char humiH,humiL;
void main()
{
while(1)
{
LCD1602_Init();//LCD1602初始化
LCD1602_Write_Cmd(0x82);//确定显示位置
LCD1602_Write_Data('P');//确定显示"P"
while(Key_Begin == 0)
{
LCD1602_Init();//LCD1602初始化
LCD1602_Come();//显示字符
DHT11_Rst();//DHT11初始化
DHT11_Check();//DHT11校验
DHT11_Read_Byte();//DHT11读取数据
DHT11_Read_Date(&humiH,&humiL);
Delay1000ms();
LCD1602_Write_Cmd(0x87);//确定显示地址
LCD1602_Write_Data(humiH);//确定显示内容 humiH
LCD1602_Write_Cmd(0x88);//地址
LCD1602_Write_Data(humiL);//内容 humiL
}
if(Key_Over ==0)
{
LCD1602_Init();//LCD1602初始化
LCD1602_Write_Cmd(0x82);//确定显示位置:第一行第一个
LCD1602_Write_Data('P');//确定显示"P"
}
}
}
/************************************
函数名称:LCD1602_Write_Cmd
输入参数:cmd-指令
输出参数:无
函数功能:LCD1602写指令
*********************************/
void LCD1602_Write_Cmd(char cmd)//接收数据
{
RS = 0;
RW = 0;
EN = 0;
//配置DB0-DB7的电平
Lcd_DataPort = cmd;
_nop_();
//延时tsp+tsp2的时间
EN = 1;
//EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
_nop_();
//延时tpm一段时间
EN = 0;
_nop_();
//延时tc-tpw时间
}
void LCD1602_Write_Data(char cmd)//读取数据
{
RS = 1;
RW = 0;
EN = 0;
//配置DB0-DB7的电平
Lcd_DataPort = cmd;
_nop_();
//延时tsp+tsp2的时间
EN = 1;
//EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
_nop_();
//延时tpm一段时间
EN = 0;
_nop_();
//延时tc-tpw时间
}
void LCD1602_Init(void)//初始化
{
//Delay15ms();
LCD1602_Write_Cmd(0x38);//写指令38H
// Delay5ms();
LCD1602_Write_Cmd(0x38);//显示模式设置
//Delay5ms();
LCD1602_Write_Cmd(0x38);//显示模式设置
LCD1602_Busy_Check();
LCD1602_Write_Cmd(0x38);
LCD1602_Busy_Check();
LCD1602_Write_Cmd(0x08);//显示关闭
LCD1602_Busy_Check();
LCD1602_Write_Cmd(0x01);//显示清屏
LCD1602_Busy_Check();
LCD1602_Write_Cmd(0x06);//显示光标移动设置
LCD1602_Busy_Check();
LCD1602_Write_Cmd(0x0c);//显示开及光标设置
}
void LCD1602_Busy_Check(void)//LCD1602忙信号检测
{
char tmp;//用来保存Lcd_date的电平状态
Lcd_DataPort = 0xff;//一开始的时候,Lcd_date设置成输入状态
do{
RS = 0;
RW = 1;
EN = 1;
_nop_();
//延时CP
tmp = Lcd_DataPort;
_nop_();
//延时PQ
EN = 0;
}while(tmp&0x80);//判断最高位是否为1
}
void LCD1602_Come(void)//LCD1602的读取主函数之字符显示
{
LCD1602_Write_Cmd(0x83);//确定显示位置
LCD1602_Write_Data('H');//确定显示内容
LCD1602_Write_Cmd(0x84);//地址
LCD1602_Write_Data('u');//内容,H
LCD1602_Write_Cmd(0x85);//地址
LCD1602_Write_Data('m');//内容,H
LCD1602_Write_Cmd(0x86);//地址
LCD1602_Write_Data(0x3A);//内容,:
LCD1602_Write_Cmd(0x89);//地址
LCD1602_Write_Data(0x25);//内容,%
while(1);
}
/**************************************************
复制代码
51hei图片仿真.png
(89.97 KB, 下载次数: 27)
下载附件
2024-5-15 11:03 上传
作者:
cy009
时间:
2024-5-15 22:26
第22行,初始化请放到 while(1) 的前面
作者:
lkc8210
时间:
2024-5-16 09:00
LCD1602无需频繁刷写
更无需频繁初始化
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1