//****************************************************************// //单片机 : STC89C52RC // 功能 :串口发送温湿度数据 晶振 11.0592M 波特率 9600 //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑 //****************************************************************// #include <reg51.h> #include <intrins.h> #include <absacc.h> typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */ #define lcd_H #include <reg51.h> #define HIGH 1 #define LOW 0 #define TRUE 1 #define FALSE 0 #define ZERO 0 #define MSB 0x80 #define LSB 0x01 //********液晶屏部分 **** #define LINE1 0 #define LINE2 1 #define LINE1_HEAD 0x80 #define LINE2_HEAD 0xC0 #define DATA_MODE 0x38 #define OPEN_SCREEN 0x0C #define DISPLAY_ADDRESS 0x80 #define CLEARSCREEN LCD_en_com(0x01) #define LCDIO P1 sbit LCD1602_RS = P2^4; //定义端口 sbit LCD1602_RW = P2^3; sbit LCD1602_EN = P2^2; //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P2_0 = P2^0 ; sbit SPK=P0^7; int t1,t2,ss; //----------------------------------------------// //----------------定义区--------------------// //----------------------------------------------// U8 U8FLAG; U8 U8count,U8temp; U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata; unsigned char str1[]={'s','h','i','d','u',':'}; unsigned char str2[]={'w','e','n','d','u',':'}; LCD_init(); void Delay(U16 j) { U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) { U8 i; i--; i--; i--; i--; i--; i--; } void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!P2_0)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(P2_0)U8temp=1; U8FLAG=2; while((P2_0)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; U8comdata|=U8temp; //0 }//rof } void LCD_Read_BF(void) { unsigned char read=0; LCD1602_RS=LOW; LCD1602_RW=HIGH; LCD1602_EN=HIGH; LCDIO=0XFF; read=LCDIO;} void LCD_en_com(unsigned char command)//写指令 { LCD_Read_BF(); LCD1602_RS=LOW; LCD1602_RW=LOW; LCD1602_EN=HIGH; LCDIO=command; LCD1602_EN=LOW; } void LCD_en_dat(unsigned char dat)//写数据 { LCD_Read_BF(); LCD1602_RS=HIGH; LCD1602_RW=LOW; LCD1602_EN=HIGH; LCDIO=dat; LCD1602_EN=LOW; } void LCD_set_xy(unsigned char x,unsigned char y) //写入地址函数 { unsigned char address; if(y==LINE1) address=LINE1_HEAD+x; else address=LINE2_HEAD+x; LCD_en_com(address); } void LCD_write_char(unsigned char x,unsigned char y,unsigned char dat)//写入字符函数 { LCD_set_xy(x,y); LCD_en_dat(dat); } void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)//写入字符串函数 { LCD_set_xy(x,y); while(*s) { LCDIO=*s; LCD_en_dat(*s); s++; } } void LCD_Init(void) //初始化函数 { LCD_en_com(0x38); /*显示模式设置*/ Delay(5); LCD_en_com(0x38); Delay(5); LCD_en_com(0x38); Delay(5); LCD_en_com(0x38); LCD_en_com(0x08); /*显示关闭*/ LCD_en_com(0x01); /*显示清屏*/ LCD_en_com(0x06); /*显示光标移动设置*/ Delay(5); LCD_en_com(0x0C); /*显示开及光标设置*/ } //-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM(); //-------------------------------- void RH(void) { //主机拉低18ms P2_0=0; Delay(180); P2_0=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 P2_0=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!P2_0) //T ! { U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!P2_0)&&U8FLAG++); U8FLAG=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((P2_0)&&U8FLAG++); //数据接收状态 COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; P2_0=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; } //湿度整数部分 str1[6] = (char)(0X30+U8RH_data_H/10); str1[7] = (char)(0X30+U8RH_data_H%10); //湿度小数部分 str1[9] = (char)(0X30+U8RH_data_L/10); //温度整数部分 str2[6] = (char)(0X30+U8T_data_H/10); str2[7] = (char)(0X30+U8T_data_H%10); //温度小数部分 str2[9] = (char)(0X30+U8T_data_L/10); t1=(int)(0X30+U8T_data_H/10); t2=(int)(0X30+U8T_data_H%10); ss=t1*10+t2; } } void xianshi(void) { LCD_write_char(0x00,0,'s'); LCD_write_char(0x01,0,'h'); LCD_write_char(0x02,0,'i'); LCD_write_char(0x03,0,'d'); LCD_write_char(0x04,0,'u'); LCD_write_char(0x05,0,':'); LCD_write_char(0x06,0,str1[6]); LCD_write_char(0x07,0,str1[7]); LCD_write_char(0x08,0,'.'); LCD_write_char(0x09,0,str1[9]); LCD_write_char(0x0B,0,'%'); LCD_write_char(0x0C,0,'R'); LCD_write_char(0x0D,0,'H'); LCD_write_char(0x00,1,'w'); LCD_write_char(0x01,1,'e'); LCD_write_char(0x02,1,'n'); LCD_write_char(0x03,1,'d'); LCD_write_char(0x04,1,'u'); LCD_write_char(0x05,1,':'); LCD_write_char(0x06,1,str2[6]); LCD_write_char(0x07,1,str2[7]); LCD_write_char(0x08,1,'.'); LCD_write_char(0x09,1,str1[9]); LCD_write_char(0x0B,1,0x27); LCD_write_char(0x0C,1,'C'); } //**蜂鸣器**// void laba() { unsigned int i; if(ss>554||ss<500) { for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短 { Delay(160); //参数决定发声的频率,估算值,可以自行更改参数并 SPK=!SPK; } SPK=1; Delay(60000); } //喇叭停止工作,间歇的时间,可更改 } //---------------------------------------------- //main()功能描述: AT89C51 11.0592MHz 串口发 //送温湿度数据,波特率 9600 //---------------------------------------------- void main() { LCD_init(); Delay(4); while(1) { //调用温湿度读取子程序 RH(); xianshi(); laba(); } } |