51单片机温湿度数据管理系统
1.硬件准备
开发板:51单片机 显示:lcd1602 温湿度模块:DHT11 通信模块:HC-08蓝牙
2.代码实现
uart.c
#include "reg52.h"
#include "config.h"
#include <string.h>sfr AUXR = 0x8E;
sbit D6 = P3^6;
char buffer[12];void UartInit(void) //9600bps@11.0592MHz
{AUXR = 0x01;SCON = 0x50; //配置串口工作方式1,REN使能接收TMOD &= 0xF0;TMOD |= 0x20;//定时器1工作方式位8位自动重装TH1 = 0xFD;TL1 = 0xFD;//9600波特率的初值TR1 = 1;//启动定时器EA = 1;//开启总中断ES = 1;//开启串口中断
}
void sendByte(char data_msg)
{SBUF = data_msg;while(!TI);TI = 0;
}void sendString(char* str)
{while( *str != '\0'){sendByte(*str);str++;}
}void Uart_Handler() interrupt 4
{char tmp;char i;if(RI)//中断处理函数中,对于接收中断的响应{RI = 0;//清除接收中断标志位tmp = SBUF;if(tmp == ':'){i = 0;}buffer[i++] = tmp;if(buffer[0] == ':' && buffer[1] =='o' && buffer[2] == 'p'){fengshan = 0;memset(buffer,'\0',12);}if(buffer[0] == ':' && buffer[1] == 'c' && buffer[2] == 'l'){fengshan = 1;D6 = 0;Delay1000ms();Delay1000ms();memset(buffer,'\0',12);}}if(TI);
}
uart.h
#ifndef _UART_H
#define _UART_Hvoid UartInit(void); //9600bps@11.0592MHzvoid sendByte(char data_msg);void sendString(char* str);#endif
lcd1602.c
#include "reg52.h"
#include "intrins.h"
#include "delay.h"#define databuffer P0 //定义8位数据线,Po端口组
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;void check_busy()
{char tmp = 0x80;databuffer = 0x80;while(tmp & 0x80){//1000 0000RS = 0;RW = 1;EN = 0;_nop_();EN = 1;_nop_();_nop_();tmp = databuffer;EN = 0;_nop_();}
}void Write_Cmd_Func(char cmd)
{check_busy();RS = 0;RW = 0;EN = 0;_nop_();databuffer = cmd;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_();
}void Write_Data_Func(char dataShow)
{check_busy();RS = 1;RW = 0;EN = 0;_nop_();databuffer = dataShow;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_();
}void LCD1602_INIT()
{//(1)延时 15msDelay15ms();
//(2)写指令 38H(不检测忙信号) Write_Cmd_Func(0x38);
//(3)延时 5msDelay5ms();
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置Write_Cmd_Func(0x38);
//(6)写指令 08H:显示关闭Write_Cmd_Func(0x08);
//(7)写指令 01H:显示清屏Write_Cmd_Func(0x01);
//(8)写指令 06H:显示光标移动设置Write_Cmd_Func(0x06);
//(9)写指令 0CH:显示开及光标设置}Write_Cmd_Func(0x0c);
}void LCD1602_showLine(char row, char col, char *string)
{switch(row){case 1:Write_Cmd_Func(0x80+col);while(*string){Write_Data_Func(*string);string++;}break;case 2:Write_Cmd_Func(0x80+0x40+col);while(*string){Write_Data_Func(*string);string++;}break;}
}
lcd1602.h
#ifndef _LCD1602_H
#define _LCD1602_Hvoid LCD1602_INIT();void LCD1602_showLine(char row, char col, char *string);#endif
dht11.c
#include "reg52.h"
#include "delay.h"sbit dht = P3^3;//模块的data插在p3.3char datas[5];void DHT11_Start()
{dht = 1;dht = 0;//延时30msDelay30ms();dht = 1;//卡d点;while(dht1); 卡e点 while(!dht) 卡f点:while(dht)while(dht);while(!dht);while(dht);
}void Read_Data_From_DHT()
{int i;//轮int j;//每一轮读多少次char tmp;char flag;DHT11_Start();for(i= 0;i < 5;i++){//卡g点:while(!dht) 有效数据都是高电平,持续时间不一样,50us读,低电平0 高电平for(j=0;j<8;j++){while(!dht);//等待卡g点Delay40us();if(dht == 1){flag = 1;while(dht);}else{flag = 0;} tmp = tmp << 1;tmp |= flag;}datas[i] = tmp;}}
dht11.h
#ifdenf _DHT11_H
#define _DHT11_Hvoid Read_Data_From_DHT();#endif
delay.c
#include "intrins.h"
void Delay30ms() //@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us() //@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}void Delay1000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void Delay15ms() //@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}
void Delay5ms() //@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}
delay.h
#ifndef _DELAY_H
#define _DELAY_H#include "intrins.h"
void Delay30ms(); //@11.0592MHzvoid Delay40us(); //@11.0592MHzvoid Delay1000ms(); //@11.0592MHzvoid Delay15ms(); //@11.0592MHzvoid Delay5ms(); //@11.0592MHz#endif
config.h
#ifndef _CONFIG_H
#define _CONFIG_Hsbit ledOne = P3^7;
sbit fengshan = P1^6;#endif
main.c
#include "reg52.h"
#include "intrins.h"
#include "delay.h"
#include "lcd1602.h"
#include "uart.h"
#include "dht11.h"
#include "config.h"char temp[8];
char huma[8];
extern char datas[5];void Build_Datas()
{huma[0] = 'H';huma[1] = datas[0]/10 + 0x30;huma[2] = datas[0]%10 + 0x30;huma[3] = '.';huma[4] = datas[1]/10 + 0x30;huma[5] = datas[1]%10 + 0x30;huma[6] = '%';huma[7] = '\0';temp[0] = 'T';temp[1] = datas[2]/10 + 0x30;temp[2] = datas[2]%10 + 0x30;temp[3] = '.';temp[4] = datas[3]/10 + 0x30;temp[5] = datas[3]%10 + 0x30;temp[6] = 'C';temp[7] = '\0';}void main()
{Delay1000ms();UartInit();LCD1602_INIT();Delay1000ms();Delay1000ms();ledOne = 0;while(1){Delay1000ms();Read_Data_From_DHT(); if(datas[2] >= 24){fengshan = 0;}else{fengshan = 1;}Build_Datas();sendString(huma);sendString("\r\n");sendString(temp);sendString("\r\n");LCD1602_showLine(1,2,huma);LCD1602_showLine(2,2,temp);}
}