求助大神,用LCD1602显示AD0804采集的湿度传感器的数据,显示的数据发生跳变

learner66 2014-11-25 08:26:27
我的这个程序是用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);
}
}

...全文
1771 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
ADC0804_data=AD_read(); 读AD前把中断关了,加EA=0; 读完再打开,EA=1;
learner66 2014-11-25
  • 打赏
  • 举报
回复
引用 楼主 learner66 的回复:
您说的是哪里的延时?
learner66 2014-11-25
  • 打赏
  • 举报
回复
我用过10秒延时的,但是没有,还是跳变的,甚至跳变的间隔更大了。应该不是环境所导致的波动吧
sprawling 2014-11-25
  • 打赏
  • 举报
回复
你先确保你的延时时间比较长,比如200ms以上,从程序上看,延时还是比较短的.

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧