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