專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

dth11溫濕度傳感器的單片機(jī)程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間: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忙碌狀態(tài)
{     
  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)//寫字節(jié)
{     
  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)//在某一地址上顯示一字節(jié)
{  
  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()//接收一個字節(jié)
{
 uchar i,temp,count;
 for(i=0;i<8;i++)
 {
  count=2;
  while((!io)&&count++)//等待50us低電平結(jié)束
  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()//接收數(shù)據(jù)
{
 uchar T_H,T_L,R_H,R_L,check,num_check;
 uchar count;
 start();//開始信號
 io=1;
 if(!io)//讀取DHT11響應(yīng)信號
 {
 count=2;
 while((!io)&&count++);//DHT11高電平80us是否結(jié)束
 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;
 }
 }
}
/*******
*************************************************主函數(shù)****/
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);
  
 }
}/**********************************************/
關(guān)閉窗口

相關(guān)文章