|
源程序:
DHT11最終版.7z
(87.25 KB, 下載次數(shù): 209)
2020-7-14 08:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
- #include "reg52.H"
- #include "stdio.h"
- #include "intrins.h"
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DB P0//液晶并行數(shù)據(jù)接口
- sbit RS = P2^0;//液晶指令數(shù)據(jù)信號(hào)
- sbit RW = P2^1;//液晶讀寫信號(hào)
- sbit E = P2^2;//液晶使能信號(hào)
- sbit T_IO=P1^2; //clk為DS1302的時(shí)鐘信號(hào)線
- sbit T_CLK=P1^7; //DAT為DS1302的I/O數(shù)據(jù)線
- sbit T_RST=P2^3; //RST為DS1302的RST信號(hào)線
- uchar bdata datbyte;
- sbit datbyte0=datbyte^0;
- sbit datbyte7=datbyte^7;
- uchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//設(shè)置時(shí)間初始值數(shù)組
- // 秒 分 時(shí) 號(hào) 月份 星期 年
- //DS1302函數(shù)聲明
- void get_1302(uchar time[]);
- void write_ds1302(uchar dat);
- uchar r_1302(uchar add);
- void w_1302(uchar add,uchar dat);
- uchar read_ds1302(void);
- void init_1302(uchar *time);
- void change();
- uchar times[9];//保存時(shí)間
- uchar date[11];//保存日期
- unsigned char key_value;//獲取到按鍵的值
- sbit Data=P1^1; //溫濕度IO
- signed char humi_value;//濕度
- signed char temp_value;//溫度
- unsigned char now_window;//當(dāng)前顯示窗口
- unsigned char curr_menu;
- #define normal_mode 0x10//顯示模式
- #define set_mode 0x20//設(shè)置模式
- signed char AlarmTL=10; // 溫度下限報(bào)警值
- signed char AlarmTH=30; // 溫度上限報(bào)警值
- signed char AlarmHL=40; // 濕度下限報(bào)警值
- signed char AlarmHH=80; // 濕度上限報(bào)警值
- unsigned char i;
- unsigned char cnt_100ms,cnt_500ms =0;
- unsigned char time_100ms_flag;
- //unsigned char open_del;//開鎖成功延時(shí)計(jì)數(shù)
- //unsigned char open_flag;//鎖狀態(tài)標(biāo)志
- sbit beep = P1^0;
- sbit LedTL_P = P1^3; // 溫度過低報(bào)警指示燈
- sbit LedTH_P = P1^4; // 溫度過高報(bào)警指示燈
- sbit LedHL_P = P1^5; // 濕度過低報(bào)警指示燈
- sbit LedHH_P = P1^6; // 濕度過高報(bào)警指示燈
- /*******************************************************************************
- * 函 數(shù) 名 : delay_ms
- * 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
- * 輸 入 : cnt
- * 輸 出 : 無
- * 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
- *******************************************************************************/
- void delay_ms(unsigned int cnt) //
- {
- unsigned int x;
- for( ; cnt>0; cnt--)
- {
- for(x=110; x>0; x--);//軟件延時(shí)為1MS
- }
- }
- #if 0
- void delay_us(unsigned int cnt) //
- {
- while(cnt--);
- }
- #endif
- /******************************************************
- ** 函數(shù)名:time_init
- ** 描述 :定時(shí)器初始化
- ** 輸入 :無
- ** 輸出 :無
- ******************************************************/
- void time_init(void)
- {
- TMOD |= 0x01;//time0 工作方式為1
- TH0 = 0xf8;//裝載初值
- TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
- TR0 = 1;//開啟定時(shí)器
- ET0 = 1;//打開中斷
- EA=1;
- }
- /******************************************************
- ** 函數(shù)名:key_scan
- ** 描述 :按鍵掃描
- ** 輸入 :無
- ** 輸出 :無
- ******************************************************/
- void key_scan(void)
- {
- static unsigned char key_in_flag = 0;//按鍵按下標(biāo)志
- unsigned char key_l;//存儲(chǔ)掃描到行列值。
- key_value = 20;//按鍵值清除
- if((P3 & 0x0f) != 0x0f)//按鍵按下
- {
- delay_ms(1);//按鍵消抖動(dòng)
- if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
- {
- key_in_flag = 0;//松手檢測(cè)防止一直觸發(fā)
- P3 = 0x0f;
- //delay_ms(1);//按鍵消抖動(dòng)
- key_l = P3;//掃描得到按鍵值
- switch(key_l)
- {
- //獲取按鍵值
- case 0x0e:
- {
- key_value = 1;
- }
- break;
- case 0x0d:
- {
- key_value = 2;
- }
- break;
- case 0x0b:
- {
- key_value = 3;
- }
- break;
- //case 0x70:
- //break;
- }
- }
- }
- else
- {
- key_in_flag = 1;//(按鍵松開標(biāo)志)
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteCom
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的命令
- * 輸 入 : u8com
- * 輸 出 : 無
- *******************************************************************************/
- void lcd_wri_com(unsigned char com) //寫入命令
- {
- E = 0; //使能清零
- RS = 0; //選擇寫入命令
- RW = 0; //選擇寫入
- DB = com;
- delay_ms(1);
- E = 1; //寫入時(shí)序
- delay_ms(5);
- E = 0;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteData
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
- * 輸 入 : u8dat
- * 輸 出 : 無
- *******************************************************************************/
- void lcd_wri_data(unsigned char dat)//寫入數(shù)據(jù)
- {
- E = 0; //使能清零
- RS = 1; //選擇寫入數(shù)據(jù)
- RW = 0; //選擇寫入
- DB = dat;
- delay_ms(1);
- E = 1; //寫入時(shí)序
- delay_ms(5);
- E = 0;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : WriString
- * 函數(shù)功能 : 刷新屏幕顯示
- * 輸 入 : hang,add,*p
- * 輸 出 : 無
- *******************************************************************************/
- void wri_string(unsigned char y,unsigned char x,unsigned char *p)
- {
- if(y==1)//如果選擇第一行
- lcd_wri_com(0x80+x);//選中地址
- else
- lcd_wri_com(0xc0+x);//選中地址
- while(*p)
- {
- lcd_wri_data(*p);//寫入數(shù)據(jù)
- p++;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : lcd_write_char
- * 函數(shù)功能 :
- * 輸 入 :
- * 輸 出 : 無
- *******************************************************************************/
- void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
- {
- unsigned char temp_l, temp_h;
- if(y==1)//如果選擇第一行
- lcd_wri_com(0x80+x);//選中地址
- else
- lcd_wri_com(0xc0+x);//選中地址
- temp_l = dat % 10;
- temp_h = dat / 10;
- lcd_wri_data(temp_h + 0x30); //convert to ascii
- lcd_wri_data(temp_l + 0x30);
- }
- /*********************光標(biāo)控制***********************/
- void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
- {
- if(on_off == 1) //開光標(biāo)
- {
- if(y==1)//如果選擇第一行
- lcd_wri_com(0x80+x);
- else
- lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
- lcd_wri_com(0x0f);//顯示光標(biāo)并且閃爍
- }
- else
- {
- if(y==1)//如果選擇第一行
- lcd_wri_com(0x80+x);
- else
- lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
- lcd_wri_com(0x0c); //關(guān)光標(biāo)
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdInit()
- * 函數(shù)功能 : 初始化LCD屏
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void lcd_init(void) //LCD初始化子程序
- {
- lcd_wri_com(0x38);//置功能8位雙行
- lcd_wri_com(0x0c);//顯示開關(guān)光標(biāo)
- lcd_wri_com(0x06);//字符進(jìn)入模式屏幕不動(dòng)字符后移
- delay_ms(5);//延時(shí)5ms
- lcd_wri_com(0x01); //清屏
- wri_string(1,0,times);//初始化顯示
- wri_string(1,6,date);
- wri_string(2,0,"H: %RH T: C ");//初始化顯示
- }
- void DHT11_delay_us(unsigned char n)
- {
- while(--n);
- }
- void DHT11_delay_ms(unsigned int z)
- {
- unsigned int i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(30); //延時(shí)18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- unsigned char DHT11_rec_byte() //接收一個(gè)字節(jié)
- {
- unsigned char i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!Data); ////等待50us低電平過去
- DHT11_delay_us(8); //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
- if(Data==1) //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1
- dat+=1;
- while(Data); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數(shù)據(jù)
- {
- unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待拉高
- DHT11_delay_us(40); //拉高后延時(shí)80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25); //結(jié)束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- humi_value = RH;
- temp_value = TH;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|