这是智能家居系统中窗户开关控制部分,适用于51单片机,全部原创。DHT11温湿度传感器通过1602显示。
单片机源程序如下:
- //11.0592MHz单片机STC89C52RC;DHT11在LCD1602显示
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /***********端口定义**************/
- sbit RS=P2^0;//1602RS端口
- sbit RW=P2^1;//1602RW端口
- sbit E=P2^5;//1602E端口
- //LCD1602数据口接P0
- sbit IO=P2^7;//dht11数据口
- sbit I1=P2^3;
- sbit l1=P1^0;
- sbit l2=P1^1;
- /*sbit l3=P1^2;
- sbit l4=P1^3;
- sbit l5=P1^4;
- sbit l6=P1^5;
- sbit l7=P1^6;
- sbit l8=P1^7; */
- bit RXAAOK; //接收到0XAA开头标志
- bit RXFRMOK; //接收一帧完整数据标
- uchar RXBUF[32],TXBUF[32]; //接收缓存
- uchar RX_P; //数据个数
-
- /**********变量定义*****************/
- uint timeout;//溢出
- uchar RH_H;//温度整数位
- uchar RH_L;// 温度小数位
- uchar T_H;// 湿度整数位
- uchar T_L;// 湿度小数位
- uchar Cheakdata;//校验位
- uint timeout1;//溢出
- uchar RH_H1;//温度整数位
- uchar RH_L1;// 温度小数位
- uchar T_H1;// 湿度整数位
- uchar T_L1;// 湿度小数位
- uchar Cheakdata1;//校验位
- uchar PM2_5;
- uchar PM10;
- /**********************************/
- /*****延时1ms******/
- void Delay1ms(uchar c) //1ms延时
- {
- uchar i, j;
- for(;c>0;c--)
- {
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- /*****延时10us******/
- void Delay10us(void) //10us延时
- {
- uchar i;
- {
- i = 2;
- while (--i);
- }
- }
- void UART_init()
- {
- TMOD = 0x20; //T1工作模式2 8位自动重装
- TH1 = 0xfd; //11111101
- TL1 = 0xfd; //比特率9600
- TR1 = 1; //启动T1定时器
- SM0 = 0;
- SM1 = 1; //串口工作方式1 10位异步
- REN = 1; //串口允许接受
- EA = 1;
- ES = 1;
- }
- void UARTO_ISR() interrupt 4 //接收中断
- {
- uchar i,j; //用处提取接收缓冲器的字符
- if(RI)
- {
- i=SBUF; //提取字符
- RI=0;
- if(RXFRMOK == 0) //判断是否接收到起始字符0XAA
- {
- if(RXAAOK) //如果接收到0XAA,继续接收后面的字符
- {
- RXBUF[RX_P]=i; //字符存入数组
- if((RX_P>3)&&(RXBUF[RX_P] == 0xab) ) //判断是是否接收完毕一帧数据
- {
- RXFRMOK=1; //如果接收完成,置位RXFRMOK;
- RXAAOK=0; //清零开始标志位RXAAOK
- }
- RX_P++; //接收计数器加一
- }
- if(!RXAAOK&&(i==0xaa))
- {
- RXAAOK=1;
- RX_P=0;
- }
- }
- }
- for(j = 0;j < 4;j++)
- {
- TXBUF[j] = RXBUF[j+1]; //提取中间四位
- }
- /*for(j = 0;j < 4;j++)
- {
- SBUF = TXBUF[j];
- while(!TI);
- TI = 0;
- } */
- }
- /****1602忙检测函数****/
- uchar LCD1602_BUSY()//读状态
- {
- uchar state;
- RS=0;
- RW=1;
- P0=0xFF;
- E=1;
- Delay1ms(1);
- E=0;
- return state;
- }
- /*****1602写数据函数带忙检测*****/
- void LCD1602_WRITE_DATA_BUSY(uchar databuf)
- {
- while((LCD1602_BUSY()&&0x80)==0x80);
- RS=1;
- RW=0;
- P0=databuf;
- E=1;
- E=0;
- }
- /****1602写指令函数******/
- void LCD1602_WRITE_COM(uchar combuf)
- {
- RS=0;
- RW=0;
- P0=combuf;
- E=1;
- E=0;
- }
- /****1602写指令函数带忙检测******/
- void LCD1602_WRITE_COM_BUSY(uchar combuf)
- {
- while((LCD1602_BUSY()&&0x80)==0x80);
- RS=0;
- RW=0;
- P0=combuf;
- E=1;
- E=0;
- }
- /****1602初始化函数******/
- void LCD1602_init(void)
- {
- Delay1ms(15);//15ms
- LCD1602_WRITE_COM(0x38);
- Delay1ms(5);//5ms
- LCD1602_WRITE_COM(0x38);
- Delay1ms(5);//5ms
- LCD1602_WRITE_COM(0x38);
- LCD1602_WRITE_COM_BUSY(0x38);
- LCD1602_WRITE_COM_BUSY(0x08);
- LCD1602_WRITE_COM_BUSY(0x01);
- LCD1602_WRITE_COM_BUSY(0x06);
- LCD1602_WRITE_COM_BUSY(0x0C);
- }
- /*******DHT11读字节**************/
- uchar ReadByte(void)
- {
- uchar i;
- uchar buf=0;
- for(i=0;i<8;i++)
- {
- IO=1;
- timeout=0;
- while((IO==0)&&((timeout++)<500));
- Delay10us();
- Delay10us();
- Delay10us();
- _nop_();//31us
- buf=buf<<1;
- if(IO==1)
- {
- buf=buf|0x01;
- }
- timeout=0;
- while((IO==1)&&((timeout++)<500));
- }
- return buf;
- }
- /*******DHT11读温湿度************/
- uchar ReadRH(void)
- {
- IO=0;
- Delay1ms(20);//20ms
- IO=1;
- Delay10us();
- Delay10us();
- Delay10us();
- Delay10us();
- Delay10us();//50us
- if(IO==0)
- {
- timeout=0;
- while((IO==0)&&((timeout++)<500));
- timeout=0;
- while((IO==1)&&((timeout++)<500));
- RH_H=ReadByte();
- RH_L=ReadByte();
- T_H=ReadByte();
- T_L=ReadByte();
- Cheakdata=ReadByte();
- if(Cheakdata==RH_H+RH_L+T_H+T_L)
- {return 1;}//成功
- else
- {return 0;}//失败
- }
- else
- return 0;//失败
- }
- /*******DHT11读字节**************/
- uchar ReadByte1(void)
- {
- uchar i;
- uchar buf=0;
- for(i=0;i<8;i++)
- {
- I1=1;
- timeout=0;
- while((I1==0)&&((timeout1++)<500));
- Delay10us();
- Delay10us();
- Delay10us();
- _nop_();//31us
- buf=buf<<1;
- if(I1==1)
- {
- buf=buf|0x01;
- }
- timeout1=0;
- while((I1==1)&&((timeout1++)<500));
- }
- return buf;
- }
- /*******DHT11读温湿度************/
- uchar ReadRH1(void)
- {
- I1=0;
- Delay1ms(20);//20ms
- I1=1;
- Delay10us();
- Delay10us();
- Delay10us();
- Delay10us();
- Delay10us();//50us
- if(I1==0)
- {
- timeout1=0;
- while((I1==0)&&((timeout1++)<500));
- timeout1=0;
- while((I1==1)&&((timeout1++)<500));
- RH_H1=ReadByte1();
- RH_L1=ReadByte1();
- T_H1=ReadByte1();
- T_L1=ReadByte1();
- Cheakdata1=ReadByte1();
- if(Cheakdata1==RH_H1+RH_L1+T_H1+T_L1)
- {return 1;}//成功
- else
- {return 0;}//失败
- }
- else
- return 0;//失败
- }
- /******1602写地址函数*********/
- void LCD1602_WRITE_ADRESS(uchar x,uchar y)
- {
- if(y==0)
- LCD1602_WRITE_COM_BUSY(0x80+x);
- else
- LCD1602_WRITE_COM_BUSY(0x80+0x40+x);
- }
- /*********1602显示*************/
- void LCD1602_DISP(uchar x,uchar y,uchar buf)
- {
- LCD1602_WRITE_ADRESS(x,y);
- LCD1602_WRITE_DATA_BUSY(buf);//显示数字
- }
- /*****主函数*****/
- void main(void)
- {
- UART_init();
- LCD1602_init();
-
- while(1)
- {
-
- if(ReadRH()==1)
- if(ReadRH1()==1)
- if(RXFRMOK)
-
- {
- P1=0xff;
- PM2_5=((TXBUF[0]+TXBUF[1]*256)/10);
- PM10=((TXBUF[2]+TXBUF[3]*256)/10);
- RXFRMOK=0;
-
- if(RH_H>99) RH_H=0;
- if(T_H>50) T_H=0;
- if(RH_H1>99) RH_H1=0;
- if(T_H1>50) T_H1=0;
-
- if(PM10>120) l1=0; //关窗
- else if(PM2_5>30) l1=0; //关窗
- else if(T_H1<12||T_H1>32) l1=0; //关窗
- else if(T_H<T_H1) l1=0; // 关窗
- else l2=0; //开窗
-
-
-
- LCD1602_DISP(0,0,'T');
- LCD1602_DISP(1,0,'1');
- LCD1602_DISP(2,0,':');
- LCD1602_DISP(3,0,T_H/10+'0');
- LCD1602_DISP(4,0,T_H%10+'0');
- LCD1602_DISP(5,0,0xdf);
- LCD1602_DISP(6,0,'C');
-
- LCD1602_DISP(8,0,'P');
- LCD1602_DISP(9,0,'2');
- LCD1602_DISP(10,0,'5');
- //LCD1602_DISP(11,0,PM2_5/100+'0');
- LCD1602_DISP(12,0,PM2_5/10%10+'0');
- LCD1602_DISP(13,0,PM2_5%10+'0');
- LCD1602_DISP(14,0,'m');
- LCD1602_DISP(15,0,'g');
-
- LCD1602_DISP(0,1,'T');
- LCD1602_DISP(1,1,'2');
- LCD1602_DISP(2,1,':');
- LCD1602_DISP(3,1,T_H1/10+'0');
- LCD1602_DISP(4,1,T_H1%10+'0');
- LCD1602_DISP(5,1,0xdf);
- LCD1602_DISP(6,1,'C');
-
- LCD1602_DISP(8,1,'P');
- LCD1602_DISP(9,1,'1');
- LCD1602_DISP(10,1,'0');
- LCD1602_DISP(11,1,PM10/100+'0');
- LCD1602_DISP(12,1,PM10/10%10+'0');
- LCD1602_DISP(13,1,PM10%10+'0');
- LCD1602_DISP(14,1,'m');
- LCD1602_DISP(15,1,'g');
-
-
-
- }
- }
- }
复制代码
所有资料51hei提供下载:
dht11.doc
(47.5 KB, 下载次数: 105)
|