C文件
复制 #include "reg52.H" #include "stdio.h" #include "intrins.h" #include #define DB P0//液晶并行數據接口 sbit RS = P2^0;//液晶指令數據信號 sbit RW = P2^1;//液晶讀寫信號 sbit E = P2^2;//液晶使能信號 unsigned char key_value;//獲取到按鍵的值 sbit Sck_P = P1^1; // SHT11傳感器的時鐘管腳 sbit Data_P = P1^0; // SHT11傳感器的數據管腳 unsigned char temp; // 保存溫度 unsigned char humi; // 保存濕度 enum { TEMP,HUMI }; typedef union //定義共用同類型 { unsigned int i; float f; }value; //是否應答 #define NACK 0 #define ACK 1 //SHT75傳感器命令集 地址 命令 讀/寫 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define RESET 0x1E //000 1111 0 unsigned char now_window;//當前顯示窗口 unsigned char curr_menu; #define normal_mode 0x10//輸入密碼狀態 #define set_mode 0x20//輸入密碼狀態 signed char AlarmTL=10; // 溫度下限報警值 signed char AlarmTH=30; // 溫度上限報警值 signed char AlarmHL=40; // 濕度下限報警值 signed char AlarmHH=80; // 濕度上限報警值 unsigned char i; unsigned char cnt_100ms; unsigned char time_100ms_flag; unsigned char open_del;//開鎖成功延時計數 unsigned char open_flag;//鎖狀態標志 sbit beep = P1^2; sbit LedTL_P = P1^3; // 溫度過低報警指示燈 sbit LedTH_P = P1^4; // 溫度過高報警指示燈 sbit LedHL_P = P1^5; // 濕度過低報警指示燈 sbit LedHH_P = P1^6; // 濕度過高報警指示燈 /******************************************************************************* * 函 數 名 : delay_ms * 函數功能 : 延時函數,延時1ms * 輸 入 : cnt * 輸 出 : 無 * 說 名 : 該函數是在12MHZ晶振下,12分頻單片機的延時。 *******************************************************************************/ void delay_ms(unsigned int cnt) // { unsigned int x; for( ; cnt>0; cnt--) { for(x=110; x>0; x--);//軟件延時為1MS } } #if 0 void delay_us(unsigned int cnt) // { while(cnt--); } #endif /****************************************************** ** 函數名:time_init ** 描述 :定時器初始化 ** 輸入 :無 ** 輸出 :無 ******************************************************/ void time_init(void) { TMOD |= 0x01;//time0 工作方式為1 TH0 = 0xf8;//裝載初值 TL0 = 0x2f;//裝載初值,為2ms(65535-63535) TR0 = 1;//開啟定時器 ET0 = 1;//打開中斷 EA=1; } /****************************************************** ** 函數名:key_scan ** 描述 :按鍵掃描 ** 輸入 :無 ** 輸出 :無 ******************************************************/ void key_scan(void) { static unsigned char key_in_flag = 0;//按鍵按下標志 unsigned char key_l;//存儲掃描到行列值。 key_value = 20;//按鍵值清除 if((P3 & 0x0f) != 0x0f)//按鍵按下 { delay_ms(1);//按鍵消抖動 if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1)) { key_in_flag = 0;//松手檢測防止一直觸發 P3 = 0x0f; //delay_ms(1);//按鍵消抖動 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;//(按鍵松開標志) } } /******************************************************************************* * 函 數 名 : LcdWriteCom * 函數功能 : 向LCD寫入一個字節的命令 * 輸 入 : u8com * 輸 出 : 無 *******************************************************************************/ void lcd_wri_com(unsigned char com) //寫入命令 { E = 0; //使能清零 RS = 0; //選擇寫入命令 RW = 0; //選擇寫入 DB = com; delay_ms(1); E = 1; //寫入時序 delay_ms(5); E = 0; } /******************************************************************************* * 函 數 名 : LcdWriteData * 函數功能 : 向LCD寫入一個字節的數據 * 輸 入 : u8dat * 輸 出 : 無 *******************************************************************************/ void lcd_wri_data(unsigned char dat)//寫入數據 { E = 0; //使能清零 RS = 1; //選擇寫入數據 RW = 0; //選擇寫入 DB = dat; delay_ms(1); E = 1; //寫入時序 delay_ms(5); E = 0; } /******************************************************************************* * 函 數 名 : WriString * 函數功能 : 刷新屏幕顯示 * 輸 入 : 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);//寫入數據 p++; } } /******************************************************************************* * 函 數 名 : lcd_write_char * 函數功能 : * 輸 入 : * 輸 出 : 無 *******************************************************************************/ 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); } /*********************光標控制***********************/ void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off) { if(on_off == 1) //開光標 { if(y==1)//如果選擇第一行 lcd_wri_com(0x80+x); else lcd_wri_com(0xc0+x);//將光標移動到秒個位 lcd_wri_com(0x0f);//顯示光標并且閃爍 } else { if(y==1)//如果選擇第一行 lcd_wri_com(0x80+x); else lcd_wri_com(0xc0+x);//將光標移動到秒個位 lcd_wri_com(0x0c); //關光標 } } /******************************************************************************* * 函 數 名 : LcdInit() * 函數功能 : 初始化LCD屏 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void lcd_init(void) //LCD初始化子程序 { lcd_wri_com(0x38);//置功能8位雙行 lcd_wri_com(0x0c);//顯示開關光標 lcd_wri_com(0x06);//字符進入模式屏幕不動字符后移 delay_ms(5);//延時5ms lcd_wri_com(0x01); //清屏 wri_string(1,0,"welcome user DHT");//初始化顯示 wri_string(2,0,"H: %RH T: C ");//初始化顯示 } /*********************************************************/ // 往SHT11寫入一個字節 /*********************************************************/ char ShtWriteByte(unsigned char value) { unsigned char i,error=0; for(i=128;i>0;i>>=1) // 高位為1,循環右移 { if (i&value) Data_P=1; // 和要發送的數相與,結果為發送的位 else Data_P=0; Sck_P=1; _nop_(); // 延時3us _nop_(); _nop_(); Sck_P=0; } Data_P=1; // 釋放數據線 Sck_P=1; error=Data_P; // 檢查應答信號,確認通訊正常 _nop_(); _nop_(); _nop_(); Sck_P=0; Data_P=1; return error; // error=1 通訊錯誤 } /*********************************************************/ // 從SHT11讀出一個字節 /*********************************************************/ char ShtReadByte(unsigned char ack) { unsigned char i,val=0; Data_P=1; // 釋放數據線 for(i=0x80;i>0;i>>=1) // 高位為1,循環右移 { Sck_P=1; if(Data_P) val=(val|i); // 讀一位數據線的值 Sck_P=0; } Data_P=!ack; // 如果是校驗,讀取完后結束通訊 Sck_P=1; _nop_(); // 延時3us _nop_(); _nop_(); Sck_P=0; _nop_(); _nop_(); _nop_(); Data_P=1; // 釋放數據線 return val; } /*********************************************************/ // SHT11啟動傳輸 /*********************************************************/ void ShtTransStart(void) { Data_P=1; Sck_P=0; _nop_(); Sck_P=1; _nop_(); Data_P=0; _nop_(); Sck_P=0; _nop_(); _nop_(); _nop_(); Sck_P=1; _nop_(); Data_P=1; _nop_(); Sck_P=0; } /*********************************************************/ // SHT11連接復位 /*********************************************************/ void ShtConnectReset(void) { unsigned char i; Data_P=1; //準備 Sck_P=0; for(i=0;i970) temp=970; if(temp>235) temp=temp+10; if(temp>555) temp=temp+10; if(temp>875) temp=temp+10; temp=(temp%1000)/10; return temp; } /*********************************************************/ // 濕度校正 /*********************************************************/ unsigned char HumiCorrect(unsigned int humi) { if(humi>999) humi=999; if((humi>490)&&(humiAlarmTH) // 溫度是否過高 { LedTH_P=0; LedTL_P=1; } else if(tempAlarmHH) // 濕度是否過高 { LedHH_P=0; LedHL_P=1; } else if(humi3) { curr_menu = 0; lcd1602_guanbiao(2,7,0); now_window = normal_mode; wri_string(1,0,"welcome user DHT");//初始化顯示 wri_string(2,0,"H: %RH T: C ");//初始化顯示 lcd_write_char(2,2,humi); lcd_write_char(2,11,temp); lcd_wri_com(0xcd); lcd_wri_data(0xdf); } } if (key_value == 2) { if(curr_menu==0) { if(++AlarmTL>99) { AlarmTL = 0; } lcd_write_char(1,2,AlarmTL); lcd1602_guanbiao(1,3,1); } else if (curr_menu==1) { if(++AlarmTH>99) { AlarmTH = 0; } lcd_write_char(1,6,AlarmTH); lcd1602_guanbiao(1,7,1); } else if(curr_menu==2) { if(++AlarmHL>99) { AlarmHL = 0; } lcd_write_char(2,2,AlarmHL); lcd1602_guanbiao(2,3,1); } else if(curr_menu==3) { if(++AlarmHH>99) { AlarmHH = 0; } lcd_write_char(2,6,AlarmHH); lcd1602_guanbiao(2,7,1); } } if (key_value == 3) { if(curr_menu==0) { if(--AlarmTL50) { cnt_100ms = 0; time_100ms_flag = 1; } TR0 = 1; TH0 = 0xf8; TL0 = 0x2f;//裝載初值2ms(65535-63535) } 審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
傳感器
+關注
關注
2567文章
53053瀏覽量
768026 -
驅動
+關注
關注
12文章
1919瀏覽量
86997 -
時鐘
+關注
關注
11文章
1902瀏覽量
133286 -
C文件
+關注
關注
0文章
12瀏覽量
3108
發布評論請先 登錄
相關推薦
熱點推薦
基于單片機的SHT11的溫濕度監測
我做的一個基于單片機的溫濕度控制 傳感器使用的是SHT11我自己找不出程序的錯誤 可是仿真確無法成功,望大俠指點一二啊 用液晶顯示所測溫濕度 接的是單片機P1口,由于只需要向其寫數據 所以R/W接地
發表于 05-13 19:55
SHT21和SHT11有啥區別,各位大神誰有SHT21的源代碼沒。。
網上看到大部分是溫濕度傳感器SHT11的源程序,SHT21和HTU21D的源代碼很少見到。不知道11和21有什么區別,求大神幫忙。
發表于 07-21 16:17
請問SHT11測到的溫濕度如何在數碼管上顯示?SHT11的程序用的官方的,如何增加數碼管顯示?
請問SHT11測到的溫濕度如何在數碼管上顯示?SHT11的程序用的官方的,如何增加數碼管顯示?采用四位數碼管顯示溫度,四位數碼管顯示濕度。
發表于 05-22 22:44
數字溫濕度傳感器SHT11與CC2430應用接口電路
數字溫濕度傳感器SHT11與CC2430應用接口電路
設計中采用了數字溫濕度傳感器SHT11,該傳感器通過無線網絡對監測區域內溫度和濕度進行
發表于 02-16 12:02
?1879次閱讀

基于CXA1191和SHT11的無線溫濕度監測系統
為降低設計成本,利用CXA1191和SHT11實現了一個無線溫濕度監測系統。在CXA1191原有的廣播接收功能的基礎上,巧妙結合編碼技術,成功實現了數據無線傳輸功能,并選擇SHT11實現高性能的
發表于 04-12 17:57
?118次下載

sht11采集與顯示有仿真圖
用SHT11進行溫濕度采集與顯示
用SHT11進行溫度與濕度的采集,結果讀到單片機,經過計算變為溫度0-100和濕度0-99%,進行LCD或數碼管顯示。
發表于 07-12 15:29
?43次下載
sht11和dht11有什么區別_dht22可以替換dht11嗎
本文介紹了SHT11特點、SHT11引腳及功能說明與DHT22封裝信息,其次介紹了SHT11的內部結構和工作原理及應用領域的介紹,對dht11引腳與功能與封裝信息進行了詳解,最后介紹了
發表于 01-26 13:54
?8.7w次閱讀

評論