仿真版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
設計編號:S0008
主要功能
本設計系統(tǒng)是18b20溫度報警系統(tǒng)數(shù)碼管顯示,可設置溫度上限高溫報警和下限低溫報警,報警溫度可精確到0.1度,并具有掉電保存功能,數(shù)據(jù)保存在單片機內(nèi)部EEPOM中,進入設置界面后如果沒有鍵按下系統(tǒng)會在15秒后自動退出設置界面,人性化的按鍵設置,按鍵還具有連加、減功能。
- 按“確定鍵” :有兩種操作方式
1)按下就松開,高溫設置、低溫設置、正常顯示溫度,三個界面按一下就切換一次。
2)按下不松開,進入自動切換,每500ms自動切換一次,
- 按“加鍵” :有兩種操作方式
1)按下就松開,設定的溫度值就加0.1度。
2)按下不松開,進入按鍵連加功能,每500ms自動加一次,前三次自動加0.1度,之后就是自動加1度。
- 按“減鍵” :有兩種操作方式
1)按下就松開,設定的溫度值就減0.1度。
2)按下不松開,進入按鍵連減功能,每500ms自動減一次,前三次自動減0.1度,之后就是自動減1度。
- 第一次按下“確定鍵”進入高溫報警設置:
按下“加、減”鍵可設置高溫報警,最高設置成99.0度,最低可設置成比低溫報警高0.1度。
- 第二次按下“確定鍵”進入低溫報警設置:
按下“加、減”鍵可設置低溫報警,最低設置成1度,最高可設置成比高溫報警低0.1度。
- 第三次按下“確定鍵”進入正常溫度顯示。
講解視頻
包含仿真講解和代碼講解
仿真圖
硬件設計:
主控制模塊
主控制最系統(tǒng)電路如圖4所示。
圖4 單片主控電路
顯示模塊電路
顯示采用四位數(shù)碼管顯示,當位選打開時,送入相應的段碼,則相應的數(shù)碼管打開,關掉位選,打開另一個位選,送入相應的段碼,則數(shù)碼管打開,而每次打開關掉相應的位選時,時間間隔低于20ms,從人類視覺的角度上看,就仿佛是全部數(shù)碼管同時顯示的一樣。顯示電路如圖5
圖5 數(shù)碼管顯示
數(shù)碼管顯示驅(qū)動電路
三極管8550來驅(qū)動4位數(shù)碼管,不僅簡單,而且價格便宜。
程序設計
主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量的當前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內(nèi)測量一次被測溫度,主程序的主要功能是負責溫度的實時顯示,讀出并處理DS18B20的當前溫度值,與設定的報警溫度比較,其程序流程見圖9所示。
通過調(diào)用讀溫度子程序把存入內(nèi)存儲中的整數(shù)部分與小數(shù)部分開分存放在不的的兩個單元中,然后通過調(diào)用顯示子程序顯示出來。
程序代碼
/****************主函數(shù)***************/
void main()
{
beep = 0; //開機叫一聲
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff;
temperature = read_temp(); //先讀出溫度的值
init_eeprom(); //開始初始化保存的數(shù)據(jù)
delay_1ms(650);
temperature = read_temp(); //先讀出溫度的值
dis_smg[0] = smg_du[temperature % 10]; //取溫度的小數(shù)顯示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取溫度的個位顯示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取溫度的十位顯示
time_init(); //初始化定時器
while(1)
{
key(); //按鍵程序
if(key_can < 10)
{
key_with(); //設置報警溫度
}
if(flag_300ms == 1) //300ms 處理一次溫度程序
{
flag_300ms = 0;
temperature = read_temp(); //先讀出溫度的值
clock_h_l(); //報警函數(shù)
if(menu_1 == 0)
{
smg_i = 3;
dis_smg[0] = smg_du[temperature % 10]; //取溫度的小數(shù)顯示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取溫度的個位顯示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取溫度的十位顯示
}
}
}
}
DS18B20初始化程序流程圖
在DS18B20工作之前需要進行初始化,流程圖如下:
/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp()
{
uint value;
uchar low; //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳過64位ROM
write_18b20(0x44); //啟動一次溫度轉(zhuǎn)換命令
delay_uint(50); //500us
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳過64位ROM
write_18b20(0xbe); //發(fā)出讀取暫存器命令
EA = 0;
low = read_18b20(); //讀溫度低字節(jié)
value = read_18b20(); //讀溫度高字節(jié)
EA = 1;
value <<= 8; //把溫度的高位左移8位
value |= low; //把讀出的溫度低位放到value的低八位中
value *= 0.625; //轉(zhuǎn)換到溫度值 小數(shù)
return value; //返回讀出的溫度 帶小數(shù)
}
設計報告
摘要
隨著時代的進步和發(fā)展,單片機技術已經(jīng)普及到我們生活、工作、科研、各個領域,已經(jīng)成為一種比較成熟的技術, 本文主要介紹了一個基于STC89C52單片機的溫度報警系統(tǒng),詳細描述了利用溫度傳感器DS18B20開發(fā)測溫系統(tǒng)的過程,重點對傳感器在單片機下的硬件連接,軟件編程以及各模塊系統(tǒng)流程進行了詳盡分析,對各部分的電路也一一進行了介紹,該系統(tǒng)可以方便的實現(xiàn)溫度采集和顯示,并可根據(jù)需要任意設定報警溫度,它使用起來相當方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點,適合于我們?nèi)粘I詈凸ぁ⑥r(nóng)業(yè)生產(chǎn)中的溫度控制,也可以當作溫度處理模塊嵌入其它系統(tǒng)中,作為其他主系統(tǒng)的輔助擴展。DS18B20與STC89C52結(jié)合實現(xiàn)最簡溫度控制系統(tǒng),該系統(tǒng)結(jié)構(gòu)簡單,抗干擾能力強,適合于惡劣環(huán)境下進行現(xiàn)場溫度的控制,有廣泛的應用前景。
**關鍵詞:**單片機;溫度控制;STC89C52;DS18B20;
資料清單&&下載鏈接
資料下載鏈接