delay1();
temp=0;//时间为26us-28us?表示接收的为数据'0'
if(io==1) temp=1; //如果26us-28us之后?还为高电平?则表示接收的数据为'1'
while(io);//等待数据信号高电平?'0'为26us-28us?'1'为70us?
data_byte<<=1;//接收的数据为高位在前?右移? data_byte|=temp; }
return data_byte; }
void receive()//接收数据// {
uchar T_H,T_L,R_H,R_L,check,num_check,i;
start();//开始信号//
io=1; //主机设为输入?判断从机?DHT11?响应信号
if(!io)//判断从机是否有低电平响应信号//
{ while(!io);//判断从机发出 80us 的低电平响应信号是否结束// while(io);//判断从机发出 80us 的高电平是否结束?如结束则主机进入数据接收状态 R_H=receive_byte();//湿度高位
R_L=receive_byte();//湿度低位 T_H=receive_byte();//温度高位
T_L=receive_byte();//温度低位 check=receive_byte();//校验位 io=0; //当最后一bit数据接完毕后?从机拉低电平50us// for(i=0;i<7;i++)//差不多50us的延时 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();//初始化LCD
while(1) {
receive();//接收数据
display(0x00,'R');//LCD的第一行显示
display(0x01,':');
display(0x02,RH/10+0x30); //0x30表示?带字库的LCD1602中0x30的位置放有数字0?RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着?
display(0x03,RH+0x30);
display(0X04,'%');
display(0x40,'T');//LCD的第二行显示
display(0x41,':');
display(0x42,TH/10+0x30);
display(0x43,TH+0x30);
display(0x44,0xdf);//以下两个是温度单位的处理
display(0x45,0x43); } }
另附效果图:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DHT11温湿度传感器51单片机在LCD1602显示程序(2)在线全文阅读。
相关推荐: