源程序代码 1.主函数部分 #include <reg52. h> //51 系列单片机 #inc lude<intr ins. h> #include<stdio. h> #inc lude"De lay. h" #inc lude"DHT11. H" #define uint unsigned int //宏定 义 #define ulint unsigned long int //宏定义 #def ine uchar uns i gned char /*有符号8位整型变量 */ #define KeyPort P3 #define len 60 #define DataPort PO //LCD1602数据端 uchar flag_ MQ7, flag_ MQ2, flag_ TSC, flag_ RED, flag_ SHAKE, flag_ FI RE; uchar rh_ _h_ dat, rh_ I_ _dat, t_h_ _dat,t_ _I_ _dat, jy_ _dat, check; uchar a,b,c,d,e, f; uchar ge, shi, bai, qi an, wan, shiwan; //显示变量 uchar flag_ RH=0, flag_ T=0, flag_ main=1; uchar RH_ c, T_ c; uchar shidu, flag; unsigned char flag1=0, flag_ alarm, flag_ alarm1=0; uchar number TO, numberT1 ; uchar a1=0, b1=20, c1=0, d1=0; uchar Sendbuf[]=" ABCD\r\n"; void DHT11(); void SendByte (uns igned char dat) ; void convers ion(long temp_ data) ; void Wr iteDataLCM (uchar dataW) ; void Wr iteCommandL CM (uchar CMD, uchar Attribc) ; void Displ ayOneChar (uchar X, uchar Y, uchar DData) ; void InitLcd(); void loading() ; void show_ main() ; void show_ RH() ; void show_ T(); void SendStr (unsigned char *s) ;//发送一个字节 void suspend_ int() ; void SendByte (uns igned char dat) ; sbit LCM_ RS=P2^2;. //LCD1602 命令端口 sbit LCM_ RW=P2^1; //LCD1602 命令端口 sbit LCM_ EN=P2^ 0; //LCD1602 命令端口 sbit key1=P1" 2; sbit bee=P2 5; void InitLcd () Wr iteCommandl .CM (0x38, 1) ; Wr iteCommandL .CM (0x08, 1) ; Wr iteCommandLCM(0x01, 1); Wr iteCommandL CM (0x06, 1) ; Wr iteCommandl .CM (0x0c, 1) ; } /*******************************/ void Displ ayOneChar (uchar X, uchar Y, uchar DData) Y&=1; X&=15; if (Y)X |=0x40; x|=0x80; Wr iteCommandl .CM(X, 0) ; Wr iteDataLCM (DData) ; } void WaitForEnable (void) DataPor t=0xff; LCM_ RS=0;LCM_ RW=1;_ nop_ () ; LCM_ EN=1; .nop_ 0); _nop_ 0); whi le (DataPort&0x80) ; . LCM_ EN=0; /****************************/ void Wr iteCommandL CM (uchar CMD, uchar Attr ibc) if (Attr ibe) WaitForEnable() ; LCM_ RS=0;LCM_ RW=0;_ nop_ () ; DataPort=CMD; _nop_ 0); _nop_ () ; LCM_ EN=1;_ nop_ 0; nop_ ();LCM_ EN=0; /****************************/ void Wr iteDataLCM (uchar dataW) Wa itForEnable() ; LCM_ RS=1;LCM_ _RW=0; _nop_ 0; DataPort=dataW;_ nop_ 0); nop_ (): LCM_ EN=1; _nop_ (); _nop_ () ;LCM_ EN=0; } void DHT11() read() ; if(flag==1) { a = 0x30+t_ h_ dat/10; //分离温度十位 b = 0x30+t_ h_ dat%10; //分离温度个位 e = 0x30+rh_ h_ dat/10; //分离湿度十位 f= 0x30+rh_ h_ _dat%10; // 分离湿度个位 Sendbuf[0]=e; Sendbuf[1]=f; Sendbuf[2]=a; Sendbuf [3]=b; de lay (30) ; } void convers ion(long temp data) // 取值运算 { shiwan=temp_ data/100000+0x30 ; temp_ data=temp_ _data%100000; // 取余运算 wan=temp_ data/ 10000+0x30 ; temp_ data=temp_ data%10000; // 取余运算 qian=temp_ data/ 1000+0x30 ; temp_ _data=temp_ _data%1000; //取余运算 ba i=temp_ _data/ 100+0x30 temp_ data=temp_ data%100; //取余运算 shi=temp_ data/ 10+0x30 temp_ data=temp_ data%10; //取余运算 ge=temp_ data+0x30; } void show main() void show_ main() { InitLcd() ; DisplayOneChar(3, 0, e); DisplayOneChar(4, 0. f); DisplayOneChar (5.0, '%'); //湿度显示 DisplayOneChar (6, 0, 'R'); DisplayOneChar(7,0, 'H'); De | ayMs(1) ; Displ ay0neChar (9, 0,'T'); Di spl ay0neChar(10,0, ':); Di spl ay0neChar(11,0, a); DisplayOneChar(12, 0, b) ; //温度显示 Disp | ay0neChar (13, 0, 0XDF) ; Di spl ay0neChar(14,0, 'C'); } void loading () DisplayOneChar(3, 0,'L'); DisplayOneChar(4, 0,'o'); DisplayOneChar(5,0,'a'); DisplayOneChar (6, 0, 'd'): DisplayOneChar(7,0,'i'); Disp lay0neChar(8, 0, 'n'); Displ ay0neChar (9,0,'g'); Displ ay0neChar(10,0,'.'); DisplayOneChar(11.0.'.'); DisplayOneChar(12, 0,'. ); /*------- 发送一个字符串. void SendByte (uns igned char dat) SBUF = dat; while(!TI); TI=0; void SendStr (unsigned char *s) while(*s!='\0')// \0表示字符串结束标志,通过检测是否 字符串末尾 SendByte (*s) ; s++; } void InitUART (void) //串口初始化 { SCON = 0x50; . // SCON: 模式1, 8-bit UART,使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit重装 TH1 = 0xFD; // TH1:重装值9600波 特率晶振11.0592MHz TR1 =1; // TR1: timer 1打开 EA = 1; //打开总中断 // ES = 1; //打开串口中断 } void UART_ SER (void) interrupt 4 // 串行中断服务程序 uns igned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于 观察 SBUF=Temp; //把接收到的值再发回 电脑端 if(TI) //如果是发送标志位,清 零 TI=0; } void main() { bee=0; InitLcd () ;//液晶初始化 loading() ; DelayMs (100) ; InitUART(); if (key1==0) while(1) DHT11() ;//湿度温度数据读取 De I ayMs (50) ; show_ main( ; DelayMs (200) ; SendStr (Sendbuf) ; } } 2 DHT11部分 /*DHT11温湿传感器驱动*/ #include <reg52. H> #inc lude"Delay. h" #inc lude"DHT11. h" #inc lude<intrins. h> #inc lude<stdio. h> sbit DQ=P2' 5; //DHT11 数据线//单总线 10 extern uchar rh_ h_ dat, rh_ I_ dat,t_ _h_ dat, t_ I_ dat, jy_ dat, check; uint count; extern uchar shidu, flag; uchar k=0x10; . bit DHT_ init() //DHT11的初始存在 bit f=0; DQ=1; _ nop_ 0; DQ=0; //拉低总线大于18ms delay(18) ; DQ=1; //拉高 delay10us(); de lay10us(); delay10us() ; delay10us0; //延时30us while(!DQ) //DHT 响应80us的低电平信号 { f=1; } while(DQ); //dht 在拉高80us return f; uchar rdat() //读一个字节 uint i, dat; for(i=0;i<8;i++) while(!DQ) ; _nop 0; nop_ 0;_ nop_ (); while (DQ) count++; dat=_ crol_ (dat, 1) ; if (count>5) // 高低电平信号的时间不同,若大于50ms则为1 { else //否则为0 dat=dat&Oxfe; count=0; . nop_ (); nop_ 0; _nop_ 0; return dat; } void read() //读5个字节的 bit f; f=DHT_ init(); if(f==1) rh_ _h_ dat=rdat(); //前两个是湿度的整数、小数 rh_ 1 _dat=rdat () ; t_ h_ _dat=rdat(); //后两个是温度的整数小数 t_ 1_ _dat=rdat(); jy_ dat=rdat(); //最后-位校验位 DQ=1; check=rh_ h_ _dat+rh_ I_ dat+t_ h_ _dat+t_ 1_ dat; //检验数据是否 正确 i--; i-- ; i--; } /*-- mS延时函数,含有输入参数unsigned char t, 无返回值 void De layMs (unsigned int t) { while(t--) int d; for (d=100;d>0;d--); delay10us () ; } i--; i-- ; i--; } /*-- mS延时函数,含有输入参数unsigned char t, 无返回值 void De layMs (unsigned int t) { while(t--) int d; for (d=100;d>0;d--); delay10us () ; }
|