基于单片机的dht11湿度温度检测不显示问题
用stc90c516rd+烧写该程序,在开发板上实验,lcd1602显示屏上不会显示温度和湿度,怎么回事啊
,是程序问题还是所用芯片不对呀,求助。(该程序是在网上找的)
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
typedef bit BOOL ;
sbit io = P2^0 ;
sbit rs = P2^7;
sbit rw = P2^6 ;
sbit ep = P2^5 ;
uchar data_byte;
uchar RH,RL,TH,TL;
/**************延时模块***************/
void delay(uchar ms)
{ // 延时子程序
uchar i ;
while(ms--)
{
for(i = 0 ; i<250;i++) ;
}
}
void delay1()//延时10us
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void longdelay(uchar s) //长延时
{
while(s--)
{
delay(60) ;
}
}
/************LCD模块************/
BOOL lcd_bz()//测试LCD忙碌状态
{
BOOL result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (BOOL)(P1 & 0x80) ;
ep = 0 ;
return result ;
}
void write_cmd(uchar cmd)// 写指令
{
while(lcd_bz()) ;
rs = 0 ;
rw =0 ;
ep = 0 ;
P1 = cmd ;
ep = 1 ;
ep = 0 ;
}
void write_addr(uchar addr)//写地址
{
write_cmd(addr|0x80) ;
}
void write_byte(uchar dat)//写字节
{
while(lcd_bz()) ;
rs = 1 ;
rw = 0 ;
ep = 0 ;
P1 = dat ;
ep = 1 ;
ep = 0 ;
}
void lcd_init()// 初始化
{
write_cmd(0x38) ;
delay(1);
write_cmd(0x08) ;
delay(1);
write_cmd(0x01) ;
delay(1);
write_cmd(0x06) ;
delay(1);
write_cmd(0x0c) ;
delay(1);
}
void display(uchar addr, uchar q)//在某一地址上显示一字节
{
delay(10) ;
write_addr(addr) ;
write_byte(q) ;
longdelay(2) ;
}
/************DHT11测试模块************/
void start()//开始信号
{
io=1;
delay1();
io=0;
delay(20);//>18ms
io=1;
delay1();//20-40us
delay1();
delay1();
delay1();
delay1();
}
uchar receive_byte()//接收一个字节
{
uchar i,temp,count;
for(i=0;i<8;i++)
{
count=2;
while((!io)&&count++)//等待50us低电平结束
temp=0;
delay1();delay1();delay1();delay1();
if(io==1)temp=1;
count=2;
while((io)&&count++);
if(count==1)break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
void receive()//接收数据
{
uchar T_H,T_L,R_H,R_L,check,num_check;
uchar count;
start();//开始信号
io=1;
if(!io)//读取DHT11响应信号
{
count=2;
while((!io)&&count++);//DHT11高电平80us是否结束
count=2;
while((io)&&count++);
R_H=receive_byte();
R_L=receive_byte();
T_H=receive_byte();
T_L=receive_byte();
check=receive_byte();
io=0; //拉低延时50us
delay1();delay1();delay1();delay1();delay1();
io=1;
num_check=R_H+R_L+T_H+T_L;
if(num_check=check)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
check=num_check;
}
}
}
/************主函数************/
void main()
{
lcd_init();
delay(10);
while(1)
{
receive();
delay(100);
display(0x00,'R') ;
display(0x01,':');
display(0x02,RH/10+0x30);
display(0x03,RH%10+0x30);
display(0x04,'%');
display(0x40,'T') ;
display(0x41,':');
display(0x42,TH/10+0x30);
display(0x43,TH%10+0x30);
display(0x44,0xdf);
display(0x45,0x43);
}
}
/************结束************/
亲测可用
#include<reg52.h>
#include <intrins.h>
//
#define uchar unsigned char
#define uint unsigned int
uchar busy; //12864判忙标志
uchar a=0;
uchar key1num=0;
uchar dis0[]={"12345678"};
uchar dis1[]={"12 45 "};
/*端口定义*/
/*定义12864液晶屏数据线------------------------------------------------------*/
sbit LCM_CS = P1^0; //模式位,为0输入指令,为1输入数据
sbit LCM_RW = P1^1; //读写位,为0读,为1写
sbit LCM_EN = P1^2; //使能位
sbit LCM_POS = P1^3;
#define Lcd_data P0 //LCM12864数据总线
sbit p33= P3^7; //温度数据线,这里使用的是51单片机P37,根据个人情况修改
/*延时程序-------------------------------------------------------------------*/
//延时函数 1MS/次
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
/*12864液晶显示屏并口驱动程序------------------------------------------------*/
//检查忙位(底层)
void chk_busy()
{
do
{
LCM_EN=0; //发送LCD是否忙查询指令
LCM_RW=1;
LCM_CS=0;
LCM_EN=1;
busy=Lcd_data; //获得数据
LCM_EN=0;
delayms(1);
} while(busy&&0x80==1); //如果忙则继续等待
}
//写指令到LCD(底层)
void write_com(uchar cmdcode)
{
LCM_CS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_data=cmdcode;
delayms(5);
LCM_EN=0;
delayms(5);
}
//写数据到LCD(底层)
void write_data(uchar Dispdata)
{
chk_busy();
LCM_CS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_data=Dispdata;
delayms(5);
LCM_EN=0;
delayms(5);
}
/*set position*/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{
X=0x80;
}
else if(X==1)
{
X=0x90;
}
else if(X==2)
{
X=0x88;
}
else if(X==3)
{
X=0x98;
}
pos=X+Y;
write_com(pos);//diaplay the address
}
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
void Delay(U16 j) //100us延时
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //进入函数3us
{
U8 i; //1us
i--; //1us
i--;
i--;
i--;
i--;
i--;
}
void COM(void) //串行读一个字节数据
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!p33)&&U8FLAG++);//自加254次 默认执行下面程序 50us低电平结束判断
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0; //判断数据位是0还是1 如果高电平高过预定0高电平值则数据位为 1
if(p33)U8temp=1;
U8FLAG=2;
while((p33)&&U8FLAG++); //等待0/1高电平信号结束
//超时则跳出for循环
// if(U8FLAG==1)break; //经历255us 在这里不会执行
U8comdata<<=1;
U8comdata|=U8temp;
}
}
void RH(void)
{
//主机拉低18ms
p33=0;
Delay(180);
p33=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
p33=1;
//判断从机是否有低电平响应信号 如不响应则不读数据,响应则向下运行
if(!p33) //p20==0往下执行
{
U8FLAG=2;
//判断从机发出 80us 的低电平响应信号是否结束
while((!p33)&&U8FLAG++); //强制低电平信号最长为254us
U8FLAG=2;
//判断从机发出 80us 的高电平,如发出则进入数据接收状态
while((p33)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
p33=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp; //低八位为0
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp; //低八位为0
U8checkdata=U8checkdata_temp;
}
}
}
//初始化LCD屏(被调用层)
void lcd_init()
{
LCM_POS=1; //bingkoufangshi
write_com(0x30); //选择8bit数据流
delayms(5);
write_com(0x0c); //开显示(无游标、不反白)
delayms(5);
write_com(0x01); //清除显示,并且设定地址指针为00H
delayms(5);
}
void main()
{
uchar i;
lcd_init(); //initiate the LCD
i=0;
/* while(1)
{
getDHT11();
chuli();
fenjie();
lcd_pos(0,0);
for(i=0;i<8;i++)
{
write_data(dis1[i]);
}
}*/
Delay(20000);
while(1)
{
RH(); //调用温湿度读取子程序
// display2(U8RH_data_H/10%10,U8RH_data_H%10,U8T_data_H/10%10,U8T_data_H%10);
lcd_pos(0,0);
for(i=0;i<8;i++)
{
write_data(dis0[i]);
}
dis1[0]=U8RH_data_H/10%10+0x30;
dis1[1]=U8RH_data_H%10+0x30;
dis1[3]=U8T_data_H/10%10+0x30;
dis1[4]=U8T_data_H%10+0x30;
lcd_pos(1,0);
for(i=0;i<8;i++)
{
write_data(dis1[i]);
}
}
}
如果是lcd1602屏,你那个程序能不能用的啊?不行的话要怎么改动啊?
只需要改相应的显示函数部分 其他都一样
我试一试看、、、、、、、、、、、、
可以呀,如果你把对应的IO口改对就可以显示了,看的时候注意下背光
不能正常变化啊、!
这个测量温湿度的程序是对的吗