|
由于最近的設計,花費不少心思做出了這個系統,雖然很簡單,但是還是想發出來一下。當初在找資料的時候,也辛虧是這個平臺的老前輩們的資料拯救了我,現在仿真做完了,調試也沒什么問題,就發上去給做個留念,也留給下一個像我一樣需要的人。 該系統有5個模塊,單片機主體、L298驅動電機模塊、SHT11濕度傳感器模塊、RAM6264存儲濕度模塊以及按鍵切換模式模塊;該系統功能是:濕度傳感器采集濕度信息經過51單片機處理,顯示于LCD1602液晶顯示屏上,當按下濕度傳感器下方按鈕,即可存儲濕度信息進RAM6264存儲器(此處是仿真專用按鈕,現實中要實現存儲需要設置一個定時),當濕度小于設定值,L298驅動直流電機轉動啟動澆水功能;當按下功能按鈕,可切換當前濕度模式和歷史檢索模式,另外兩個按鈕在歷史檢索模式下發揮作用,用于檢索上一條和下一條。另外復位電路還模擬了一個檢測陰天的復位電路,當為陰天時,則為開關按下,電路進行復位,電機停止。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (26.84 KB, 下載次數: 54)
下載附件
2020-7-1 21:35 上傳
51hei.png (21.73 KB, 下載次數: 44)
下載附件
2020-7-1 21:36 上傳
單片機源程序如下(程序帶有非常詳細的注釋):
- #include <reg52.h> //特殊功能寄存器地址的聲明的頭文件,如P0-P3口的地址
- #include <intrins.h> //單片機內部頭文件,包含很多邏輯指令,如左右移指令crol,空指令nop等
- #include <math.h> //數學公式頭文件,如開方sqrt
- #include <stdio.h> //標準輸入輸出頭文件,如print,scanf
- #include <1602.h> //LCD1602液晶顯示屏的頭文件,用來顯示當前濕度和歷史濕度
- #include <sht11.h> //濕度傳感器頭文件,用來采集濕度信息
- #include <absacc.h> //絕對地址訪問頭文件,如XBYTE
- #define uchar unsigned char //宏定義8位無符號整型,最大256
- #define uint unsigned int //宏定義16位無符號整型,最大65536
- #define RAM_6264 XBYTE[RAMADDR] //6264地址范圍8000H-9FFFH
- uint RAMADDR ; //定義6264的地址
- uint humi; //定義濕度
- value humi_val; //定義整型和浮點型共同體 humi_val
- uchar error; //用于檢驗是否出現錯誤
- uchar checksum; //CRC:循環冗余校驗碼
- uchar HUMI_data[6]; //該數組存放采集到的濕度信息
- uchar humi_lowest=15.5; //濕度若小于設定的15.5%時,就啟動電機澆水
- uchar humi_search; //用于檢索歷史濕度
- uchar show_humi[5]; //該數組存放顯示歷史濕度的信息
- uchar presskeynum; //按鍵次數變量
- uchar last_humi; //上一條濕度信息
- uchar next_humi; //下一條濕度信息
- uchar code word1[]={" a product of "}; //開機LCD顯示單詞
- uchar code word2[]={" Humi Display "}; //開機LCD顯示單詞
- uchar code word3[]={" Welcome........"}; //開機LCD顯示單詞
- sbit k1=P1^0; //切換模式按鍵
- sbit k2=P1^1; //上一條濕度信息查詢按鈕
- sbit k3=P1^2; //下一條濕度信息查詢按鈕
- sbit k4=P1^3; //存儲濕度信息仿真鍵
- sbit IN1=P1^5; //電機驅動,和IN2相反狀態時啟動
- sbit IN2=P1^6; //電機驅動,和IN1相反狀態時啟動
- sbit ENA=P1^7; //短接時電機全速啟動
- //********延時函數*********//
- void delay(uint z) //z為毫秒數
- {
- int a,b;
- for(a=z;a>0;a--)
- for(b=120;b>0;b--);
- }
- /************************************************************************/
- //函數名:key
- //功能:按鍵切換兩種模式(顯示模式和歷史查詢模式);查詢上下條濕度信息
- /************************************************************************/
- void key()
- {
- if (k1==0) //查詢按鍵是否被按下
- {
- delay(30); //消抖,30ms檢查是否是誤觸
- if (k1==0) //當按鍵被按下
- {
- presskeynum++; //按鍵次數加一,切換模式
- if(presskeynum==2) //因為只有兩個模式,當再次按下按鍵,按鍵次數就會回到0
- presskeynum=0; //因為只有兩個模式,當再次按下按鍵,按鍵次數就會回到0
- while(k1==0); //按鍵不被松開就一直循環
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- }
- }
- if(presskeynum==1) //查詢歷史濕度模式
- {
- if(k2==0) //查詢上一條濕度按鍵是否被按下
- {
- delay(30); //消抖,30ms檢查是否是誤觸
- RAMADDR--; //存儲器中指針向前移動一位
- if (RAMADDR<0x8000) //如果指針指向第一位
- {
- RAMADDR=0x8000; //那么指針就停在第一位
- }
- humi_search=RAM_6264;//將6264存儲器當前地址的濕度信息取出來放在humi_search中
- while(k2==0); //按鍵不被松開就一直循環
- }
- if(k3==0) //查詢下一條濕度按鍵是否被按下
- {
- delay(30); //消抖,30ms檢查是否是誤觸
- RAMADDR++; //存儲器中指針向后移動一位
- if (RAMADDR>0x83ff) //如果指針指向最后一位(1k)
- RAMADDR=0x83ff; //那么指針就停在最后一位
- humi_search=RAM_6264; //將6264存儲器當前地址的濕度信息取出來放在humi_search中
- while(k3==0); //按鍵不被松開就一直循環
- }
- }
- }
- /************************************************************************/
- //程序名:main主函數
- //功能:,控制顯示屏顯示濕度、查詢濕度;驅動電機;存儲8K濕度信息;數據傳輸;濕度采樣及AD轉換
- /************************************************************************/
- void main()
- {
- RAMADDR=0x8000; //6264首地址
- LCD_Initial(); //液晶初始化
- GotoXY(0,0); //選擇濕度顯示開始位置,在第一行第一個字符處
- Print_slow(word1); //顯示 a product of 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0); //選擇濕度顯示開始位置,在第二行第一個字符處
- Print_slow(word2); //顯示 Humidity display 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0); //選擇濕度顯示開始位置,在第一行第一個字符處
- Print_slow(word3); //顯示 Welcome........ 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- while(1)
- {
- key(); //開機后,按鍵在任何時候按下都可切換模式
- if(presskeynum==0) //顯示模式,顯示當前采集回來的濕度
- {
- s_connectionreset(); //啟動連接復位
- error=0; //初始化error=0,即沒有錯誤
- error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
- if(error!=0) //如果error仍為0則發生錯誤,因為上一步已經加上要測量的濕度信息
- s_connectionreset(); //如果發生錯誤,系統復位
- else
- {
- humi_val.f=(float)humi_val.i; //轉換為浮點數
- calc_sth10(&humi_val.f); //修正相對濕度及溫度
- humi=humi_val.f*10; //修正后的濕度乘10,方便存儲
- if(humi/10<humi_lowest) //當濕度小于最小濕度20.5%時,啟動電機澆水
- {
- ENA=1; //高電平,最高速轉動
- IN1=1; //電機正轉
- IN2=0; //電機正轉
- }
- else //當濕度小于最小濕度20.5%時,啟動電機澆水
- {
- ENA=0;
- IN1=0; //電機停轉
- IN2=0; //電機停轉
- }
-
- GotoXY(0,0); //選擇溫度顯示開始位置,第一行第一個字符處
- Print(" Current Humi: "); //當前濕度
- GotoXY(0,1); //選擇溫度顯示開始位置,第二行第一個字符處
- Print("Humi: % "); //5格空格
- GotoXY(5,1); //選擇溫度顯示開始位置,第二行第六個字符處
- HUMI_data[0]=humi/1000+'0'; //濕度百位
- if (HUMI_data[0]==0x30) //如果首位為0,ascall碼0x30=‘0’
- HUMI_data[0]=0x20; //首位為空格,ascall碼0x20=‘空格’
- HUMI_data[1]=humi%1000/100+'0'; //濕度十位
- HUMI_data[2]=humi%100/10+'0'; //濕度個位
- HUMI_data[3]='.' ; //小數點
- HUMI_data[4]=humi%10+'0'; //濕度小數點后第一位
- HUMI_data[5]='\0'; //顯示停止標志。str=‘\0‘,停止
- Print(HUMI_data); //輸出濕度
- if(k4==0) //按下確定按鍵
- {
- delay(30); //消抖30ms
- if(k4==0) //按下確定鍵
- {
- RAM_6264=humi; //將濕度信息存儲于6264存儲器中
- RAMADDR++; //地址指針后移一位
- while(k4==0); //按鍵不被松開就一直循環
- }
- }
- }
- }
- if(presskeynum==1) //歷史查詢濕度時顯示的內容
- {
- show_humi[0]=humi_search%1000/100+'0'; //歷史濕度十位
- show_humi[1]=humi_search%100/10+'0'; //歷史濕度個位
- show_humi[2]='.' ; //小數點
- show_humi[3]=humi_search%10+'0'; //歷史濕度信息小數點后一位
- show_humi[4]='\0'; //顯示停止標志。str=‘\0‘,停止
- GotoXY (0,0); //選擇溫度顯示開始位置,第一行第一個字符處
- Print("History Of Humi:"); //歷史濕度
- GotoXY(0,1); //選擇溫度顯示開始位置,第二行第一個字符處
- Print("Humi: % "); //5格空格
- GotoXY (5,1); //選擇溫度顯示開始位置,第二行第六個字符處
- Print(show_humi); //顯示歷史濕度
- }
- }
- }
復制代碼
51hei.png (4.89 KB, 下載次數: 57)
下載附件
2020-7-1 21:36 上傳
所有資料51hei提供下載:
基于SHT11濕度傳感器的LCD顯示及歷史檢索 .zip
(135.9 KB, 下載次數: 22)
2020-7-1 08:59 上傳
點擊文件名下載附件
proteus仿真+keil代碼 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|