單片機(jī)溫度計(jì)設(shè)計(jì)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (12.67 KB, 下載次數(shù): 70)
下載附件
2018-4-12 22:29 上傳
0.png (17.37 KB, 下載次數(shù): 72)
下載附件
2018-4-12 22:29 上傳
設(shè)計(jì)文檔:
0.jpg (19.29 KB, 下載次數(shù): 71)
下載附件
2018-4-12 22:30 上傳
第一章 概述
1.1 設(shè)計(jì)目的
通過(guò)對(duì)溫度控制系統(tǒng)的設(shè)計(jì)、仿真,實(shí)現(xiàn)溫度的信息采集,能夠自由設(shè)置溫度上下限報(bào)警值。
1.2 設(shè)計(jì)任務(wù)
設(shè)計(jì)一個(gè)智能溫度計(jì),并使其具有如下功能:
(1)一路室溫檢測(cè),誤差:≤±0.5℃;
(2)溫度液晶屏顯示(XX.X);
(3)配矩陣鍵盤(pán);
(4)配報(bào)警指示燈及蜂鳴器;
第二章 系統(tǒng)選擇及論證
室溫測(cè)控系統(tǒng)要能夠?qū)κ覝剡M(jìn)行實(shí)時(shí)監(jiān)測(cè),并通過(guò)與設(shè)定值的對(duì)比決策出是否應(yīng)該加熱或降溫,使溫度保持在一定的范圍內(nèi)。當(dāng)溫度超出上下極限時(shí),要發(fā)出報(bào)警信號(hào)并切斷電路,以保證設(shè)備工作性能不被破壞。
在日常生活及工農(nóng)業(yè)生產(chǎn)中,經(jīng)常要用到溫度的檢測(cè)及控制,傳統(tǒng)的測(cè)溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測(cè)出的一般都是電壓,在轉(zhuǎn)換成相應(yīng)的溫度,需要比較多的外部硬件支持。其缺點(diǎn)如下:
硬件電路復(fù)雜;
軟件調(diào)試復(fù)雜;
制作成本高。
本設(shè)計(jì)采用AT89C51單片機(jī),并利用美國(guó)DALLAS半導(dǎo)體公司的智能溫度傳感器DS18B20作為檢測(cè)元件,測(cè)溫范圍為0~50℃,最高分辨率可達(dá)0.0625℃。它具有精度高、可靠性好和能直接將模擬被測(cè)量直接轉(zhuǎn)換成數(shù)字量輸出,因此不需要加A/D轉(zhuǎn)換器,電路簡(jiǎn)單。加上單片機(jī)軟件編程靈活、自由度大,可用軟件編程實(shí)現(xiàn)各種控制算法和邏輯控制。單片機(jī)系統(tǒng)可采用LCD顯示室溫的實(shí)際值,可用鍵盤(pán)輸入設(shè)定值。本設(shè)計(jì)可實(shí)現(xiàn)顯示、鍵盤(pán)設(shè)定、報(bào)警等功能,大大的提高了系統(tǒng)的智能化,也使得系統(tǒng)所測(cè)結(jié)果精度大大提高。DS18B20可直接讀出被測(cè)溫度值,而且采用三線(xiàn)制與單片機(jī)相連,減少了外部的硬件電路,具有低成本和易使用的特點(diǎn)。
2.1 系統(tǒng)總體框圖按照系統(tǒng)設(shè)計(jì)功能要求,確定系統(tǒng)由溫度數(shù)據(jù)采集、鍵盤(pán)設(shè)定、電源電路、主控制器、顯示電路、超限報(bào)警6個(gè)模塊組成。總體結(jié)構(gòu)框圖如圖2-1所示: 圖2-1 系統(tǒng)總體結(jié)構(gòu)框圖
第三章 硬件電路的設(shè)計(jì)3.1單片機(jī)最小系統(tǒng) 本設(shè)計(jì)采用的是AT89C51芯片作為核心部件。 單片機(jī)最小系統(tǒng)組成:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接11.0592MHz晶振。RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O 腳,其功能用途由軟件編程定義。 單片機(jī)最小系統(tǒng)如圖3-1所示。 3.2溫度數(shù)據(jù)采集電路本設(shè)計(jì)的溫度采集電路主要由DS18B20組成,因?yàn)樵撔酒羌尚酒士刹患悠渌娐罚苯訉⑿酒瑪?shù)據(jù)輸出口接到CPUI/O口上。溫度數(shù)據(jù)采集電路如圖3-2所示。 
圖3.1 單片機(jī)最小系統(tǒng)
圖3.2 溫度數(shù)據(jù)采集電路 3.3鍵盤(pán)設(shè)定 圖3.3 鍵盤(pán)電路 3.4 顯示電路 顯示電路如圖3-4所示 圖3.4 顯示電路 3.5 溫度報(bào)警 報(bào)警電路利用P1.5進(jìn)行控制有源蜂鳴器,當(dāng)溫度超過(guò)設(shè)定的上下限溫度值時(shí),開(kāi)始報(bào)警。如圖3-5所示。 圖3.5 報(bào)警電路 3.7硬件原理總圖硬件原理總圖如圖3-6所示。 圖3-6 硬件原理總圖 第四章 系統(tǒng)軟件的設(shè)計(jì)4.1各部分程序設(shè)計(jì)及其子程序流程圖系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計(jì)算溫度子程序,報(bào)警子程序和顯示數(shù)據(jù)刷新子程序等。 - 主程序:主程序的主要功能是負(fù)責(zé)溫度的實(shí)時(shí)顯示,讀出并處理DS18B20的測(cè)量溫度值。溫度測(cè)量每5s進(jìn)行一次。主程序流程圖如圖4.1所示。
 圖4-1 主程序流程圖 - 讀出溫度子程序:讀出溫度子程的主要功能是讀出RAM中的9字節(jié)。在讀出時(shí)須進(jìn)行CRC校驗(yàn),校驗(yàn)有錯(cuò)時(shí)不能進(jìn)行溫度數(shù)據(jù)的改寫(xiě)。讀出溫度子程序流程圖如圖4.2所示。

圖4-2 溫度子程序流程圖 溫度轉(zhuǎn)換命令子程序:溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開(kāi)始命令。當(dāng)采用12位分辨率時(shí),轉(zhuǎn)換時(shí)間約為750 ms。在本程序設(shè)計(jì)中,采用5s顯示程序延時(shí)法等待轉(zhuǎn)換的完成。溫度轉(zhuǎn)換命令子程序流程圖如圖4.3所示。 
圖4-3 溫度轉(zhuǎn)換子程序流程圖 計(jì)算溫度子程序:計(jì)算溫度子程序?qū)AM中讀取的值進(jìn)行十進(jìn)制的轉(zhuǎn)換運(yùn)算,并進(jìn)行溫度值正負(fù)的判斷。其流程圖如圖4.4所示。 
圖4-4 計(jì)算溫度子程序流程圖 顯示數(shù)據(jù)刷新子程序:顯示數(shù)據(jù)刷新子程序主要是對(duì)顯示緩沖器中的顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高數(shù)據(jù)顯示位為0時(shí),將符號(hào)顯示位移入下一位。顯示數(shù)據(jù)刷新子程序流程圖如圖4.5所示。 
圖4-5 顯示數(shù)據(jù)刷新子程序流程圖 4.2 溫度采集DS18B20部分程序設(shè)計(jì)分析由于DS18B20單線(xiàn)通信功能是分時(shí)完成的,它有嚴(yán)格的時(shí)隙概念,因此讀寫(xiě)時(shí)序很重要。系統(tǒng)對(duì)DS18B20的一般操作過(guò)程為:初始化DS18B20(發(fā)復(fù)位脈沖)→發(fā)ROM功能命令→發(fā)存儲(chǔ)器操作命令→處理數(shù)據(jù)。 ①初始化:?jiǎn)纹瑱C(jī)將數(shù)據(jù)線(xiàn)拉低480-960us后釋放,等待15-60us,單總線(xiàn)器件即可輸出一個(gè)持續(xù)時(shí)間為60-240us的低電平(應(yīng)答信號(hào)),單片機(jī)收到此應(yīng)答后即可進(jìn)行后續(xù)操作; ②寫(xiě)時(shí)序:當(dāng)主機(jī)將數(shù)據(jù)線(xiàn)的電平從高拉到低時(shí),形成寫(xiě)時(shí)序,有寫(xiě)0和寫(xiě)1兩種時(shí)序。寫(xiě)時(shí)序開(kāi)始后,DS18B20在15-60us期間從數(shù)據(jù)線(xiàn)上采樣,如果采樣到低電平,則向DS18B20寫(xiě)0,否則寫(xiě)1,兩個(gè)獨(dú)立的時(shí)序之間至少需要1us的回復(fù)時(shí)間按(拉高總線(xiàn)電平); ③讀時(shí)序:當(dāng)主機(jī)從DS18B20讀取數(shù)據(jù)時(shí),產(chǎn)生讀時(shí)序,此時(shí),主機(jī)將數(shù)據(jù)線(xiàn)的電平從高拉到低使讀時(shí)序被初始化。如果此后5s內(nèi),主機(jī)在總線(xiàn)上采樣到低電平,則從DS18B20讀0,否則讀1。 總結(jié) 本系統(tǒng)是以單片機(jī)為核心部件的水溫控制系統(tǒng),利用軟件編程,最終實(shí)現(xiàn)各項(xiàng)設(shè)計(jì)要求。在設(shè)計(jì)過(guò)程中,我們對(duì)設(shè)計(jì)中用到的相關(guān)軟件有基本簡(jiǎn)單的了解及簡(jiǎn)單使用,同時(shí)對(duì)AT89S51單片機(jī)以及DS18B20溫度傳感器有了更深的認(rèn)識(shí)。做設(shè)計(jì)的時(shí)候,不僅要有足夠的知識(shí)儲(chǔ)備,而且也需要耐心和細(xì)心,很多時(shí)候小失誤就會(huì)導(dǎo)致電路不通。只有做到細(xì)心檢查,才能減少出錯(cuò)的機(jī)率,只有不斷發(fā)現(xiàn)問(wèn)題,并自己尋求解決問(wèn)題的方法,正確解決問(wèn)題,我們才能從中得到成長(zhǎng),提升自己的能力。 從最初拿到文檔項(xiàng)目時(shí)的毫無(wú)頭緒,到開(kāi)始著手搜集資料,再到后來(lái)一起整理資料,到最后商量確定好最后的設(shè)計(jì),我們一步一步的做下來(lái)。這期間,也曾有過(guò)一些分歧,也有過(guò)小爭(zhēng)吵,但最后兩個(gè)人還是達(dá)成一致,齊心完成了設(shè)計(jì)。不論是個(gè)人還是一個(gè)小組、一個(gè)團(tuán)隊(duì),做任何事都少不了身邊人的幫助,在此,我們也衷心感謝老師的耐心指導(dǎo)和同學(xué)的熱心幫忙。
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <intrins.h> //_nop_();延時(shí)函數(shù)用
- #define Disdata P0 //段碼輸出口
- #define discan P2 //掃描口
- #define uchar unsigned char
- #define uint unsigned int
- uint h;
- uint temp;
- sbit DQ=P3^7; //共陰數(shù)碼管
- uchar ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,
- 0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- uchar xianshi1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //不帶小數(shù)點(diǎn)的0-9編碼
- uchar scan_con[4]={0xf7,0xfB,0xfD,0xfe}; //列掃描控制字
- uchar temp_data[2]={0x00,0x00}; //讀出溫度暫放
- uchar display[5]={0x00,0x00,0x00,0x00,0x00};
- //顯示單元數(shù)據(jù),共4個(gè)數(shù)據(jù)和一個(gè)運(yùn)算暫用
- void delay(uint t)
- {
- for (;t>0;t--);
- }
- void scan(void)
- {
- char k;
- for(k=0;k<4;k++) //4位LED掃描控制
- {
- Disdata=xianshi1[display[k]]; //數(shù)據(jù)顯示
- if (k==1)
- Disdata=xianshi1[display[k]]|0x80; //小數(shù)點(diǎn)顯示
- discan=scan_con[k]; //位選
- delay(90);
- discan=0xff;
- }
- }
- /****************DS18B20復(fù)位函數(shù)************************/
- void ow_reset(void)
- {
- char presence=1;
- while(presence)
- {
- while(presence)
- {
- DQ=1;_nop_();_nop_();//從高拉倒低
- DQ=0;
- delay(50); //550 us
- DQ=1;
- delay(6); //66 us
- presence=DQ; //presence=0 復(fù)位成功,繼續(xù)下一步
- }
- delay(45); //延時(shí)500 us
- presence=~DQ;
- }
- DQ=1; //拉高電平
- }
- /*向DS18B20寫(xiě)入一個(gè)字節(jié)*/
- void write_byte(uchar val)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- DQ=1;_nop_();_nop_(); //從高拉倒低
- DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
- DQ=val&0x01; //最低位移出
- delay(6); //66 us
- val=val/2; //右移1位
- }
- DQ=1;
- delay(1);
- }
- /*從DS18B20讀出一個(gè)字節(jié)*/
- uchar read_byte(void)
- {
- uchar i;
- uchar value=0;
- for(i=8;i>0;i--)
- {
- DQ=1;_nop_();_nop_();
- value>>=1;
- DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
- DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
- if(DQ)value|=0x80;
- delay(6); //66 us
- }
- DQ=1;
- return(value);
- }
- uint read_temp(void)
- {
- ow_reset(); //總線(xiàn)復(fù)位
- delay(200);
- write_byte(0xcc); //發(fā)命令
- write_byte(0x44); //發(fā)轉(zhuǎn)換命令
- ow_reset();
- delay(1);
- write_byte(0xcc); //發(fā)命令
- write_byte(0xbe);
- temp_data[0]=read_byte(); //讀溫度值的第字節(jié)
- temp_data[1]=read_byte(); //讀溫度值的高字節(jié)
- temp=temp_data[1];
- temp<<=8;
- temp=temp|temp_data[0]; // 兩字節(jié)合成一個(gè)整型變量。
- return temp; //返回溫度值
- }
- void work_temp(uint tem)
- {
- uchar n=0;
- if(tem>6348) // 溫度值正負(fù)判斷
- {tem=65536-tem;n=1;} // 負(fù)溫度求補(bǔ)碼,標(biāo)志位置1
- display[4]=tem&0x0f; // 取小數(shù)部分的值
- display[0]=ditab[display[4]]; // 存入小數(shù)部分顯示值
- display[4]=tem>>4; // 取中間八位,即整數(shù)部分的值
- display[3]=display[4]/100; // 取百位數(shù)據(jù)暫存
- display[1]=display[4]%100; // 取后兩位數(shù)據(jù)暫存
- display[2]=display[1]/10; // 取十位數(shù)據(jù)暫存
- display[1]=display[1]%10;
- if(!display[3])
- {
- display[3]=0x00; //最高位為0時(shí)不顯示
- if(!display[2])
- {
- display[2]=0x3f; //次高位為0時(shí)不顯示
- }
- }
- if(n=1){ display[3]=0x40;} //負(fù)溫度時(shí)最高位顯示"-"
- }
- void main(void)
- {
- Disdata=0x00; //初始化端口
- discan=0x00;
- for(h=0;h<4;h++) //開(kāi)機(jī)顯示"0000"
- {display[h]=0;}
- ow_reset(); //開(kāi)機(jī)先轉(zhuǎn)換一次
- write_byte(0xcc); //Skip ROM
- write_byte(0x44); //發(fā)轉(zhuǎn)換命令
- for(h=0;h<100;h++) //開(kāi)機(jī)顯示"0000"
- {scan();}
- while(1)</font>
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (55.31 KB, 下載次數(shù): 77)
下載附件
2018-4-12 22:29 上傳
本人初學(xué),僅供參考,存在錯(cuò)誤和不足之處,請(qǐng)大家回帖多多指教,切勿照搬,文件下載:
求指導(dǎo)如何完善:
單片機(jī)課設(shè)(張明倩).rar
(352.21 KB, 下載次數(shù): 205)
2018-4-12 11:46 上傳
點(diǎn)擊文件名下載附件
|