佚名通过本文主要向大家介绍了求助大神,用LCD1602显示AD0804采集的湿度传感器的数据,显示的数据发生跳变等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 求助大神,用LCD1602显示AD0804采集的湿度传感器的数据,显示的数据发生跳变
描述:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^2;
sbit rd=P3^1;
sbit cs=P3^0;
sbit lcrw=P2^6;
sbit lcden=P2^7;
sbit lcdrs=P2^5;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ lcrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{ lcrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
}
void AD_init()
{
cs=1;
wr=1;
rd=1;
}
void AD_start()
{
P1=0xff;
cs=0;
wr=0;
wr=1;
cs=1;
}
uchar AD_read()
{
uchar temp;
cs=0;
rd=0;
delay(1);
temp=P1;
rd=1;
cs=1;
return(temp);
}
void display(uchar bai,uchar shi,uchar ge)
{
write_com(0x80);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
show(uchar DATA) //显示
{
uchar a1,a2,a3,b1,b2,b3,i;/*定义变量*/
//读取P1口之前先给其写全1
//选通ADCS*/
//使AD读输入点使能
i=DATA; //把AD数据读取的数据赋给P1口
a1 = i%16 ; //分出数据的高位和低位转换成是进制
a2 = i/16*16 ;
a3 = a2+a3; //得到十进制的数据
b1=a3/100; //分出百,十,个位
b2=a3%100/10;
b3=a3%10;
display(b1,b2,b3);
}
//接着进入主函数:
main()
{
uchar ADC0804_data;
init();
while(1)
{
AD_init();
AD_start();
ADC0804_data=AD_read();
show(ADC0804_data);
delay(1000);
}
}
解决方案1:
描述:
传感器LCD1602AD0804
我的这个程序是用LCD1602显示AD0804采集的湿度传感器的数据,但是在液晶屏上数据发现跳变,复位时才显示当前湿度,但随后还是会跳变,从最高240可以跳变到最低0,跳变的间隔有时是8,16,之类的,求大神给予解答。#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^2;
sbit rd=P3^1;
sbit cs=P3^0;
sbit lcrw=P2^6;
sbit lcden=P2^7;
sbit lcdrs=P2^5;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ lcrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{ lcrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
}
void AD_init()
{
cs=1;
wr=1;
rd=1;
}
void AD_start()
{
P1=0xff;
cs=0;
wr=0;
wr=1;
cs=1;
}
uchar AD_read()
{
uchar temp;
cs=0;
rd=0;
delay(1);
temp=P1;
rd=1;
cs=1;
return(temp);
}
void display(uchar bai,uchar shi,uchar ge)
{
write_com(0x80);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
show(uchar DATA) //显示
{
uchar a1,a2,a3,b1,b2,b3,i;/*定义变量*/
//读取P1口之前先给其写全1
//选通ADCS*/
//使AD读输入点使能
i=DATA; //把AD数据读取的数据赋给P1口
a1 = i%16 ; //分出数据的高位和低位转换成是进制
a2 = i/16*16 ;
a3 = a2+a3; //得到十进制的数据
b1=a3/100; //分出百,十,个位
b2=a3%100/10;
b3=a3%10;
display(b1,b2,b3);
}
//接着进入主函数:
main()
{
uchar ADC0804_data;
init();
while(1)
{
AD_init();
AD_start();
ADC0804_data=AD_read();
show(ADC0804_data);
delay(1000);
}
}
解决方案1:
你先确保你的延时时间比较长,比如200ms以上,从程序上看,延时还是比较短的.