Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
程序流程图:
单片机源程序如下:- #include<reg52.h>
- #include <stdio.h>
- extern unsigned char F16T,F16RH; //温湿度数据
- unsigned char Rx_buf[4],Rxnum=0,temp,rh;
- sbit LED1=P2^0; //投停自动按键
- sbit LED2=P2^3; //加温启启指示灯(如果要实现控制,可在这个端口加装上楼层电器模块)
- sbit LED3=P2^6; //加湿启启指示灯(如果要实现控制,可在这个端口加装上楼层电器模块)
- sbit k1=P1^4; //投停自动按键
- sbit k2=P1^5; //加温启停按键
- sbit k3=P1^6; //加湿启停按键
- sbit bit11=P1^1; //DHT11传感器数据端
- unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- unsigned char F16T,F16RH,n;// read 8 bits onice
- void Delay_ms(unsigned int n)//n 毫秒延时
- {
- unsigned char j;
- while(n--)
- {
- for(j=0;j<125;j++);
- }
- if(k1==0) //自动、手动切换按键按下判断处理
- {
- while(k1==0); //再次判断按下否,当放开按键时
- if(LED1==1) //判断自动按停情况:1为手动 0为自动
- LED1=0; //切换为自动开
- else LED1=1; //切换为自动关
- }
- if(LED1==1) //自动、手动判断 1为手动 0为自动
- {
- if(k2==0) //加热启停切换按键按下判断处理
- {
- while(k2==0); //再次判断按下否
- if(LED2==1) //如果之前是 1为停止(加热关) 0为加热(加热开)
- LED2=0; //则切换为加热状态(加热开)
- else LED2=1; //否则切换为停止加热状态(加热关)
- }
- if(k3==0) //加湿启停切换按键按下判断处理
- {
- while(k3==0); //再次判断按下否
- if(LED3==1) //如果之前是 1为停止(加湿关) 0为加湿(加湿开)
- LED3=0; //则切换为加湿状态(加湿开)
- else LED3=1; //否则切换为停止加湿状态(加湿关)
- }
- }
- else //自动状态
- {
- if(F16T>temp) //温度大于设定值时
- {
- LED2=1; //停止加热(加热关)
- }
- else LED2=0; //温度低于设定值时,开始加热(加热开)
- if(F16RH>rh) //湿度大于设定值时
- {
- LED3=1; //停止加热(加热关)
- }
- else LED3=0; //湿度低于设定值时,开始加湿(加湿开)
- }
- }
- void Delay_us(unsigned char n)
- {
- n=n/2;
- while(--n);
- }//N us 延时函数
- //--------------------------------
- //-----温湿度读取子程序 ------------
- //--------------------------------
- //----以下变量均为全局变量--------
- //----温度高 8 位== U8T_data_H------
- //----温度低 8 位== U8T_data_L------
- //----湿度高 8 位== U8RH_data_H-----
- //----湿度低 8 位== U8RH_data_L-----
- //----校验 8 位 == U8checkdata-----
- //----调用相关子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- char COM(void)
- {
- char i,U8temp,U8comdata; //用于最终读取的温湿度数据
- for(i=0;i<8;i++)
- {
- while(!bit11);
- Delay_us(35); //表示读取的高电位延时大于 20 多 us 则读取的是 1 否则读取的是0
- U8temp=0;
- if(bit11)U8temp=1; //通过 U8FLAG可判断bit11 显示数据的脉长
- while(bit11);
- U8comdata<<=1;
- U8comdata|=U8temp;
- }//rof
- return U8comdata;
- }
- void getDHT11(void)
- {
- GO1:bit11=0;
- Delay_ms(20); //主机拉低 18ms
- bit11=1; //总线由上拉电阻拉高 主机延时 20us
- Delay_us(60); //主机设为输入
-
- if(!bit11) //bit11=1;判断从机响应信号,判断从机是否有低电平响应信号
- {
- while(!bit11); //如不响应则跳出,响应则向下运行
- while(bit11);
- U8RH_data_H=COM(); //数据接收状态
- U8RH_data_L=COM();
- U8T_data_H=COM();
- U8T_data_L=COM();
- U8checkdata=COM();
- bit11=1;
- if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata) //数据校验
- goto GO1;
- }//fi
- F16T=U8T_data_H+U8T_data_L/256; //change integer to float
- F16RH=U8RH_data_H+U8RH_data_L/256;
- }
- void InitUART(void) //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /*
- * UART 发送一字节
- */
- void UART_send_byte(char dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /*
- * UART 发送字符串
- */
- void UART_send_string(unsigned char *buf)
- {
- while (*buf != '\0')
- {
- UART_send_byte(*buf++);
- }
- }
- void main()
- {
- unsigned char Tx_Buf[12];
- unsigned char LEDstatus;//灯的状态
- InitUART(); //初始化串口
- temp=25;
- rh=60;
- while(1)
- {
- getDHT11(); //获取温湿度值
- Tx_Buf[0]='T'; //帧头
- Tx_Buf[1]=F16T/10%10+0x30; //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示
- Tx_Buf[2]=F16T%10+0x30;
- Tx_Buf[3]=F16RH/10%10+0x30;
- Tx_Buf[4]=F16RH%10+0x30;
- Tx_Buf[5]=temp/10%10+0x30; //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示
- Tx_Buf[6]=temp%10+0x30;
- Tx_Buf[7]=rh/10%10+0x30;
- Tx_Buf[8]=rh%10+0x30;
- LEDstatus=LED1;
- Tx_Buf[9]=LEDstatus+0x30; //发送自动投停状态到APP显示
- LEDstatus=LED2;
- Tx_Buf[10]=LEDstatus+0x30; //发送加热状态到APP显示
- LEDstatus=LED3;
- Tx_Buf[11]=LEDstatus+0x30; //发送加湿状态到APP显示
- UART_send_string(Tx_Buf); //串口发送温湿度数据出去
- Delay_ms(1000);
- }
- }
- /*****************串口接收中断函数,接收蓝牙模块的数据****************** ***/
- void UARTInterrupt(void) interrupt 4
- {
- ES=0; //关闭中断
- if(RI) //接收到数据
- {
- Rx_buf[Rxnum]=SBUF; //接收数据进数组
- if(Rx_buf[Rxnum]==0x0A)
- Rxnum=0;
- else
- Rxnum++;
- if(Rx_buf[0]==0x31) //接收到的APP传送来的手动、自动切换指令头部数据
- {
- if(Rx_buf[1]==0x30) //接收到的APP传送来的切换为自动指令
- LED1=0; //自动开
- if(Rx_buf[1]==0x31) //接收到的APP传送来的切换为手动指令
- LED1=1; //自动关
- }
- if(Rx_buf[0]==0x32) //接收到的APP传送来的加温指令头部数据
- {
- if(Rx_buf[1]==0x30) //接收到的APP传送来的加温开指令
- LED2=0; //加温开
- if(Rx_buf[1]==0x31) //接收到的APP传送来的加温关指令
- LED2=1; //加温关
- }
- if(Rx_buf[0]==0x33) //接收到的APP传送来的加湿指令头部数据
- {
- if(Rx_buf[1]==0x30) //接收到的APP传送来的加湿开指令
- {
- LED3=0; //加湿开
- }
- else
- if(Rx_buf[1]==0x31) //接收到的APP传送来的加湿开指令
- {
- LED3=1; //加湿关
- }
- }
- if(Rx_buf[0]==0x34) //接收到的APP传送来的温度设置指令头数据
- {
- if(Rx_buf[1]==0x31) //接收到的APP传送来的温度设置定值加1指令
- {
- temp++; //温度定值加1
- if(temp>99)
- temp=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP传送来的温度设置定值减1指令
- {
- temp--; //温度定值减1
- if(temp<1)
- temp=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- if(Rx_buf[0]==0x35) //接收到的APP传送来的湿度设置指令头数据
- {
- if(Rx_buf[1]==0x31) //接收到的APP传送来的湿度设置定值加1指令
- {
- rh++; //湿度定值加1
- if(rh>99)
- rh=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP传送来的湿度设置定值减1指令
- {
- rh--; //湿度定值减1
- if(rh<1)
- rh=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- }
- RI=0;
- ES=1; //关闭中断
- }
-
复制代码
仿真: 无
代码原理图PCB:
LY04A_蓝牙温湿度测量控制.7z
(1.01 MB, 下载次数: 15)
|