这个是用数码管显示的温湿度,原理跟液晶显示是一样的,只是处理显示有所不同。
代码:
//前三位显示湿度,后三位显示温度
#include<reg52.h>
#include <intrins.h>
sbit duan=P2^6;
sbit wei=P2^7;
typedef unsigned char unint8;
typedef unsigned char unint16;
unsigned char table0[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};//不带小数点
unsigned char table[]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
};//带小数点
unsigned char str1[]={" "};
unsigned char str2[]={" "};
sbit TRH = P3^0;//温湿度传感器DHT11数据接入
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
void disp(unint8 str1,unint8 str2,unint8 str3,unint8 str4,unint8 str5,unint8 str6);
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
// 毫秒级延时子程序
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//5us级延时程序
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
TRH=1;
//判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1[0] = table0[RH_data/10];
str1[1] = table[RH_data%10];
//湿度小数部分
str1[2] = table0[RL_data/10];
//温度整数部分
str2[0] =table0[TH_data/10];
str2[1] =table[TH_data%10];
//温度小数部分
str2[2] = table0[TL_data/10];
}
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
void main()
{
delay_us();
TMOD=0X01;//选择定时器工作方式
TH0=(65536-12000)/256;
TL0=(65536-12000)%256;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//启动定时器
while(1)
{
read_TRH();
}
}
void T0_timer() interrupt 1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
disp(str1[0],str1[1],str1[2],str2[0],str2[1],str2[2]);
}
void disp(unint8 str1,unint8 str2,unint8 str3,unint8 str4,unint8 str5,unint8 str6)
{
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=str1;
duan=0;
delay_ms(1);
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=str2;
duan=0;
delay_ms(1);
P0=0xff;
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=str3;
duan=0;
delay_ms(1);
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
duan=1;
P0=str4;
duan=0;
delay_ms(1);
P0=0xff;
wei=1;
P0=0xef;
wei=0;
duan=1;
P0=str5;
duan=0;
delay_ms(1);
P0=0xff;
wei=1;
P0=0xdf;
wei=0;
duan=1;
P0=str6;
duan=0;
delay_ms(1);
}