程序没写好吧,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显示程序怎么衔接啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)