我用DHT11,89c52和lcd1602设计的温湿度检测,显示的数据有问题,显示的位置也跟写入的地址不一样,求教!

我用DHT11,89c52和lcd1602设计的温湿度检测,显示的数据有问题,显示的位置也跟写入的地址不一样,求教!,第1张

程序没写好吧,DHT11的时序相当严谨的,不按照时序来就会出现乱码,而且不同厂家的也有差别。建议你先一个模块一个模块去测试,先搞定DHT11读取数据用串口调试发送数据,再去弄LCD1602那块。。。

分析:显示数据有问题原因是DHT11的时序没读好;

显示的位置与地址不一样原因可能是1、程序有错 2、DHT11发送的数据为1602不可识别的字符

液晶屏可分为字符型和点阵型,还可以分单色和彩色

LCD1602是字符型单色显示器件 

LCD1602工作原理不需深究,只要知道它能干什么,怎么用就行.

对使用者而言,要知道三根控制线 片选LCDEN命令/数据选择RS 读写控制线RW

及8根数据线

初始化之后要显示时,可以先送一个地址(送地址属于命令),然后再送去要显示字符的ASCI码(数据)就行,地址会自动加1,送一次地址可连续送多个数据,

第一行第1列地址是80H

第二行第1列地址是80H+40H

C语言写数据和命令的子程序如下:

void write_com(uchar com)//写命令

{

db=com;//db是数据口

rs=0;

rw = 0;

lcden=0;

Delay1ms(10);

lcden=1;

Delay1ms(10);

lcden=0;

}

void write_date(uchar date)//写数据

{

db=date;

rs=1;

rw = 0;

lcden=0;

Delay1ms(10);

lcden=1;

Delay1ms(10);

lcden=0;

}

void init2()//初始化

{

beiguang=0;

rw=0;

write_com(0x38);

Delay1ms(10);

write_com(0x0f);

Delay1ms(10);

write_com(0x06);

Delay1ms(10);

write_com(0x01);

Delay1ms(10);

}

实际应用例子:A1 A2等是数字,加上0X30即为其ASCI码

void display4(unsigned int temp) //1行多位显示程序

{

init2();

A1=temp/1000%10;//分离个、十、百、千位 如果数比较大,还要分离出万位,因INT型 //变量最大是65535

A2=temp/100%10;

A3=temp/10%10;

A4=temp%10;

write_com(0x80);

Delay1ms(10);

write_date(0x30+A1);

Delay1ms(10);

write_date(0x30+A2);

Delay1ms(10);

write_date(0x30+A3);

Delay1ms(10);

write_date(0x30+A4);

Delay1ms(10);

write_com(0x85);

write_date('m');//显示字符"m"用单引号 即可

Delay1ms(10);

write_date('A');

Delay1ms(10);

}

LCD应该有指定传送数据、命令的指令代码!不知道你硬件是连接的,是经过控制器连接,还是直接连到一起了。要是控制器就好弄,挨个发送命令呗 要是直接连的,那你在发送无限数据的时候就应该带上控制命令了!

#include <reg51h>

#define uchar unsigned char

#define uint unsigned int

#define lcd_ports P1

sbit lcdrs=P3^5;

sbit lcdrw=P3^3;

sbit lcde=P3^4;

void delay(uint z) //延迟子程序

{

uchar i,j;

for(i=z;i>0;i--)

for(j=256;j>0;j--);

}

void write_com(uchar com) //1602写指令

{

lcdrs=0;

P1=com;

delay(5);

lcde=1;

delay(5);

lcde=0;

}

void write_data(uchar date) //1602写数据,写的是你要显示数据的ASCLL码值

{

lcdrs=1;

P1=date;

delay(5);

lcde=1;

delay(5);

lcde=0;

}

void init() //初始化

{

lcdrw=0;

lcde=0;

write_com(0x38); //使液晶显示点阵

write_com(0x0e); //初始设置

write_com(0x06); //初始设置

write_com(0x01); //清零

write_com(0x80+0x00); //使指针指向第一行第一列

}

void main()

{

init();

while(1){

write_com(0x80);//从第一行第一列开始写数据。

write_data(0x73); //显示s字符

write_data(0x69);//第一行第二列显示字符i

write_data(0x6e);//第一行第三列显示字符n

write_data(0x65);//第一行第四列显示字符e;}

}

1可能是显示屏已经损坏,建议拿一个确保好的1602进行测试。

2程序可能还存在错误,建议进行单步查找,查看每一步的结果是不是与自己所想一致,这样才能确保程序真的没错。

3检查接线,用万用表逐一检查导线,查看导线是否导通。接着再细致对照电路图进行接线检查,建议从一个节点出发一个部分一个部分的进行连接(或检查),最后进行整体的检查。

4检查与1602连接的其他器件是否完好,如和单片机连接,查看单片机是否良好。

5确保屏是好的前提下,如果全不亮,看一下15 16引脚的解法是否正确,它们主管显示屏的亮度 再看3它管对比度。

以上就是关于我用DHT11,89c52和lcd1602设计的温湿度检测,显示的数据有问题,显示的位置也跟写入的地址不一样,求教!全部的内容,包括:我用DHT11,89c52和lcd1602设计的温湿度检测,显示的数据有问题,显示的位置也跟写入的地址不一样,求教!、单片机应用技术 液晶种类和lcd1602工作原理、谁知道无线数据传输接收的数据用LCD1602显示的程序怎么写接收程序和LCD显示程序怎么衔接啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9479939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存