专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

dth11温湿度传感器的单片机程序

作者:佚名   来源:本站原创   点击数:  更新时间:2012年12月17日   【字体:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
typedef bit BOOL  ;
sbit io = P1^0 ;
sbit rs = P2^4 ;
sbit rw = P2^5 ;
sbit ep = P2^6 ;
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)(P0 & 0x80) ;
  ep = 0 ;
  return result ;
}
void write_cmd(uchar cmd)// 写指令
{      
  while(lcd_bz()) ;
 rs = 0 ;
 rw = 0 ;
 ep = 0 ;
 P0 = 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 ;
   P0 = 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);
  
 }
}/**********************************************/
关闭窗口

相关文章