![]() |
發布時間: 2022-6-21 11:49
正文摘要:本其中有當時我的設計文檔,代碼,仿真。 讓還有溫濕度原理圖介紹淺顯易懂。 主要功能及操作說明: 1.本設計基于STC89C51/52(與AT89C51/52、AT89S51/52通用,可任選)單片機 · & ... |
//****************************************************************// //單片機 : 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(); } } |