一、系統(tǒng)方案 系統(tǒng)設計將軟件設計內(nèi)容分為了六大模塊,分別是蜂鳴器報警、水位檢測、DS18B20模塊、液晶顯示、加熱模塊、按鍵模塊,系統(tǒng)將其進行分別設計,接通電源之后,單片機分別向LCD1602液晶顯示器、DS18B20模塊、和按鍵發(fā)出初始化指令,初始化結束后,進行按鍵掃描,若檢測到按鍵信號,處理按鍵對應操作,無論是否有按鍵信號,都會繼續(xù)進行下一步,讀取DS18B20轉(zhuǎn)換值,在LCD1602液晶顯示器上,根據(jù)水位大小,啟動加水或停止加水,根據(jù)溫度大小決定是加熱還是停止加熱,之后返回到LCD1602液晶顯示器、DS18B20模塊、和按鍵初始化,繼續(xù)這個流程,直到斷開電源結束。
1.png (5.97 KB, 下載次數(shù): 23)
下載附件
2023-11-8 15:34 上傳
二、硬件設計 原理圖如下:
2.png (61.18 KB, 下載次數(shù): 30)
下載附件
2023-11-8 15:35 上傳
三、單片機軟件設計 1、首先是系統(tǒng)初始化 /***********************lcd1602初始化設置************************/ void init_1602() { write_com(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口 不檢測忙信號 write_com(0x0c); //開顯示 不顯示光標 write_com(0x06); //當寫一個字符是,地址指針加 1 write_string(1,0,"0 T: . 00:00 0"); //初始化1602顯示 write_string(2,0,"H: . L: . "); //初始化1602顯示 write_lcd3_18B20(2,2,t_high); //顯示上限報警值 write_lcd3_18B20(2,10,t_low); //顯示溫度下限報警值 write_zifu(1,8,0xdf); //顯示度 write_zifu(2,6, 0xdf); //顯示度 write_zifu(2,14,0xdf); //顯示度
} 2、液晶顯示程序 void delay_uint(uint q) { while(q--); }
/******************************************************************** * 名稱 : write_com(uchar com) * 功能 : 1602指令函數(shù) * 輸入 : 輸入的指令值 * 輸出 : 無 ***********************************************************************/ void write_com(uchar com) { rs=0; //寫指令 rw=0; //對1602寫操作 P0=com; //P0口對1602寫指令數(shù)據(jù) delay_uint(25); e=1; //e=1使能信號 delay_uint(100); //延時一下等1602完成操作 e=0; }
/******************************************************************** * 名稱 : write_data(uchar dat) * 功能 : 1602寫數(shù)據(jù)函數(shù) * 輸入 : 需要寫入1602的數(shù)據(jù) * 輸出 : 無 ***********************************************************************/ void write_data(uchar dat) { rs=1; //寫數(shù)據(jù) rw=0; //對1602寫操作 P0=dat; //P0口對1602寫數(shù)據(jù) delay_uint(25); e=1; //e=1使能信號 delay_uint(100); //延時一下等1602完成操作 e=0; } 3、按鍵程序 /****************按鍵顯示函數(shù)***************/ void key_with() { if(menu_1 == 0) { if(key_can == 2) //手動打開斷電器 relay1 = ~relay1; //打開關閉加熱繼電器 if(key_can == 3) relay2 = ~relay2; //打開關閉抽水繼電器 } if(key_can == 1) //設置鍵 { menu_1 ++; if(menu_1 > 4) { menu_1 = 0; //menu_1 = 0 退出設置了,在正常顯示界面下 init_1602(); //1602初始化 } } if(menu_1 == 1) //設置溫度上限報警值 { if(key_can == 2) //加鍵 { if(flag_lj_en <= 3) t_high ++ ; //按鍵按下未松開加1 加三次 else t_high += 10; //按鍵按下未松開加三次后加10 if(t_high > 999) t_high = 999; } if(key_can == 3) //減鍵 { if(flag_lj_en <= 3) t_high -- ; //按鍵按下未松開減1 減三次 else t_high -= 10; //按鍵按下未松開減三次后減10 if(t_high <= t_low) t_high = t_low + 1; //限制溫度上限不能低于溫度下限 } write_lcd3_18B20(2,2,t_high); //顯示上限報警值 write_com(0x80+0x40+2); //將光標移動到第2行第2位 write_com(0x0f); //顯示光標并且閃爍 } if(menu_1 == 2) //設置溫度下限報警值 { if(key_can == 2) //加鍵 { if(flag_lj_en <= 3) t_low ++ ; //按鍵按下未松開加1 加三次 else t_low += 10; //按鍵按下未松開加三次后加10 if(t_low >= t_high) t_low = t_high - 1; //限制溫度下限不能高于溫度上限 } if(key_can == 3) //減鍵 { if(flag_lj_en <= 3) t_low -- ; //按鍵按下未松開減1 減三次 else t_low -= 10; //按鍵按下未松開減三次后減10 if(t_low <= 10) t_low = 10; } write_lcd3_18B20(2,10,t_low); //顯示溫度下限報警值 write_com(0x80+0x40+10); //將光標移動到第2行第10位 write_com(0x0f); //顯示光標并且閃爍 } if(menu_1 == 3) //設置時鐘 { if(key_can == 2) //加鍵 { if(flag_lj_en <= 3) shi ++ ; //按鍵按下未松開加1 加三次 else shi += 5; //按鍵按下未松開加三次后加5 if(shi > 23) shi = 0; } if(key_can == 3) //減鍵 { if(flag_lj_en <= 3) { if(shi == 0) shi = 24; shi -- ; //按鍵按下未松開減1 減三次 } else { if(shi < 5) shi = 28; shi -= 5; //按鍵按下未松開減三次后減5 } } write_lcd2(1,10,shi); //顯示時 write_com(0x80+10); //將光標移動到第1行第10位 write_com(0x0f); //顯示光標并且閃爍 } if(menu_1 == 4) //設置分鐘 { if(key_can == 2) //加鍵 { if(flag_lj_en <= 3) fen ++ ; //按鍵按下未松開加1 加三次 else fen += 5; //按鍵按下未松開加三次后加5 if(fen > 60) fen = 0; } if(key_can == 3) //減鍵 { if(flag_lj_en <= 3) { if(fen == 0) fen = 60; fen -- ; //按鍵按下未松開減1 減三次 } else { if(fen < 5) fen = 65; fen -= 5; //按鍵按下未松開減三次后減5 } } write_lcd2(1,13,fen); //顯示分鐘 write_com(0x80+13); //將光標移動到第1行第13位 write_com(0x0f); //顯示光標并且閃爍 } delay_1ms(400); }
4、核心算法程序 /****************主函數(shù)***************/ void main() { beep = 0; //蜂鳴器響一聲 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; //所有單片機IO口輸出高電平 init_1602(); //1602初始化 time_init(); //初始化定時器 temperature = read_temp(); //先讀出溫度的值 delay_1ms(750); while(1) { if(flag_250ms == 1) //250ms 處理一次溫度程序 { flag_250ms = 0; temperature = read_temp(); //先讀出溫度的值 shuiwei_dis() ; //水位顯示 clock_h_l(); //報警函數(shù) if(menu_1 == 0) { write_lcd3_18B20(1,4,temperature); //顯示溫度 dingshi_dis(); //定時控制 write_lcd1(1,0,dengji); //顯示水位 } } key(); //按鍵程序 if(key_can > 0) { key_with(); //設置溫度 } } }
四、 proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設計的作品。
3.png (70.56 KB, 下載次數(shù): 27)
下載附件
2023-11-8 15:35 上傳
|