第一篇:單片機(jī)數(shù)字溫度計(jì)畢業(yè)設(shè)計(jì)提綱 大綱 參考
畢業(yè)論文設(shè)計(jì)提綱
學(xué)
生:
專業(yè): 電子信息工程技術(shù)
指導(dǎo)教師:
職稱: 高級(jí)電子工程師 【題目】
《 單片機(jī)數(shù)字溫度計(jì)顯示設(shè)計(jì) 》 【摘要】
(對設(shè)計(jì)進(jìn)行評(píng)估)
【關(guān)鍵字】
單片機(jī)、溫度傳感器、數(shù)字顯示
設(shè)計(jì)準(zhǔn)備:搜集、分析相關(guān)資料確定實(shí)現(xiàn)的系統(tǒng)功能,及相關(guān)配套知識(shí)。設(shè)計(jì)功能: 1.設(shè)計(jì)內(nèi)容
采用數(shù)字式溫度傳感器為檢測器件,進(jìn)行單點(diǎn)溫度檢測。用數(shù)碼管直接顯示溫度值,微機(jī)系統(tǒng)作為數(shù)字溫度計(jì)的控制系統(tǒng)。
(1)檢測的溫度范圍:0℃~100℃,檢測分辨率 0.5℃。(2)用4位數(shù)碼管來顯示溫度值。(3)超過警戒值(自己定義)要報(bào)警提示。2.?dāng)M達(dá)到目標(biāo)
設(shè)計(jì)出來的電子溫度計(jì)能夠精確的測量出溫度值,能夠顯示0℃~120℃的溫度,超過或者低于設(shè)定上下線時(shí)能夠準(zhǔn)確的發(fā)出警報(bào)(自定義)。////////藍(lán)色字體可不用 【內(nèi)容】
第1章 系統(tǒng)總體設(shè)計(jì)及功能
1.1
設(shè)計(jì)背景
1.2
電路工作原理
1.3
設(shè)計(jì)實(shí)現(xiàn)功能
1.4
設(shè)計(jì)所需軟件
第2章
單片機(jī)原理與應(yīng)用系統(tǒng)硬件選取
2.1
AT89S51概述
(功能、參數(shù)具體在分小節(jié))2.2
DS18B20概述
(參數(shù)、實(shí)用方法在分小節(jié))第3章 系統(tǒng)硬件原理電路設(shè)計(jì)
3.1 單片機(jī)最小系統(tǒng)電路設(shè)計(jì) 3.2 溫度傳感器電路設(shè)計(jì) 3.3 顯示電路設(shè)計(jì)
3.4 報(bào)警電路設(shè)計(jì)(可選)第4章
系統(tǒng)應(yīng)用軟件設(shè)計(jì)
4.1 系統(tǒng)程序流程圖 4.2 系統(tǒng)程序代碼
第5章
系統(tǒng)軟件仿真及硬件測試
5.2
應(yīng)用仿真軟件仿真測試
5.3
進(jìn)行實(shí)物硬件測試(可選)第6章
全文設(shè)計(jì)總結(jié)
6.1
設(shè)計(jì)整體效果
6.2
設(shè)計(jì)發(fā)展及期待 致謝
參考文獻(xiàn)
(后備上)附件
(可選)
第二篇:基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)課程設(shè)計(jì)
基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)
引言
隨著現(xiàn)代信息技術(shù)的飛速發(fā)展和傳統(tǒng)工業(yè)改造的逐步實(shí)現(xiàn).能夠獨(dú)立工作的溫度檢測和顯示系統(tǒng)應(yīng)用于諸多領(lǐng)域。傳統(tǒng)的溫度檢測以熱敏電阻為溫度敏感元件。熱敏電阻的成本低,但需后續(xù)信號(hào)處理電路,而且可靠性相對較差,測溫準(zhǔn)確度低,檢測系統(tǒng)也有一定的誤差。與傳統(tǒng)的溫度計(jì)相比,這里設(shè)計(jì)的數(shù)字溫度計(jì)具有讀數(shù)方便,測溫范圍廣,測溫精確,數(shù)字顯示,適用范圍寬等特點(diǎn)。選用AT89C51型單片機(jī)作為主控制器件,DSl8B20作為測溫傳感器通過4位共陽極LED數(shù)碼管串口傳送數(shù)據(jù),實(shí)現(xiàn)溫度顯示。通過DSl8B20直接讀取被測溫度值,進(jìn)行數(shù)據(jù)轉(zhuǎn)換,該器件的物理化學(xué)性能穩(wěn)定,線性度較好,在0℃~100℃最大線性偏差小于0.1℃。該器件可直接向單片機(jī)傳輸數(shù)字信號(hào),便于單片機(jī)處理及控制。另外,該溫度計(jì)還能直接采用測溫器件測量溫度,從而簡化數(shù)據(jù)傳輸與處理過程。
系統(tǒng)硬件設(shè)計(jì)方案
根據(jù)系統(tǒng)功能要求,構(gòu)造圖1所示的系統(tǒng)原理結(jié)構(gòu)框圖。
圖1
系統(tǒng)原理結(jié)構(gòu)框圖
2.1
單片機(jī)的選擇
AT89C51作為溫度測試系統(tǒng)設(shè)計(jì)的核心器件。該器件是INTEL公司生產(chǎn)的MCS一5l系列單片機(jī)中的基礎(chǔ)產(chǎn)品,采用了可靠的CMOS工藝制造技術(shù),具有高性能的8位單片機(jī),屬于標(biāo)準(zhǔn)的MCS—51的CMOS產(chǎn)品。不僅結(jié)合了HMOS的高速和高密度技術(shù)及CHMOS的低功耗特征,而且繼承和擴(kuò)展了MCS—48單片機(jī)的體系結(jié)構(gòu)和指令系統(tǒng)。單片機(jī)小系統(tǒng)的電路圖如圖2所示。
圖2
單片機(jī)小系統(tǒng)電路
AT89C51單片機(jī)的主要特性:
(1)與MCS-51
兼容,4K字節(jié)可編程閃爍存儲(chǔ)器;
(2)靈活的在線系統(tǒng)編程,掉電標(biāo)識(shí)和快速編程特性;
(3)壽命為1000次寫/擦周期,數(shù)據(jù)保留時(shí)間可10年以上;
(4)全靜態(tài)工作模式:0Hz-33Hz;
(5)三級(jí)程序存儲(chǔ)器鎖定;
(6)128*8位內(nèi)部RAM,32可編程I/O線;
(7)兩個(gè)16位定時(shí)器/計(jì)數(shù)器,6個(gè)中斷源;
(8)全雙工串行UART通道,低功耗的閑置和掉電模式;
(9)看門狗(WDT)及雙數(shù)據(jù)指針;
(9)片內(nèi)振蕩器和時(shí)鐘電路;
2.2
溫度傳感器介紹
DS18B20可以程序設(shè)定9~12位的分辨率,精度為±0.5°C。可選更小的封裝方式,更寬的電壓適用范圍。分辨率設(shè)定,及用戶設(shè)定的報(bào)警溫度存儲(chǔ)在EPROM中,掉電后依然保存。
溫度傳感器DS18B20引腳如圖3所示。
8引腳封裝
TO-92封裝
圖3
溫度傳感器
引腳功能說明:
NC
:空引腳,懸空不使用;
VDD
:可選電源腳,電源電壓范圍3~5.5V。當(dāng)工作于寄生電源時(shí),此引腳必須接地。
DQ
:數(shù)據(jù)輸入/輸出腳。漏極開路,常態(tài)下高電平。
GND
:為電源地
DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。
光刻ROM中的64位序列號(hào)是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產(chǎn)品類型標(biāo)號(hào),接著的48位是該DS18B20自身的序列號(hào),最后8位是前面56位的循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一根總線上掛接多個(gè)DS18B20的目的。
DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉(zhuǎn)化為例:用16位符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼讀數(shù)形式提供,以0.0625℃/LSB形式表達(dá),其中S為符號(hào)位。
這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,二進(jìn)制中的前面5位是符號(hào)位,如果測得的溫度大于0,這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。
例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FF6FH,-55℃的數(shù)字輸出為FC90H。
DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發(fā)器TH、TL和結(jié)構(gòu)寄存器。
暫存存儲(chǔ)器包含了8個(gè)連續(xù)字節(jié),前兩個(gè)字節(jié)是測得的溫度信息,第一個(gè)字節(jié)的內(nèi)容是溫度的低八位,第二個(gè)字節(jié)是溫度的高八位。第三個(gè)和第四個(gè)字節(jié)是TH、TL的易失性拷貝,第五個(gè)字節(jié)是結(jié)構(gòu)寄存器的易失性拷貝,這三個(gè)字節(jié)的內(nèi)容在每一次上電復(fù)位時(shí)被刷新。第六、七、八個(gè)字節(jié)用于內(nèi)部計(jì)算。第九個(gè)字節(jié)是冗余檢驗(yàn)字節(jié)。
該字節(jié)各位的意義如下:
TM
R1
R0
低五位一直都是1,TM是測試模式位,用于設(shè)置DS18B20在工作模式還是在測試模式。在DS18B20出廠時(shí)該位被設(shè)置為0,用戶不要去改動(dòng)。R1和R0用來設(shè)置分辨率,如表1所示:(DS18B20出廠時(shí)被設(shè)置為12位)
表1
DS18B20溫度轉(zhuǎn)換時(shí)間表
R1
R0
分辨率/位
溫度最大轉(zhuǎn)向時(shí)間
0
0
93.75
0
187.5
0
375
750
根據(jù)DS18B20的通訊協(xié)議,主機(jī)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個(gè)步驟:每一次讀寫之前都要對DS18B20進(jìn)行復(fù)位,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進(jìn)行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,DS18B20收到信號(hào)后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號(hào)表示復(fù)位成功。
2.3
溫度傳感器與單片機(jī)的連接
溫度傳感器的單總線(1-Wire)與單片機(jī)的P2.0連接,P2.0是單片機(jī)的高位地址線A8。P2端口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O,其輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對該端口寫“1”,可通過內(nèi)部上拉電阻將其端口拉至高電平,此時(shí)可作為輸入口使用,這是因?yàn)閮?nèi)部存在上拉電阻,某一引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。在訪問外部程序存儲(chǔ)器或16位地址的外部數(shù)據(jù)存儲(chǔ)器時(shí)。如執(zhí)行MOVX
DPTR指令,則表示P2端口送出高8位的地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲(chǔ)器時(shí),可執(zhí)行MOVX
RI指令,P2端口內(nèi)容即為特殊功能寄存器(SFR)區(qū)中R2寄存器內(nèi)容,整個(gè)訪問期間不改變。在Flash編程和程序校驗(yàn)時(shí),P2端口也接收高位地址和其他控制信號(hào)。圖4為DSl8820內(nèi)部結(jié)構(gòu)。圖5為DSl8820與單片機(jī)的接口電路。
圖4
DS18B20內(nèi)部結(jié)構(gòu)圖
圖5
DS18B20和單片機(jī)的接口連接
2.4
復(fù)位信號(hào)及外部復(fù)位電路
單片機(jī)的P1.6端口是MAX813看門狗電路中喂狗信號(hào)的輸入端,即單片機(jī)每執(zhí)行一次程序就設(shè)置一次喂狗信號(hào),清零看門狗器件。若程序出現(xiàn)異常,單片機(jī)引腳RST將出現(xiàn)兩個(gè)機(jī)器周期以上的高電平,使其復(fù)位。該復(fù)位信號(hào)高電平有效,其有效時(shí)間應(yīng)持續(xù)24個(gè)振蕩脈沖周期即兩個(gè)機(jī)器周期以上。若使用頻率為12
MHz的晶體振蕩器,則復(fù)位信號(hào)持續(xù)時(shí)間應(yīng)超過2μs才完成復(fù)位操作。
2.5
單片機(jī)與報(bào)警電路
系統(tǒng)中的報(bào)警電路是由發(fā)光二極管和限流電阻組成,并與單片機(jī)的P1.2端口連接。P1端口的作用和接法與P2端口相同,不同的是在Flash編程和程序校驗(yàn)期間,P1接收低8位地址數(shù)據(jù)。
2.6
電源電路
由于該系統(tǒng)需要穩(wěn)定的5
V電源,因此設(shè)計(jì)時(shí)必須采用能滿足電壓、電流和穩(wěn)定性要求的電源。該電源采用三端集成穩(wěn)壓器LM7805。它僅有輸入端、輸出端及公共端3個(gè)引腳,其內(nèi)部設(shè)有過流保護(hù)、過熱保護(hù)及調(diào)整管安全保護(hù)電路.由于所需外接元件少,使用方便、可靠,因此可作為穩(wěn)壓電源。圖6為電源電路連接圖。
圖6
電源電路連接圖
2.7
顯示電路
采用技術(shù)成熟的74HCl64實(shí)現(xiàn)串并轉(zhuǎn)換。LED顯示分為靜態(tài)顯示和動(dòng)態(tài)顯示。這里采用靜態(tài)顯示,系統(tǒng)通過單片機(jī)的串行口來實(shí)現(xiàn)靜態(tài)顯示。串行口為方式零狀態(tài),即工作在移位寄存器方式,波特率為振蕩頻率的1/12。當(dāng)器件執(zhí)行任何一條將SBUF作為目的寄存器的命令時(shí),數(shù)據(jù)便開始從RXD端發(fā)送。在寫信號(hào)有效時(shí),相隔一個(gè)機(jī)器周期后發(fā)送控制端SEND有效,即允許RXD發(fā)送數(shù)據(jù),同時(shí)允許從TXD端輸出移位脈沖。圖7為顯示電路的連接圖。
圖7
顯示電路的連接圖
2.8
看門狗電路
系統(tǒng)中把P1.6作為看門狗的“喂狗”信號(hào);將MAX813的RESET與單片機(jī)的復(fù)位信號(hào)RST連接。由于單片機(jī)每執(zhí)行一次程序,就會(huì)給看門狗器件一個(gè)復(fù)位信號(hào),這樣也可以用手工方式實(shí)現(xiàn)復(fù)位。當(dāng)按鍵按下時(shí),SW—SPST就會(huì)在MAX813引腳產(chǎn)生一個(gè)超過200
ms的低電平,其實(shí)看門狗器件在1.6
s時(shí)間內(nèi)沒有復(fù)位,使7引腳輸出一個(gè)復(fù)位信號(hào)的作用是相同的,其連接圖如圖8所示。
圖8
看門狗器件的MAX813的連接圖
軟件設(shè)計(jì)
DSl8820的主要數(shù)據(jù)元件有:64位激光Lasered
ROM,溫度靈敏元件和非易失性溫度告警觸發(fā)器TH和TL。DSBl820可以從單總線獲取電源,當(dāng)信號(hào)線為高電平時(shí),將能量貯存在內(nèi)部電容器中;當(dāng)單信號(hào)線為低電平時(shí),將該電源斷開,直到信號(hào)線變?yōu)楦唠娖街匦陆由霞纳?電容)電源為止。此外,還可外接5
V電源,給DSl8820供電。DSl8820的供電方式靈活,利用外接電源還可增加系統(tǒng)的穩(wěn)定性和可靠性。圖9為讀取數(shù)據(jù)流程圖。
開始
DS18B20的初始化
啟動(dòng)溫度轉(zhuǎn)換
讀取溫度寄存器
跳過讀序列號(hào)的操作
跳過讀序列號(hào)的操作
DS18B20的初始化
RET
LOW-低八位
HIGH-高八位
圖9
讀取數(shù)據(jù)的流程圖
讀出溫度數(shù)據(jù)后,LOW的低四位為溫度的小數(shù)部分,可以精確到0.0625℃,LOW的高四位和HIGH的低四位為溫度的整數(shù)部分,HIGH的高四位全部為1表示負(fù)數(shù),全為0表示正數(shù)。所以先將數(shù)據(jù)提取出來,分為三個(gè)部分:小數(shù)部分、整數(shù)部分和符號(hào)部分。小數(shù)部分進(jìn)行四舍五入處理:大于0.5℃的話,向個(gè)位進(jìn)1;小于0.5℃的時(shí)候,舍去不要。當(dāng)數(shù)據(jù)是個(gè)負(fù)數(shù)的時(shí)候,顯示之前要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,將其整數(shù)部分取反加一。還因?yàn)镈S18B20最低溫度只能為-55℃,所以可以將整數(shù)部分的最高位換成一個(gè)“-”,表示為負(fù)數(shù)。圖10為溫度數(shù)據(jù)處理程序的流程圖。
開始
提取整數(shù)部分存入HT
提取小數(shù)部分存入LT
LT右移三位,將精度降低到0.5攝氏度
HT++
將小數(shù)部分整數(shù)化
提取符號(hào)部分存入sign
LT是否大于5
Sign=?0XF0
RET
負(fù)數(shù)表示flag=1
HT=~HT+1
Y
N
N
Y
圖10
溫度數(shù)據(jù)處理流程圖
數(shù)據(jù)測試
將溫度傳感器與冰水混合物接觸,經(jīng)過充分?jǐn)嚢柽_(dá)到熱平衡后調(diào)節(jié)系統(tǒng),使顯示讀數(shù)為0.00(標(biāo)定0℃);利用氣壓計(jì)讀出當(dāng)時(shí)當(dāng)?shù)氐拇髿鈮簭?qiáng),并根據(jù)大氣壓強(qiáng)和當(dāng)?shù)刂亓铀俣扔?jì)算出當(dāng)時(shí)的實(shí)際壓強(qiáng);根據(jù)沸點(diǎn)與壓強(qiáng)的關(guān)系查出沸點(diǎn)溫度。把溫度傳感器放入沸水中,待顯示讀數(shù)穩(wěn)定后重新調(diào)節(jié),使顯示器顯示讀數(shù)等于當(dāng)?shù)禺?dāng)時(shí)沸點(diǎn)溫度后工作結(jié)束。該溫度計(jì)的量程為-50℃~150℃,讀數(shù)精度為0.1℃,實(shí)際使用一般在0℃~100℃。采用0℃~50℃和50℃~100℃的精密水銀溫度計(jì)作檢驗(yàn)標(biāo)準(zhǔn),對設(shè)計(jì)的溫度計(jì)進(jìn)行測試,其結(jié)果表明能達(dá)到該精度要求。
總結(jié)與體會(huì)
作為一名電子信息工程的大四學(xué)生,我覺得做單片機(jī)課程設(shè)計(jì)是很有意義的,而且也是必要的。在做這次課程設(shè)計(jì)的過程中,我感觸最深的當(dāng)屬查閱大量的設(shè)計(jì)資料了。為了讓自己的設(shè)計(jì)更加完善,查閱這方面的實(shí)際資料是十分必要的,也是必不可少的。
其次,在這次課程設(shè)計(jì)中,我們運(yùn)用了以前學(xué)過的專業(yè)課知識(shí),如:proteus仿真、匯編語言、模擬和數(shù)字電路知識(shí)等。雖然過去我從未獨(dú)立應(yīng)用過他們,但在學(xué)習(xí)的過程中帶著問題去學(xué)我發(fā)現(xiàn)效率很高,這是我做這次課程設(shè)計(jì)的又一收獲。
最后,要做好一個(gè)課程設(shè)計(jì),就必須做到:在設(shè)計(jì)程序之前,對所用單片機(jī)的內(nèi)部結(jié)構(gòu)有一個(gè)系統(tǒng)的了解,知道該單片機(jī)有哪些資源;要有一個(gè)清晰的思路和一個(gè)完整的軟件流程圖;在設(shè)計(jì)程序時(shí),不能妄想一次將整個(gè)程序設(shè)計(jì)好,反復(fù)修改、不斷改進(jìn)是程序設(shè)計(jì)的必經(jīng)之路;要養(yǎng)成注釋程序的好習(xí)慣,這樣為資料的保留和交流提供了方便;在設(shè)計(jì)中遇到的問題要記錄,以免下次遇到同樣的問題。
在這次的課程設(shè)計(jì)中,我真正的意識(shí)到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識(shí)用到實(shí)際當(dāng)中,學(xué)習(xí)單片機(jī)更是如此,程序只有在經(jīng)常寫與讀的過程中才能提高,這就是這次課程設(shè)計(jì)的最大收獲。
附錄1
仿真圖
附錄2
程序源代碼
DATA_BUS
BIT
P3.3
FLAG
BIT
00H
;標(biāo)志位
TEMP_L
EQU
30H
;溫度值低字節(jié)
TEMP_H
EQU
31H
;溫度值高字節(jié)
TEMP_DP
EQU
32H
;溫度小數(shù)
TEMP_INT
EQU
33H
;溫度值整數(shù)
TEMP_BAI
EQU
34H
;溫度百位數(shù)
TEMP_SHI
EQU
35H
;溫度十位數(shù)
TEMP_GE
EQU
36H
;溫度個(gè)位數(shù)
DIS_BAI
EQU
37H
;顯示百位數(shù)
DIS_SHI
EQU
38H
;顯示十位數(shù)
DIS_GE
EQU
39H
;顯示個(gè)位數(shù)
DIS_DP
EQU
3AH
;顯示小數(shù)位
DIS_ADD
EQU
3BH
;顯示地址
ORG
0000H
AJMP
START
ORG
0050H
;初始化
START:
MOV
SP,#40H
MAIN:
LCALL
READ_TEMP
;調(diào)讀溫度程序
LCALL
PROCESS
;調(diào)數(shù)據(jù)處理程序
AJMP
MAIN
;讀溫度程序
READ_TEMP:
LCALL
RESET_PULSE
;調(diào)用復(fù)位脈沖程序
MOV
A,#0CCH
;跳過ROM命令
LCALL
WRITE
MOV
A,#44H
;讀溫度
LCALL
WRITE
LCALL
DISPLAY
;顯示溫度
LCALL
RESET_PULSE
;調(diào)用復(fù)位脈沖程序
MOV
A,#0CCH
;跳過ROM命令
LCALL
WRITE
MOV
A,#0BEH
;讀緩存命令
LCALL
WRITE
LCALL
READ
RET
;復(fù)位脈沖程序
RESET_PULSE:
RESET:
SETB
DATA_BUS
NOP
NOP
CLR
DATA_BUS
MOV
R7,#255
DJNZ
R7,$
SETB
DATA_BUS
MOV
R7,#30
DJNZ
R7,$
JNB
DATA_BUS,SETB_FLAG
CLR
FLAG
AJMP
NEXT
SETB_FLAG:
SETB
FLAG
NEXT:
MOV
R7,#120
DJNZ
R7,$
SETB
DATA_BUS
JNB
FLAG,RESET
RET
;寫命令
WRITE:
SETB
DATA_BUS
MOV
R6,#8
CLR
C
WRITING:
CLR
DATA_BUS
MOV
R7,#5
DJNZ
R7,$
RRC
A
MOV
DATA_BUS,C
MOV
R7,#30H
DJNZ
R7,$
SETB
DATA_BUS
NOP
DJNZ
R6,WRITING
RET
;循環(huán)顯示段位
DISPLAY:
MOV
R4,#200
DIS_LOOP:
MOV
A,DIS_DP
MOV
P2,#0FFH
MOV
P0,A
CLR
P2.7
LCALL
DELAY2MS
MOV
A,DIS_GE
MOV
P2,#0FFH
MOV
P0,A
SETB
P0.7
CLR
P2.6
LCALL
DELAY2MS
MOV
A,DIS_SHI
MOV
P2,#0FFH
MOV
P0,A
CLR
P2.5
LCALL
DELAY2MS
MOV
A,DIS_BAI
MOV
P2,#0FFH
MOV
P0,A
MOV
A,TEMP_BAI
CJNE
A,#0,SKIP
AJMP
NEXTT
SKIP:
CLR
P2.4
LCALL
DELAY2MS
NEXTT:
NOP
DJNZ
R4,DIS_LOOP
RET
;讀命令
READ:
SETB
DATA_BUS
MOV
R0,#TEMP_L
MOV
R6,#8
MOV
R5,#2
CLR
C
READING:
CLR
DATA_BUS
NOP
NOP
SETB
DATA_BUS
NOP
NOP
NOP
NOP
MOV
C,DATA_BUS
RRC
A
MOV
R7,#30H
DJNZ
R7,$
SETB
DATA_BUS
DJNZ
R6,READING
MOV
@R0,A
INC
R0
MOV
R6,#8
SETB
DATA_BUS
DJNZ
R5,READING
RET
;數(shù)據(jù)處理
PROCESS:
MOV
R7,TEMP_L
MOV
A,#0FH
ANL
A,R7
MOV
TEMP_DP,A
MOV
R7,TEMP_L
MOV
A,#0F0H
ANL
A,R7
SWAP
A
MOV
TEMP_L,A
MOV
R7,TEMP_H
MOV
A,#0FH
ANL
A,R7
SWAP
A
ORL
A,TEMP_L
MOV
B,#64H
DIV
AB
MOV
TEMP_BAI,A
MOV
A,#0AH
XCH
A,B
DIV
AB
MOV
TEMP_SHI,A
MOV
TEMP_GE,B
MOV
A,TEMP_DP
MOV
DPTR,#TABLE_DP
MOVC
A,@A+DPTR
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_DP,A
MOV
A,TEMP_GE
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_GE,A
MOV
A,TEMP_SHI
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_SHI,A
MOV
A,TEMP_BAI
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_BAI,A
RET
DELAY2MS:
MOV
R6,#3
LOOP3:
MOV
R5,#250
DJNZ
R5,$
DJNZ
R6,LOOP3
RET
TABLE_DP:
DB
00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB
06H,07H,08H,08H,09H,09H
TABLE_INTER:
DB
03FH,006H,05BH,04FH,066H
DB
06DH,07DH,07H,07FH,06FH
END
第三篇:基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)課程設(shè)計(jì)
課
題:
基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
專
業(yè):
電子信息工程
班
級(jí):
班
學(xué)
號(hào):
姓
名:
指導(dǎo)教師:
設(shè)計(jì)日期:
成績:
XX大學(xué)XX學(xué)院電氣學(xué)院
基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
一、設(shè)計(jì)目的1、掌握單片機(jī)電路的設(shè)計(jì)原理、組裝與調(diào)試方法。
2、掌握LED數(shù)碼顯示電路的設(shè)計(jì)和使用方法。
3、掌握DS18B20溫度傳感器的工作原理及使用方法。
二、設(shè)計(jì)要求
1、本次單片機(jī)課程設(shè)計(jì)要求以51系列單片機(jī)為核心,以開發(fā)板為平臺(tái)。
2、設(shè)計(jì)一個(gè)數(shù)字式溫度計(jì),要求使用DS18B20溫度傳感器測量溫度。
3、經(jīng)單片機(jī)處理后,要求用4位一體共陰LED數(shù)碼管來設(shè)計(jì)顯示電路,以顯示測量的溫度值。
4、另外還要求在設(shè)計(jì)中加入報(bào)警系統(tǒng),如果我們所設(shè)計(jì)的系統(tǒng)用來監(jiān)控某一設(shè)備,當(dāng)設(shè)備的溫度超過或低于我們所設(shè)定的溫度值時(shí),系統(tǒng)會(huì)產(chǎn)生報(bào)警。
5、要求在設(shè)計(jì)中加入上下限警報(bào)溫度設(shè)置電路。
三、設(shè)計(jì)的具體實(shí)現(xiàn)
1數(shù)字溫度計(jì)設(shè)計(jì)的方案
在做數(shù)字溫度計(jì)的單片機(jī)電路中,對信號(hào)的采集電路大多都是使用傳感器,這是非常容易實(shí)現(xiàn)的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。采集之后,通過使用51系列的單片機(jī),可以對數(shù)據(jù)進(jìn)行相應(yīng)的處理,再由LED顯示電路對其數(shù)據(jù)進(jìn)行顯示。
2系統(tǒng)設(shè)計(jì)框圖
溫度計(jì)電路設(shè)計(jì)總體設(shè)計(jì)方框圖如下圖所示,控制器采用單片機(jī)AT89C51,溫度傳感器采用DS18B20,用4位一體共陰LED數(shù)碼管以串口傳送數(shù)據(jù)實(shí)現(xiàn)溫度顯示。此外,還添加了報(bào)警系統(tǒng),對溫度實(shí)施監(jiān)控。
3主控器AT89C51芯片
對于單片機(jī)的選擇,可以考慮使用8031與8051系列,由于8031沒有內(nèi)部RAM,系統(tǒng)又需要大量內(nèi)存存儲(chǔ)數(shù)據(jù),因而不適用。AT89C51
以低價(jià)位單片機(jī)可為提供許多高性價(jià)比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域,對于簡單的測溫系統(tǒng)已經(jīng)足夠。單片機(jī)AT89C51具有低電壓供電和體積小等特點(diǎn),四個(gè)端口只需要兩個(gè)口就能滿足電路系統(tǒng)的設(shè)計(jì)需要該器件是INTEL公司生產(chǎn)的MCS一5l系列單片機(jī)中的基礎(chǔ)產(chǎn)品,采用了可靠的CMOS工藝制造技術(shù),具有高性能的8位單片機(jī),屬于標(biāo)準(zhǔn)的MCS—51的CMOS產(chǎn)品。
AT8951的管腳如下圖所示:
AT89C51芯片管腳圖
4時(shí)鐘電路
80C51時(shí)鐘有兩種方式產(chǎn)生,即內(nèi)部方式和外部方式。80C51中有一個(gè)構(gòu)成內(nèi)部震蕩器的高增益反向放大器,引腳XTAL1和XTAL2分別是該放大器的輸入端和輸出端。本次采用內(nèi)部震蕩電路,瓷片電容采用22PF,晶振為12MHZ。
晶體震蕩電路圖
復(fù)位電路
單片機(jī)系統(tǒng)的復(fù)位電路在這里采用的是上電+按鈕復(fù)位電路形式,其中電阻R采用10KΩ的阻值,電容采用10μF的電容值。
復(fù)位電路
溫度傳感電路
DALLAS
最新單線數(shù)字溫度傳感器DS18B20是一種新型的“一線器件”,其體積更小、更適用于多種場合、且適用電壓更寬、更經(jīng)濟(jì)。DALLAS
半導(dǎo)體公司的數(shù)字化溫度傳感器DS18B20是世界上第一片支持“一線總線”接口的溫度傳感器。溫度測量范圍為-55~+125
攝氏度,可編程為9位~12
位轉(zhuǎn)換精度,測溫分辨率可達(dá)0.0625攝氏度,分辨率設(shè)定參數(shù)以及用戶設(shè)定的報(bào)警溫度存儲(chǔ)在EEPROM
中,掉電后依然保存。被測溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出。
DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。DS18B20的管腳排列、各種封裝形式,DQ
為數(shù)據(jù)輸入/輸出引腳。開漏單總線接口引腳。當(dāng)被用著在寄生電源下,也可以向器件提供電源;GND為地信號(hào);VDD為可選擇的VDD引腳。當(dāng)工作于寄生電源時(shí),此引腳必須接地,如下圖所示。
DS18B20管腳圖
顯示電路
對于數(shù)字溫度的顯示,我們采用4位一體共陰LED數(shù)碼管。足夠顯示0~100中各位數(shù),并且還能顯示一位小數(shù)部分。
4位LED數(shù)碼顯示管
溫度報(bào)警電路
對于數(shù)字溫度計(jì)的設(shè)計(jì),除了溫度的數(shù)字顯示功能外還加入了報(bào)警系統(tǒng),當(dāng)測量的溫度超過或低于我們所設(shè)定的溫度值時(shí),系統(tǒng)會(huì)產(chǎn)生報(bào)警并亮紅燈報(bào)警。
其電路圖如下所示。
蜂鳴器紅燈報(bào)警系統(tǒng)電路圖
源程序:
/********************************************************************
*
程序名;
基于51單片機(jī)的溫度計(jì)
*
功
能:
實(shí)時(shí)測量溫度,超過上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。K1是用來
*
進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限
*
調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng)
*
退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除
*
按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能,*
K1是實(shí)現(xiàn)減1功能,K3是用來設(shè)定上下限溫度正負(fù)的。
*********************************************************************/
#include
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
uchar
max=0x00,min=0x00;
//max是上限報(bào)警溫度,min是下限報(bào)警溫度
bit
s=0;
//s是調(diào)整上下限溫度時(shí)溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右
bit
s1=0;
//s1標(biāo)志位用于上下限查看時(shí)的顯示
void
display1(uint
z);
#include“ds18b20.h“
#include“keyscan.h“
#include“display.h“
/******************************************************/
/*
主函數(shù)
/
/*****************************************************/
void
main()
{
beer=1;
//關(guān)閉蜂鳴器
led=1;
//關(guān)閉LED燈
timer1_init(0);
//初始化定時(shí)器1(未啟動(dòng)定時(shí)器1)
get_temperature(1);
//首次啟動(dòng)DS18B20獲取溫度(DS18B20上電后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器)
while(1)
{
keyscan();
get_temperature(0);
display(temp,temp_d*0.625);
alarm();
}
}
/**********************************************************************
*
程序名;
ds18b20數(shù)碼管動(dòng)態(tài)顯示頭文件
*
功
能:
通過定時(shí)器0延時(shí)是數(shù)碼管動(dòng)態(tài)顯示
**********************************************************************/
#ifndef
__ds18b20_display_H__
#define
__ds18b20_display_H__
#define
uint
unsigned
int
//變量類型宏定義,用uint表示無符號(hào)整形(16位)
#define
uchar
unsigned
char
//變量類型宏定義,用uchar表示無符號(hào)字符型(8位)
sbit
wei1=P2^4;
//可位尋址變量定義,用wei1表示P2.4口
sbit
wei2=P2^5;
//用wei2表示P2.5口
sbit
wei3=P2^6;
//用wei3表示P2.6口
sbit
wei4=P2^7;
//用wei4表示P2.7口
uchar
num=0;
//定義num為全局無符號(hào)字符型變量,賦初值為‘0’
uchar
code
temperature1[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//定義顯示碼表0~9
uchar
code
temperature2[]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//帶小數(shù)點(diǎn)的0~9.uchar
code
temperature3[]={
0x00,0x80,0x40,0x76,0x38};//依次是‘不顯示’‘.’‘-’‘H’‘L’
/******************************************************/
/
延時(shí)子函數(shù)
/
/*****************************************************/
void
display_delay(uint
t)
//延時(shí)1ms左右
{
uint
i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);
}
/******************************************************/
/*
定時(shí)器1初始化函數(shù)
/
/*****************************************************/
void
timer1_init(bit
t)
{
TMOD=0x10;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET1=1;
TR1=t;
//
局部變量t為1啟動(dòng)定時(shí)器1,為0關(guān)閉定時(shí)器1
}
/******************************************************/
/*
定時(shí)器1中斷函數(shù)
/
/*****************************************************/
void
timer1()
interrupt
{
TH0=0x3c;
//重新賦初值,定時(shí)50ms
TL0=0xb0;
num++;
//每進(jìn)入一次定時(shí)器中斷num加1(每50ms加1一次)
if(num<5)
{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}}
else
//進(jìn)入4次中斷,定時(shí)200ms時(shí)若報(bào)警標(biāo)志位w為‘1’則啟動(dòng)報(bào)警,不為‘1’不啟動(dòng)
//實(shí)現(xiàn)間歇性報(bào)警功能
{s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}}
if(num>20)
//進(jìn)入20次中斷,定時(shí)1s
{
num=0;
//num歸0,重新定開始定時(shí)1s
s1=0;
//定時(shí)1s時(shí)間到時(shí)自動(dòng)關(guān)閉報(bào)警上下限顯示功能
v1=1;
//定時(shí)1s時(shí)間到時(shí)自動(dòng)關(guān)閉報(bào)警上下限查看功能
}
}
/******************************************************/
/*
調(diào)整報(bào)警上下限選擇函數(shù)
/
/*****************************************************/
void
selsct_1(uchar
f,uchar
k)
//消除百位的0顯示,及正負(fù)溫度的顯示選擇
{
if(f==0)
//若為正溫度,百位為0則不顯示百位,不為0則顯示
{
if(k/100==0)
P0=temperature3[0];
else
P0=temperature1[k/100];
}
if(f==1)
//若為負(fù)溫度,若十位為0,百位不顯示,否則百位顯示‘-’
{
if(k%100/10==0)
P0=temperature3[0];
else
P0=temperature3[2];
}
}
void
selsct_2(bit
f,uchar
k)
//消除十位的0顯示,及正負(fù)溫度的顯示選擇
{
if(f==0)
//若為正溫度,百位十位均為0則不顯示十位,否則顯示十位
{
if((k/100==0)&&(k%100/10==0))
P0=temperature3[0];
else
P0=temperature1[k%100/10];
}
if(f==1)
//若為負(fù)溫度,若十位為0,十位不顯示,否則十位顯示‘-’
{
if(k%100/10==0)
P0=temperature3[2];
else
P0=temperature1[k%100/10];
}
}
/******************************************************/
/*
主函數(shù)顯示
/
/*****************************************************/
void
display(uchar
t,uchar
t_d)
//用于實(shí)測溫度、上限溫度的顯示
{
uchar
i;
for(i=0;i<4;i++)
//依次從左至右選通數(shù)碼管顯示,實(shí)現(xiàn)動(dòng)態(tài)顯示
{
switch(i)
{
case
0:
//選通第一個(gè)數(shù)碼管
wei2=1;
//關(guān)第二個(gè)數(shù)碼管
wei3=1;
//關(guān)第三個(gè)數(shù)碼管
wei4=1;
//關(guān)第四個(gè)數(shù)碼管
wei1=0;
//開第一個(gè)數(shù)碼管
if(a==0){selsct_1(f,t);}
//若a=0則在第一個(gè)數(shù)碼管上顯示測量溫度的百位或‘-’
if(a==1)
{
P0=temperature3[3];
//若a=1則在第一個(gè)數(shù)碼管上顯示‘H’
}
if(a==2)
{
P0=temperature3[4];
//若a=2則在第一個(gè)數(shù)碼管上顯示‘L’
}
break;
case
1:
//選通第二個(gè)數(shù)碼管
wei1=1;
wei3=1;
wei4=1;
wei2=0;
if(a==0){selsct_2(f,t);}
//若a=0則在第二個(gè)數(shù)碼管上顯示測量溫度的十位或‘-’
if(a==1)
//若a=1則在第二個(gè)數(shù)碼管上顯示上限報(bào)警溫度的百位或‘-’
{
if(s==0)
selsct_1(f_max,max);//若s=0則顯示第二個(gè)數(shù)碼管,否則不顯示
else
P0=temperature3[0];
//通過s標(biāo)志位的變化實(shí)現(xiàn)調(diào)節(jié)上下限報(bào)警溫度時(shí)數(shù)碼管的閃爍
if(s1==1)
selsct_1(f_max,max);//若s1=1則顯示第二個(gè)數(shù)碼管(s1標(biāo)志位用于上下限查看時(shí)的顯示)
}
if(a==2)
//若a=2則在第二個(gè)數(shù)碼管上顯示下限報(bào)警溫度的百位或‘-’
{
if(s==0)
selsct_1(f_min,min);
else
P0=temperature3[0];
if(s1==1)
selsct_1(f_min,min);
}
break;
case
2:
//選通第三個(gè)數(shù)碼管
wei1=1;
wei2=1;
wei4=1;
wei3=0;
if(a==0){P0=temperature2[t%10];}//若a=0則在第三個(gè)數(shù)碼管上顯示測量溫度的個(gè)位
if(a==1)
//若a=1則在第三個(gè)數(shù)碼管上顯示上限報(bào)警溫度的十位或‘-’
{
if(s==0)
selsct_2(f_max,max);//若s=0則顯示第三個(gè)數(shù)碼管,否則不顯示
else
P0=temperature3[0];
if(s1==1)
selsct_2(f_max,max);//若s1=1則顯示第三個(gè)數(shù)碼管
}
if(a==2)
//若a=2則在第三個(gè)數(shù)碼管上顯示下限報(bào)警溫度的十位或‘-’
{
if(s==0)
selsct_2(f_min,min);
else
P0=temperature3[0];
if(s1==1)
selsct_2(f_min,min);
}
break;
case
3:
//選通第四個(gè)數(shù)碼管
wei1=1;
wei2=1;
wei3=1;
wei4=0;
if(a==0){P0=temperature1[t_d];}//若a=0則在第四個(gè)數(shù)碼管上顯示測量溫度的小數(shù)位
if(a==1)
//若a=1則在第四個(gè)數(shù)碼管上顯示上限報(bào)警溫度的個(gè)位
{
if(s==0)
P0=temperature1[max%10];//若s=0則顯示第四個(gè)數(shù)碼管,否則不顯示
else
P0=temperature3[0];
if(s1==1)
P0=temperature1[max%10];//若s1=1則顯示第四個(gè)數(shù)碼管
}
if(a==2)
//若a=2則在第四個(gè)數(shù)碼管上顯示下限報(bào)警溫度的個(gè)位
{
if(s==0)
P0=temperature1[min%10];
else
P0=temperature3[0];
if(s1==1)
P0=temperature1[min%10];
}
break;
}
display_delay(10);
//每個(gè)數(shù)碼管顯示3ms左右
}
}
/******************************************************/
/*
開機(jī)顯示函數(shù)
/
/*****************************************************/
void
display1(uint
z)
//用于開機(jī)動(dòng)畫的顯示
{
uchar
i,j;
bit
f=0;
for(i=0;i //‘z’是顯示遍數(shù)的設(shè)定 { for(j=0;j<4;j++) //依次從左至右顯示‘-’ { switch(j) { case 0: wei2=1; wei3=1; wei4=1; wei1=0; break; P0=temperature3[2];//第一個(gè)數(shù)碼管顯示 case 1: wei1=1; wei3=1; wei4=1; wei2=0;break; P0=temperature3[2];//第二個(gè)數(shù)碼管顯示 case 2: wei1=1; wei2=1; wei4=1; wei3=0;break; P0=temperature3[2];//第三個(gè)數(shù)碼管顯示 case 3: wei1=1; wei2=1; wei3=1; wei4=0;break; P0=temperature3[2];//第四個(gè)數(shù)碼管顯示 } display_delay(400); //每個(gè)數(shù)碼管顯示200ms左右 } } } #endif /******************************************************************** * 程序名; DS18B20頭文件 * 說 明:用到的全局變量是:無符號(hào)字符型變量temp(測得的溫度整數(shù)部分),temp_d * (測得的溫度小數(shù)部分),標(biāo)志位f(測量溫度的標(biāo)志位‘0’表示“正溫度”‘1’表 * 示“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表 * 示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表 * 示“負(fù)溫度”),標(biāo)志位w(報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警)。 *********************************************************************/ #ifndef __ds18b20_h__ //定義頭文件 #define __ds18b20_h__ #define uint unsigned int #define uchar unsigned char sbit DQ= P2^3; //DS18B20接口 sbit beer=P1^0; //用beer表示P1.0 sbit led=P1^1; //用led表示P1.1 uchar temp=0; //測量溫度的整數(shù)部分 uchar temp_d=0; //測量溫度的小數(shù)部分 bit f=0; //測量溫度的標(biāo)志位,0’表示“正溫度” ‘1’表示“負(fù)溫度”) bit f_max=0; //上限溫度的標(biāo)志位‘0’表示“正溫度” ‘1’表示“負(fù)溫度”) bit f_min=0; //下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表示“負(fù)溫度”) bit w=0; //報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警 /******************************************************/ /* 延時(shí)子函數(shù) / /*****************************************************/ void ds18b20_delayus(uint t) //延時(shí)幾μs { while(t--); } void ds18b20_delayms(uint t) //延時(shí)1ms左右 { uint i,j; for(i=t;i>0;i--) for(j=120;j>0;j--); } /******************************************************/ /* DS18B20初始化函數(shù) / /*****************************************************/ void ds18b20_init() { uchar c=0; DQ=1; DQ=0; //控制器向DS18B20發(fā)低電平脈沖 ds18b20_delayus(80); //延時(shí)15-80μs DQ=1; //控制器拉高總線,while(DQ); //等待DS18B20拉低總線,在60-240μs之間 ds18b20_delayus(150); //延時(shí),等待上拉電阻拉高總線 DQ=1; //拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸; } /******************************************************/ /* DS18B20字節(jié)讀函數(shù) / /*****************************************************/ uchar ds18b20_read() { uchar i; uchar d=0; DQ = 1; //準(zhǔn)備讀; for(i=8;i>0;i--) { d >>= 1; //低位先發(fā); DQ = 0; _nop_(); _nop_(); DQ = 1; //必須寫1,否則讀出來的將是不預(yù)期的數(shù)據(jù); if(DQ) //在12us處讀取數(shù)據(jù); d |= 0x80; ds18b20_delayus(10); } return d; //返回讀取的值 } /******************************************************/ /* DS18B20字節(jié)寫函數(shù) / /*****************************************************/ void ds18b20_write(uchar d) { uchar i; for(i=8;i>0;i--) { DQ=0; DQ=d&0x01; ds18b20_delayus(5); DQ=1; d >>= 1; } } /******************************************************/ /* 獲取溫度函數(shù) / /*****************************************************/ void get_temperature(bit flag) { uchar a=0,b=0,c=0,d=0; uint i; ds18b20_init(); ds18b20_write(0xcc); //向DS18B20發(fā)跳過讀ROM命令 ds18b20_write(0x44); //寫啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM if(flag==1) { display1(1); //用開機(jī)動(dòng)畫耗時(shí) } else ds18b20_delayms(1); ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe); a=ds18b20_read(); //讀內(nèi)部RAM (LSB) b=ds18b20_read(); //讀內(nèi)部RAM (MSB) if(flag==1) //局部位變量f=1時(shí)讀上下線報(bào)警溫度 { max=ds18b20_read(); //讀內(nèi)部RAM (TH) min=ds18b20_read(); //讀內(nèi)部RAM (Tl) } if((max&0x80)==0x80) //若讀取的上限溫度的最高位(符號(hào)位)為‘1’表明是負(fù)溫度 {f_max=1;max=(max-0x80);} //將上限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將上限溫度裝換成無符號(hào)數(shù)。 if((min&0x80)==0x80)//若讀取的下限溫度的最高位(符號(hào)位)為‘1’表明是負(fù)溫度 {f_min=1;min=(min-0x80);} //將下限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將下限溫度裝換成無符號(hào)數(shù)。 i=b; i>>=4; if (i==0) { f=0; //i為0,正溫度,設(shè)立正溫度標(biāo)記 temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); temp_d=a; //小數(shù)部分 } else { f=1; //i為1,負(fù)溫度,設(shè)立負(fù)溫度標(biāo)記 a=~a+1; b=~b; temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); //小數(shù)部分 temp_d=a; } } /******************************************************/ /* 存儲(chǔ)極限溫度函數(shù) / /*****************************************************/ void store_t() { if(f_max==1) //若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù) max=max+0x80; if(f_min==1) //若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù) min=min+0x80; ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x4e); //向DS18B20發(fā)寫字節(jié)至?xí)捍嫫?和3(TH和TL)命令 ds18b20_write(max); //向暫存器TH(上限溫度暫存器)寫溫度 ds18b20_write(min); //向暫存器TL(下限溫度暫存器)寫溫度 ds18b20_write(0xff); //向配置寄存器寫命令,進(jìn)行溫度值分辨率設(shè)置 ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x48); //向DS18B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫入EEPROM } //DS18B20上電后會(huì)自動(dòng)將EEPROM中的上下限溫度拷貝到TH、TL暫存器 /******************************************************/ /* 溫度超限報(bào)警函數(shù) / /*****************************************************/ void alarm() { //若上限值是正值 if(f_max==0) { if(f_min==0) //若下限值是正值 { if(f==0) //若測量值是正值 { if(temp<=min||temp>=max) {w=1;TR1=1;} //當(dāng)測量值小于最小值或大于最大值時(shí)報(bào)警 if((temp {w=0;} //當(dāng)測量值大于最小值且小于最大值時(shí)不報(bào)警 } if(f==1){w=1;TR1=1;} //若測量值是負(fù)值時(shí)報(bào)警 } if(f_min==1) //若下限值是負(fù)值 { if(f==0) //若測量值是正值 { if(temp>=max)//當(dāng)測量值大于最大值時(shí)報(bào)警 {w=1;TR1=1;} if(temp {w=0;} } if(f==1) //若測量值是負(fù)值 { if(temp>=min)//當(dāng)測量值大于最小值時(shí)報(bào)警 {w=1;TR1=1;} if(temp {w=0;} } } } if(f_max==1) //若下限值是負(fù)值 { if(f_min==1) //若下限值是負(fù)值 { if(f==1) //若測量值是負(fù)值 { if((temp<=max)||(temp>=min)) {w=1;TR1=1;} //當(dāng)測量值小于最大值或大于最小值時(shí)報(bào)警 if((temp {w=0;} //當(dāng)測量值小于最小值且大于最大值時(shí)不報(bào)警 } if(f==0){w=1;TR1=1;} //若測量值是正值時(shí)報(bào)警 } } } #endif /******************************************************************** * 程序名; 基于51單片機(jī)的溫度計(jì) * 功 能: 實(shí)時(shí)測量溫度,超過上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。K1是用來 * 進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限 * 調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng) * 退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除 * 按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能,* K1是實(shí)現(xiàn)減1功能,K3是用來設(shè)定上下限溫度正負(fù)的。 *********************************************************************/ #include #include //將intrins.h頭文件包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時(shí)) #define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00; //max是上限報(bào)警溫度,min是下限報(bào)警溫度 bit s=0; //s是調(diào)整上下限溫度時(shí)溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右 bit s1=0; //s1標(biāo)志位用于上下限查看時(shí)的顯示 void display1(uint z); //聲明display1()函數(shù)(display.h頭文件中的函數(shù),ds18b20.h要用應(yīng)先聲明) #include“ds18b20.h“ #include“keyscan.h“ #include“display.h“ /******************************************************/ /* 主函數(shù) / /*****************************************************/ void main() { beer=1; //關(guān)閉蜂鳴器 led=1; //關(guān)閉LED燈 timer1_init(0); //初始化定時(shí)器1(未啟動(dòng)定時(shí)器1) get_temperature(1); //首次啟動(dòng)DS18B20獲取溫度(DS18B20上電后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器) while(1) { keyscan(); get_temperature(0); display(temp,temp_d*0.625); alarm(); } } /********************************************************************** * 程序名; ds18b20keyscan函數(shù) * 功 能: 通過鍵盤設(shè)定設(shè)定上下限報(bào)警溫度 **********************************************************************/ #ifndef __keyscan_H__ //定義頭文件 #define __keyscan_H__ sbit key1=P2^2; sbit key2=P2^1; sbit key3=P2^0; sbit key4=P3^3; uchar i=0; //定義全局變量i用于不同功能模式的選擇,‘0’正常模式,‘1’上限調(diào)節(jié)模式,‘2’下限調(diào)節(jié)模式 uchar a=0; //定義全局變量a用于不同模式下數(shù)碼管顯示的選擇 bit k4=0; //K4按鍵雙功能選擇位,k4=0時(shí)K4按鍵選擇消按鍵音的功能,k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能 bit v=0; //K2、K3按鍵雙功能選擇位,v=0時(shí)選擇上下限查看功能,v=1時(shí)選擇上下限溫度加減功能 bit v1=0; //v1=1時(shí)定時(shí)1250ms時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能 bit v2=0; /消按鍵音功能調(diào)整位,為‘0’時(shí)開按鍵音,為‘1’時(shí)關(guān)按鍵音 /******************************************************/ /* 讀鍵盤延時(shí)子函數(shù) / /*****************************************************/ void keyscan_delay(uint z) //延時(shí)1ms左右 { uint i,j; for(i=z;i>0;i--) for(j=120;j>0;j--); } /******************************************************/ /* 溫度調(diào)節(jié)函數(shù) / /*****************************************************/ int temp_change(int count,bit f) //上下限溫度調(diào)整 { if(key2==0) //判斷K2是否按下 { if(v2==0)beer=0; //v2=0開按鍵音,否則消按鍵音 keyscan_delay(10); //延時(shí)10ms if(key2==0) //再次判斷K2是否按下(實(shí)現(xiàn)按按鍵時(shí)消抖) { beer=1; //K2按下關(guān)按鍵音 if(f==0) //若溫度為正 { count++; //每按一下K2溫度上調(diào)1 if(a==1){if(count>125) count=125;}//當(dāng)溫度值大于125時(shí)不上調(diào) if(a==2){if(count>125) count=125;} } if(f!=0) //若溫度為負(fù) { count++; //每按一下K2溫度下調(diào)1 if(a==1){if(count>55) count=55;}//當(dāng)溫度值小于-55時(shí)不再下調(diào) if(a==2){if(count>55) count=55;} } } while(key2==0); //K2松開按鍵時(shí)消抖 keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) //K3按按鍵時(shí)消抖 { beer=1; count--; //每按一下K3溫度為正時(shí)下調(diào)1,為負(fù)時(shí)上調(diào)1 if(a==1){if(count<0) count=0;}//當(dāng)溫度值達(dá)到0時(shí)不再調(diào) if(a==2){if(count<0) count=0;} } while(key3==0); keyscan_delay(10); //K3松開按鍵時(shí)消抖 } return count; } /******************************************************/ /* 讀鍵盤函數(shù) / /*****************************************************/ void keyscan() { if(key1==0) { if(v2==0)beer=0; keyscan_delay(10); if(key1==0) //K1按按鍵時(shí)消抖 { beer=1; TR1=1; //開定時(shí)器1,通過s標(biāo)志位的變化,實(shí)現(xiàn)在上下限溫度調(diào)整時(shí)溫度顯示時(shí)閃爍的功能 k4=1; //在上下溫度調(diào)節(jié)功能模式下選擇K4的調(diào)整上下限溫度正負(fù)的功能 v=1; //在上下溫度調(diào)節(jié)功能模式下選擇K2、K3的溫度加減功能 i++; //K1按一下i加1,i=‘0’進(jìn)入正常模式,i=‘1’進(jìn)入調(diào)上限模式,i=‘2’進(jìn)入調(diào)下限模式 if(i>2) //K1按下三次后退出調(diào)節(jié)模式 { i=0; //進(jìn)入正常模式 TR1=0; //關(guān)定時(shí)器1 k4=0; //在正常模式下選擇K4的消按鍵音功能 v=0; //在正常模式下選擇K2、K3的查看上下限報(bào)警溫度功能 store_t(); //存儲(chǔ)調(diào)整后的上下限報(bào)警溫度 } switch(i) //顯示選擇 { case 0:a=0;break; //a=0選擇顯示測得的溫度 case 1:a=1;break; //a=1選擇顯示上限溫度 case 2:a=2;break; //a=2選擇顯示下限溫度 default:break; } } while(key1==0); //K1松按鍵時(shí)消抖 keyscan_delay(10); } if(a==1&&v==1) //a=1選擇顯示上限溫度且v=1時(shí)選擇上下限溫度加功能 {led=0;max=temp_change(max,f_max);}//顯示上限溫度 else if(a==2&&v==1) //a=2選擇顯示下限溫度且v=1時(shí)選擇上下限溫度減功能 {led=1;min=temp_change(min,f_min);} else; if(k4==1) //k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(5); if(key4==0) { beer=1; if(a==1) {if(max>55) f_max=0;else f_max=~f_max;}//當(dāng)溫度大于55度時(shí),只能設(shè)定為正溫度 if(a==2) {if(min>55) f_max=0;else f_min=~f_min;}//當(dāng)溫度大于55度時(shí),只能設(shè)定為正溫度 } while(key4==0); keyscan_delay(10); } } if(v==0) //v=0時(shí)選擇上下限查看功能 { if(key2==0) { if(v2==0)beer=0; keyscan_delay(10); if(key2==0) { beer=1; a=1; //選擇上限顯示 TR1=1; //開定時(shí)器1開始定時(shí)一分鐘左右 s1=1; //上限顯示不閃爍,顯示一分鐘左右自動(dòng)退出 } while(key2==0); keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) { beer=1; a=2; //選擇下限顯示 TR1=1; //開定時(shí)器1開始定時(shí)1s s1=1; //下限顯示不閃爍,顯示1s自動(dòng)退出 } while(key3==0); keyscan_delay(10); } if(v1==1) //v1=1時(shí)定時(shí)1s時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能 {a=0;v1=0;TR1=0;} //a=0顯示實(shí)測溫度,v1清零,關(guān)定時(shí)器1 if(k4==0) //k4=0時(shí)K4按鍵選擇消按鍵音的功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(10); if(key4==0) { beer=1; v2=~v2; //為‘0’時(shí)開按鍵音,為‘1’時(shí)關(guān)按鍵音 } while(key4==0); keyscan_delay(10); } } } } #endif 四、總結(jié) 單片機(jī)的學(xué)習(xí)與應(yīng)用相關(guān)的總結(jié)與體會(huì)。在課設(shè)過程中,我們不僅鞏固了平時(shí)所學(xué)習(xí)的單片機(jī)知識(shí),而且通過不斷查閱相關(guān)資料,學(xué)習(xí)新的知識(shí),可以說,通過這次單片機(jī)的實(shí)踐學(xué)習(xí),我們學(xué)到了很多,而且對單片機(jī)的有關(guān)知識(shí)以及其在現(xiàn)實(shí)生活中的多方面應(yīng)用有了更深層次的認(rèn)識(shí),這對于我們以后的學(xué)習(xí)和步入社會(huì)后參加工作都有很大的幫助。 在此次課程設(shè)計(jì)的進(jìn)程中,我們遇到了很多問題,例如,一開始我們在確定課設(shè)題目后,在編寫程序時(shí),由于思路不太清晰,而且設(shè)計(jì)要求中需要使用新器件DS18B20智能測溫,而其相關(guān)知識(shí)我們很模糊甚至可以說一無所知,不過后來,我們通過查找一些相關(guān)的資料書以及尋求輔導(dǎo)老師的幫助,又經(jīng)過我們的主動(dòng)思考,理清思路,終于將程序修改正確。在仿真時(shí),由于我們有了之前的數(shù)模電課設(shè)仿真經(jīng)驗(yàn),所以此時(shí)我們課設(shè)進(jìn)行的很順利,并沒有受到什么大的阻礙。 通過此次單片機(jī)課程設(shè)計(jì),我們明白了很多,理論指導(dǎo)實(shí)踐,但是理論也需要實(shí)踐給予證明,不能盲目的相信書本,凡事都要通過自己的思考推敲,否則自己不會(huì)取的大的進(jìn)步。而且在平時(shí)的學(xué)習(xí)生活中應(yīng)該多和周圍的同學(xué)相互學(xué)習(xí),交流經(jīng)驗(yàn),遇到不會(huì)的東西時(shí),切忌焦躁,首先要經(jīng)過自己的獨(dú)立思考,有了一定想法后,可以去查找相關(guān)的資料書刊或者找同學(xué)討論,如果實(shí)在解釋不了,再去找輔導(dǎo)老師,在這個(gè)遇到問題解決問題的過程中,不斷加強(qiáng)自我的動(dòng)腦能力,進(jìn)而去指導(dǎo)動(dòng)手能力,也只有這樣,在思路清晰,條理順暢的時(shí)候,再去進(jìn)行軟件編寫和硬件操作工作,才有可能起到事半功倍的效果。 五、附錄 系統(tǒng)硬件原理電路圖 數(shù)字溫度計(jì)設(shè)計(jì)器材表 單片機(jī)STC89C52 DS18B20 晶振12M 三極管8850 電容30PF 電解電容10UF/25V 小蜂鳴器 LED ?5紅 電阻10k,3k,2k,1k,510,330 各5 4位一體共陰數(shù)碼管 AC/DC(5V/1A)電源 IC插座40 9X15cm萬用板 六、參考文獻(xiàn) 1、李群芳編.《單片微型計(jì)算機(jī)及接口技術(shù)》[M].電子工業(yè)出版社.2、樓然苗編.《51系列單片機(jī)設(shè)計(jì)實(shí)例》[M].北京航空航天大學(xué)出版社.3、黃勤編.《計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)教程》[M].重慶大學(xué)出版社. 706.波形發(fā)生器、頻率計(jì)和數(shù)字電壓表設(shè)計(jì) 707.水位遙測自控系統(tǒng) 畢業(yè)論文 708.寬帶視頻放大電路的設(shè)計(jì) 畢業(yè)設(shè)計(jì) 709.簡易數(shù)字存儲(chǔ)示波器設(shè)計(jì)畢業(yè)論文 710.球賽計(jì)時(shí)計(jì)分器 畢業(yè)設(shè)計(jì)論文 711.IIR數(shù)字濾波器的設(shè)計(jì)畢業(yè)論文 712.PC機(jī)與單片機(jī)串行通信畢業(yè)論文 713.基于CPLD的低頻信號(hào)發(fā)生器設(shè)計(jì)畢業(yè)論 714.基于51單片機(jī)的多路溫度采集控制系統(tǒng) 715.倉庫溫濕度的監(jiān)測系統(tǒng) 716.基于單片機(jī)的電子密碼鎖 717.單片機(jī)控制交通燈系統(tǒng)設(shè)計(jì) 718.智能搶答器設(shè)計(jì) 719.基于DSP的IIR數(shù)字低通濾波器的設(shè)計(jì)與實(shí)現(xiàn) 720.基于LabVIEW的PC機(jī)與單片機(jī)串口通信 721.DSP設(shè)計(jì)的IIR數(shù)字高通濾波器的設(shè)計(jì) 722.單片機(jī)數(shù)字鐘設(shè)計(jì) 723.數(shù)字自動(dòng)打鈴系統(tǒng) 724.激光切割軌道系統(tǒng)的上位機(jī)設(shè)計(jì) 725.由AT89C51控制的太陽能熱水器 726.單片機(jī)歩進(jìn)電機(jī)轉(zhuǎn)速控制器的設(shè)計(jì) 727.頻率特性測試儀的設(shè)計(jì) 728.用集成溫度傳感器組成測溫控制系統(tǒng) 729.微尺度觀測儀的物理原理及應(yīng)用 730.低頻數(shù)字式相位差測量儀的設(shè)計(jì) 731.智能開關(guān)穩(wěn)壓電源的設(shè)計(jì) 732.智能家居系統(tǒng)CAN總線通信模塊設(shè)計(jì) 733.智能家居系統(tǒng)GPRS通信模塊設(shè)計(jì) 734.智能家居GUI模塊設(shè)計(jì) 735.小型風(fēng)光互補(bǔ)路燈控制器設(shè)計(jì) 736.基于MCS-51單片機(jī)的高精度數(shù)字測相裝置的設(shè)計(jì) 737.基于單片機(jī)的火災(zāi)自動(dòng)報(bào)警系統(tǒng) 738.數(shù)字顯示多路電壓設(shè)計(jì) 739.智能防盜報(bào)警系統(tǒng)設(shè)計(jì) 740.數(shù)字調(diào)頻立體收音機(jī) 741.基于單片機(jī)的水溫控制系統(tǒng) 742.電子廣告牌的設(shè)計(jì) 743.電力變壓器保護(hù) 744.變電站綜合自動(dòng)化系統(tǒng)研究 745.智能象棋比賽定時(shí)器的設(shè)計(jì) 746.基于單片機(jī)的電動(dòng)車蹺蹺板 747.藝術(shù)彩燈設(shè)計(jì) 748.基于單片機(jī)的密碼鎖設(shè)計(jì) 749.雙輸出可調(diào)穩(wěn)壓電源的設(shè)計(jì) 750.用IC卡實(shí)現(xiàn)門禁管理系統(tǒng) 751.智能消毒柜控制系統(tǒng) 752.自動(dòng)太陽光追蹤器 753.基于89C51的點(diǎn)陣屏顯示設(shè)計(jì) 754.利用AT89C5單片機(jī)實(shí)現(xiàn)節(jié)日彩燈控制 755.自動(dòng)溫度控制系統(tǒng) 756.室內(nèi)溫度控制報(bào)警器 757.8751H單片機(jī)控制步進(jìn)電機(jī) 758.高精密多路計(jì)時(shí)器 759.小型觸摸式防盜報(bào)警器 760.頻率特性測試儀設(shè)計(jì) 761.出租車計(jì)價(jià)器 762.數(shù)控直流穩(wěn)壓電源設(shè)計(jì) 763.數(shù)字電度表--具有遠(yuǎn)程抄表功能 764.基于多單片機(jī)的數(shù)據(jù)測控硬件系統(tǒng)的設(shè)計(jì) 765.基于MATLAB的他勵(lì)直流電機(jī)虛擬教學(xué)實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)與開發(fā) 766.基于87C196MC交流調(diào)速系統(tǒng)主電路硬件的設(shè)計(jì)與開發(fā) 767.基于80C196MC交流調(diào)速系統(tǒng)控制電路的硬件設(shè)計(jì)與開發(fā) 768.多環(huán)教學(xué)實(shí)驗(yàn)系統(tǒng)模擬電子電路控制模板的設(shè)計(jì)與開發(fā) 769.雙閉環(huán)控制系統(tǒng)模擬控制模板設(shè)計(jì) 770.雙閉環(huán)V-M直流調(diào)速虛擬實(shí)驗(yàn)系統(tǒng)的開發(fā) 771.雙閉環(huán)PWM直流調(diào)速虛擬實(shí)驗(yàn)系統(tǒng)的開發(fā) 772.基于8098單片機(jī)實(shí)現(xiàn)的SPWM變頻調(diào)速系統(tǒng) 773.調(diào)幅收音機(jī)的原理與調(diào)試 774.電力線載波系統(tǒng) 775.基于單片機(jī)的溫室電爐的控制系統(tǒng) 776.基于MCS-51單片機(jī)的變色燈控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 777.基于單片機(jī)的頻率計(jì)的設(shè)計(jì) 778.烤箱溫度控制系統(tǒng) 779.電容測量儀 780.基于AT89S51單片機(jī)的波形發(fā)生器設(shè)計(jì) 781.簡易低頻信號(hào)發(fā)生器 782.基于單片機(jī)的紅外遙控開關(guān) 783.發(fā)動(dòng)機(jī)電噴內(nèi)核模型的研究及實(shí)踐 784.基于AT89S52的函數(shù)信號(hào)發(fā)生器 785.智能住宅的功能設(shè)計(jì)與實(shí)現(xiàn)原理研究 786.基于PIC16F876A單片機(jī)的超聲波測距儀 787.基于單片機(jī)的呼叫系統(tǒng)的設(shè)計(jì) 788.電容測量電路的設(shè)計(jì) 789.電壓頻率變換器 790.基于單片機(jī)的IC卡門禁系統(tǒng)設(shè)計(jì) 791.壓阻式傳感器在壓力方面的技術(shù)應(yīng)用 792.全集成電路高保真擴(kuò)音機(jī) 793.單片機(jī)控制的三相全控橋觸發(fā)系統(tǒng)設(shè)計(jì) 794.IC卡智能燃?xì)獗淼难兄?/p> 795.傳感器信號(hào)模擬電路設(shè)計(jì)研究 796.基于C8051F040單片機(jī)的智能電導(dǎo)率分析儀 797.基于MODBUS協(xié)議的遠(yuǎn)程端口控制系統(tǒng) 798.兩路電力線加載信號(hào)檢測識(shí)別系統(tǒng) 799.單片機(jī)的語音存儲(chǔ)與重放的研究 800.基于單片機(jī)的電器遙控器的設(shè)計(jì) 《單片機(jī)》課程設(shè)計(jì) 題 目: 基于單片機(jī)的數(shù)字多用表設(shè)計(jì) 專 業(yè): 電力系統(tǒng)及其自動(dòng)化 班 級(jí): 本自動(dòng)化 姓 名: 學(xué)號(hào): 指導(dǎo)老師: 小組成員: 成績: 摘要 本次設(shè)計(jì)采用單片機(jī)芯片 AT89S51與ADC0809設(shè)計(jì)一個(gè)數(shù)字電壓表,能夠測量0-5V之間的直流電壓值,四位數(shù)碼顯示,但要求使用的元器件數(shù)目最少。為使系統(tǒng)更加穩(wěn)定,使系統(tǒng)的整體精度得以保障,本電路使用了ADC0809數(shù)據(jù)轉(zhuǎn)換芯片,單片機(jī)系統(tǒng)設(shè)計(jì)采用AT89S51作1 為主控芯片,配以RC上電復(fù)位電路和震蕩電路,程序每執(zhí)行周期耗時(shí)縮到最短,這樣保證了系統(tǒng)的實(shí)時(shí)性。 關(guān)鍵詞 數(shù)字萬用表 AT89S51單片機(jī) AD轉(zhuǎn)換與控制 目錄 摘要?????????????????????????2 關(guān)鍵詞????????????????????????2 緒論 1.數(shù)字萬用表設(shè)計(jì)背景?????????????????4 1.1 數(shù)字萬用表的設(shè)計(jì)目的和意????????????? 41.2 數(shù)字萬用表的設(shè)計(jì)依據(jù)…………………………………….4 1.3 數(shù)字萬用表設(shè)計(jì)重點(diǎn)解決的問題????????????4 2.數(shù)字萬用表總體設(shè)計(jì)方案……………………………………5 2.1數(shù)字萬用表的基本原理……………………..…….…….5 2 2.2芯片選擇及功能簡介………………………………………..2.3電路原理圖及仿真圖……………………………………..……….2.4系統(tǒng)板上硬件連線………………………………..………..…… 2.5程序設(shè)計(jì)內(nèi)容………………………………..………..…… 2.6C語言源程序………………………………..………..…… 總結(jié)……………………………………….….………… 4心得體會(huì) 參考文獻(xiàn)……………………………..…….………..13 緒論 數(shù)字萬用表亦稱數(shù)字多用表,簡稱 DMM(Digtial Multimeter)。它是采用數(shù)字化測量技術(shù),把連續(xù)的模擬量轉(zhuǎn)換成不連續(xù)的,離散的數(shù)字形式并加以顯示的儀表。傳統(tǒng)的指針式萬用表功能單精度低,不能滿足數(shù)字化時(shí)代的需求,采用單片機(jī)的數(shù)字萬用表,已被廣泛用于電子及工業(yè)測量、工業(yè)自動(dòng)化儀表、自動(dòng)測試系統(tǒng)等智能測量領(lǐng)域,顯示出強(qiáng)大的生命力。數(shù)字萬用表具有以下幾點(diǎn)優(yōu)勢:(1)顯示清晰直觀,計(jì)數(shù)準(zhǔn)確 為了提高觀察的清晰度,新型的手勢式數(shù)字萬用表已普遍采用字高為26mm的大屏幕LCD(液晶顯示器)。有些數(shù)字萬用表還增加了背光源,以便于夜間觀察讀數(shù)。(2)顯示位數(shù) 數(shù)字萬用表的顯示位數(shù)通常為3位到8位半。 (3)準(zhǔn)確度高 準(zhǔn)確度是測量結(jié)果中系統(tǒng)誤差與隨機(jī)誤差的綜合。它表示測量結(jié)果與真值的一致程度,也反映了測量誤差的大小,準(zhǔn)確度愈高,測量誤差愈小。數(shù)字萬用表的準(zhǔn)確度遠(yuǎn)優(yōu)于指針萬用表。 (4) 分辨力高 數(shù)字萬用表在最低電壓量程上末位1個(gè)字所代表的電壓值,稱作儀表的分辨率,宏觀世界反映了儀表靈敏度的高低,分辨率隨顯示位數(shù)的增加而提高。(5) 測試功能強(qiáng) 數(shù)字萬用表不止可以測量直流電壓,直流電流,電阻二3 極管正向壓降等等。(6)測量范圍寬 數(shù)字萬用表可滿足常規(guī)電子測量的需要,智能數(shù)字萬用表的測量范圍更寬廣。 (7)測量速率快 數(shù)字萬用表在每秒中內(nèi)對被電壓的測量次數(shù)稱為測量速率,單位是次/秒。它主要取決于A/D轉(zhuǎn)換器的轉(zhuǎn)換速率。一般數(shù)字萬用表的測量速率為2到5次/秒。有的呢過達(dá)到20次/秒以上,另外有的比這個(gè)還要高得多。數(shù)字萬用表可滿足不同用戶對測量速率的需要。 (8) 輸入阻抗高 數(shù)字萬用表電壓檔具有很高的輸入阻抗,通常為10至10000M歐姆,從被測電路上吸取的電流小,不會(huì)影響被測信號(hào)源的工作狀態(tài),能減小由信號(hào)源內(nèi)阻引起的測量誤差。(9)保護(hù)功能完善,抗干擾能力強(qiáng) 數(shù)字萬用表具有比價(jià)完善的保護(hù)電路,過載能力強(qiáng),新型的數(shù)字萬用表還增加了高壓保護(hù)器件,能防止浪涌電壓。 本設(shè)計(jì)就是居于這個(gè)設(shè)計(jì)理念一個(gè)基于單片機(jī)的數(shù)字萬用表。該設(shè)備具有直觀簡單的優(yōu)點(diǎn)。并且能深入的說明 萬用表的測量原理。能直觀的了解萬用表各個(gè)部分的結(jié)構(gòu)和測試原則。 1數(shù)字萬用表的設(shè)計(jì)背景 在本章中主要介紹了系統(tǒng)的設(shè)計(jì)原則和總體方案及其系統(tǒng)概述等。 1.1數(shù)字萬用表的設(shè)計(jì)目的和意義 數(shù)字萬用表是當(dāng)前電子、電工、儀器、儀表和測量領(lǐng)域大量使用的一種基本測量,已被廣泛應(yīng)用于電子及電工測量、工業(yè)自動(dòng)化儀表、自動(dòng)測試系統(tǒng)等智能化測量領(lǐng)域,示出強(qiáng)大的生命力。隨著時(shí)代科技的進(jìn)步,數(shù)字萬用表的功能越來越強(qiáng)大,把電量及非電量的測量技術(shù)提高到嶄新水平。 1.2 數(shù)字萬用表的設(shè)計(jì)依據(jù) 根據(jù)數(shù)字萬用表的原理,結(jié)合以下的設(shè)計(jì)要求:“設(shè)計(jì)一個(gè)數(shù)字萬用表,能夠測量直流電壓值,直流電流、直流電阻。實(shí)現(xiàn)多級(jí)量程的直流電壓測量,其量程范圍是200mv、2v ,20v,200v和500v.實(shí)現(xiàn)多級(jí)量程的直流電流測量,其量程范圍是2mA,20mA,200mA、2A和20A.實(shí)現(xiàn)多級(jí)量程的電阻測量,其量程范圍是200、2k ,20k,200k和2M。由此設(shè)想出以下的解決方法,即數(shù)字萬用表的系統(tǒng)由分流電阻、分壓電阻、基準(zhǔn)電阻、電容測試芯片電路、51單片機(jī)最小系統(tǒng)、顯示部分、報(bào)警部分、AD轉(zhuǎn)換和控制部分組成。為使系統(tǒng)更加穩(wěn)定,使系統(tǒng)整體精度得以保障。 1.3數(shù)字萬用表設(shè)計(jì)重點(diǎn)解決的問題 本設(shè)計(jì)重點(diǎn)要解決的問題是對不同量程的各種測量內(nèi)容的轉(zhuǎn)換,還有就是各部分電路組合成一個(gè)完整的數(shù)字萬用表,而難點(diǎn)解決的問題就是程序的設(shè)計(jì),要保正其可行性從而保證設(shè)計(jì)的正確性。數(shù)字萬用表總體設(shè)計(jì)方案 2.1數(shù)字萬用表的基本原理 數(shù)字萬用表的最基本功能是能夠測量直流電壓,直流電流,還有能夠測電量阻。 下面我們分別介紹各個(gè)部分的組成:(1)、模數(shù)(A/D)轉(zhuǎn)換與數(shù)字顯示電路 常見的物理量都是幅值(大小)連續(xù)變化的所謂模擬量(模擬信號(hào))。指針式儀表可以直接對模擬電壓、電流進(jìn)行顯示。而對數(shù)字式儀表,需要把模擬電信號(hào)(通常是電壓信號(hào))轉(zhuǎn)換成數(shù)字信號(hào),再進(jìn)行顯示和處理(如存儲(chǔ)、傳輸、打印、運(yùn)算等)。數(shù)字信號(hào)與模擬信號(hào)不同,其幅值(大小)是不連續(xù)的。這種情況被稱為是”量化的"。若最小量化單位(量化臺(tái)階)為,則數(shù)字信號(hào)的大小一定是的整數(shù)倍,該整數(shù)可以用二進(jìn)制數(shù)碼表示。但為了能直觀地讀出信號(hào)大小的數(shù)值,需經(jīng)過數(shù)碼變換(譯碼)后由數(shù)碼管或液晶屏顯示出來。(2)、多量程數(shù)字電壓表原理 在基準(zhǔn)數(shù)字電壓表頭前面加一級(jí)分壓電路(分壓器),可以擴(kuò)展直流電壓測量的量程。 (3)多量程數(shù)字電流表原理 測量電流的原理是:根據(jù)歐姆定律,用合適的取樣電阻把待測電流轉(zhuǎn)換為相應(yīng)的電壓,再進(jìn)行測量。 (4)電阻測量原理 數(shù)字萬用表中的電阻檔采用的是比例測量法。 由穩(wěn)壓管ZD提供測量基準(zhǔn)電壓,流過標(biāo)準(zhǔn)電阻和被測電阻的電流基本相等 2.2芯片選擇及功能簡介 這次的課程設(shè)計(jì)中,我們這一種選擇了芯片AT89S51和ADC0809。 AT89S51是一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,功能強(qiáng)大的微型計(jì)算機(jī)的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案。 AT89S51有PDIP、PLCC、TQFP三種封裝方式,其中最常見的就是采用40Pin封裝的雙列直接PDIP封裝,芯片共有40個(gè)引腳,引腳的排列順序?yàn)閺目啃酒娜笨谧筮吥橇幸_逆時(shí)針數(shù)起,依次為1、2、3、4、?、40,其中芯片的1腳5 頂上有個(gè)凹點(diǎn)。在單片機(jī)的40個(gè)引腳中,電源引腳2根,外接晶體振蕩器引腳2根,控制引腳4根以及4組8位可編程I/O引腳32根。 1、主電源引腳(2根)VCC(Pin40):電源輸入,接+5V電源GND(Pin20):接地線 2、外接晶振引腳(2根)XTAL1(Pin19):片內(nèi)振蕩電路輸入端XTAL2(Pin20):片內(nèi)振蕩電路輸出端 3、控制引腳(4根)RST/VPP(Pin9):復(fù)位引腳,出現(xiàn)2個(gè)機(jī)器周期的高電平將使單片機(jī)復(fù)位。ALE/PROG(Pin30):地址鎖存允許信號(hào)PSEN(Pin29):外部存儲(chǔ)器讀選通信號(hào)EA/VPP(Pin31):程序存儲(chǔ)器的內(nèi)外部選通,接低電平從外部程序存儲(chǔ)器讀指令,如果接高電平則從內(nèi)部程序存儲(chǔ)器讀指令。 4、可編程輸入/輸出引腳(32根)AT89S51單片機(jī)有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個(gè)口有8位(8根引腳),共32根。PO口(Pin39~Pin32):8位雙向I/O口線,名稱為P0.0~P0.7P1口(Pin1~Pin8):8位準(zhǔn)雙向I/O口線,名稱為P1.0~P1.7P2口(Pin21~Pin28):8位準(zhǔn)雙向I/O口線,名稱為P2.0~P2.7P3口(Pin10~Pin17):8位準(zhǔn)雙向I/O口線,名稱為P3.0~P3.7。AT89S51的主要性能參數(shù):與MCS-51產(chǎn)品指令系統(tǒng)完全兼容 4k字節(jié)在系統(tǒng)編程(ISP)Flash閃速存儲(chǔ)器 1000次擦寫周期 4.0-5.5V的工作電壓范圍 全靜態(tài)工作模式:0Hz-33MHz 三級(jí)程序加密鎖 128×8字節(jié)內(nèi)部RAM 32個(gè)可編程I/O口線 2個(gè)16位定時(shí)/計(jì)數(shù)器 6個(gè)中斷源 全雙工串行UART通道 低功耗空閑和掉電模式 中斷可從空閑模喚醒系統(tǒng) 看門狗(WDT)及雙數(shù)據(jù)指針 掉電標(biāo)識(shí)和快速編程特性 靈活的在系統(tǒng)編程(ISP字節(jié)或頁寫模式)ADC0809是美國國家半導(dǎo)體公司生產(chǎn)的CMOS工藝8通道,8位逐次逼近式A/D模數(shù)轉(zhuǎn)換器。其內(nèi)部有一個(gè)8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號(hào),只選通8路模擬輸入信號(hào)中的一個(gè)進(jìn)行A/D轉(zhuǎn)換。是目前國內(nèi)應(yīng)用最廣泛的8位通用A/D芯片 1.主要特性 1)8路輸入通道,8位A/D轉(zhuǎn)換器,即分辨率為8位。 2)具有轉(zhuǎn)換起停控制端。 3)轉(zhuǎn)換時(shí)間為100μs(時(shí)鐘為640kHz時(shí)),130μs(時(shí)鐘為500kHz時(shí)) 4)單個(gè)+5V電源供電 5)模擬輸入電壓范圍0~+5V,不需零點(diǎn)和滿刻度校準(zhǔn)。 6)工作溫度范圍為-40~+85攝氏度 7)低功耗,約15mW。2.內(nèi)部結(jié)構(gòu) ADC0809是CMOS單片型逐次逼近式A/D轉(zhuǎn)換器,內(nèi)部結(jié)構(gòu)如圖所示,它由8路模擬開關(guān)、地址鎖存與譯碼器、比較器、8位開關(guān)樹型A/D轉(zhuǎn)換器、逐次逼近寄存器、邏輯控制和定時(shí)電路組成。3.外部特性(引腳功能) ADC0809芯片有28條引腳,采用雙列直插式封裝,如圖所示。下面說明各引腳功能。 IN0~I(xiàn)N7:8路模擬量輸入端。 2-1~2-8:8位數(shù)字量輸出端。 ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路 ALE:地址鎖存允許信號(hào),輸入,高電平有效。 START: A/D轉(zhuǎn)換啟動(dòng)脈沖輸入端,輸入一個(gè)正脈沖(至少100ns寬)使其啟動(dòng)(脈沖上升沿使0809復(fù)位,下降沿啟動(dòng)A/D轉(zhuǎn)換)。 EOC: A/D轉(zhuǎn)換結(jié)束信號(hào),輸出,當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),此端輸出一個(gè)高電平(轉(zhuǎn)換期間一直為低電平)。 OE:數(shù)據(jù)輸出允許信號(hào),輸入,高電平有效。當(dāng)A/D轉(zhuǎn)換結(jié)束時(shí),此端輸入一個(gè)高電平,才能打開輸出三態(tài)門,輸出數(shù)字量。 CLK:時(shí)鐘脈沖輸入端。要求時(shí)鐘頻率不高于640KHZ。 REF(+)、REF(-):基準(zhǔn)電壓。 Vcc:電源,單一+5V。 GND:地。ADC0809的工作過程 首先輸入3位地址,并使ALE=1,將地址存入地址鎖存器中。此地址經(jīng)譯碼選通8路模擬輸入之一到比較器。START上升沿將逐次逼近寄存器復(fù)位。下降沿啟動(dòng) A/D轉(zhuǎn)換,之后EOC輸出信號(hào)變低,指示轉(zhuǎn)換正在進(jìn)行。直到A/D轉(zhuǎn)換完成,EOC變?yōu)楦唠娖剑甘続/D轉(zhuǎn)換結(jié)束,結(jié)果數(shù)據(jù)已存入鎖存器,這個(gè)信號(hào)可用作中斷申請。當(dāng)OE輸入高電平時(shí),輸出三態(tài)門打開,轉(zhuǎn)換結(jié)果的數(shù)字量輸出到數(shù)據(jù)總線上。 轉(zhuǎn)換數(shù)據(jù)的傳送 A/D轉(zhuǎn)換后得到的數(shù)據(jù)應(yīng)及時(shí)傳送給單片機(jī)進(jìn)行處理。數(shù)據(jù)傳送的關(guān)鍵問題是如何確認(rèn)A/D轉(zhuǎn)換的完成,因?yàn)橹挥写_認(rèn)完成后,才能進(jìn)行傳送。為此可采用下述三種方式。 (1)定時(shí)傳送方式 對于一種A/D轉(zhuǎn)換器來說,轉(zhuǎn)換時(shí)間作為一項(xiàng)技術(shù)指標(biāo)是已知的和固定的。例如ADC0809轉(zhuǎn)換時(shí)間為128μs,相當(dāng)于6MHz的MCS-51單片機(jī)共64個(gè)機(jī)器周期。可據(jù)此設(shè)計(jì)一個(gè)延時(shí)子程序,A/D轉(zhuǎn)換啟動(dòng)后即調(diào)用此子程序,延遲時(shí)間一到,轉(zhuǎn)換肯定已經(jīng)完成了,接著就可進(jìn)行數(shù)據(jù)傳送。 (2)查詢方式 A/D轉(zhuǎn)換芯片由表明轉(zhuǎn)換完成的狀態(tài)信號(hào),例如ADC0809的EOC端。因此可以用查詢方式,測試EOC的狀態(tài),即可確認(rèn)轉(zhuǎn)換是否完成,并接著進(jìn)行數(shù)據(jù)傳送。 (3)中斷方式 把表明轉(zhuǎn)換完成的狀態(tài)信號(hào)(EOC)作為中斷請求信號(hào),以中斷方式進(jìn)行數(shù)據(jù)傳送。 不管使用上述哪種方式,只要一旦確定轉(zhuǎn)換完成,即可通過指令進(jìn)行 數(shù)據(jù)傳送。首先送出口地址并以信號(hào)有效時(shí),OE信號(hào)即有效,把轉(zhuǎn)換數(shù)據(jù)送上數(shù)據(jù)總線,供單片機(jī)接受。 2.3電路原理圖 2.4系統(tǒng)板上硬件連接 a)把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.7與“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的ABCDEFGH端口用8芯排線連接。 b)把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0-P2.7與“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的S1S2S3S4S5S6S7S8端口用8芯排線連接。 c)把“單片機(jī)系統(tǒng)”區(qū)域中的P3.0與“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的ST端子用導(dǎo)線相連接。 d)把“單片機(jī)系統(tǒng)”區(qū)域中的P3.1與“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的OE端子用導(dǎo)線相連接。 e)把“單片機(jī)系統(tǒng)”區(qū)域中的P3.2與“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的EOC端子用導(dǎo)線相連接。 f)把“單片機(jī)系統(tǒng)”區(qū)域中的P3.3與“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的CLK端子用導(dǎo)線相連接。 g)把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的A2A1A0端子用導(dǎo)線連接到“電源模塊”區(qū)域中的GND端子上。 h)把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的IN0端子用導(dǎo)線連接到“三路可調(diào)電壓模塊”區(qū)域中的VR1端子上。 i)把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0-P0.7用8芯排線連接到“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的D0D1D2D3D4D5D6D7端子上。 2.5程序設(shè)計(jì)內(nèi)容 1.由于ADC0809在進(jìn)行A/D轉(zhuǎn)換時(shí)需要有CLK信號(hào),而此時(shí)的ADC0809的CLK是接在AT89S51單片機(jī)的P3.3端口上,也就是要求從P3.3輸出CLK信號(hào)供ADC0809使用。因此產(chǎn)生CLK信號(hào)的方法就得用軟件來產(chǎn)生了。 2.由于ADC0809的參考電壓VREF=VCC,所以轉(zhuǎn)換之后的數(shù)據(jù)要經(jīng)過數(shù)據(jù)處理,在數(shù)碼管上顯示出電壓值。實(shí)際顯示的電壓值(D/256*VREF) 2.6C語言源程序 #include unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};unsigned char dispcount;unsigned char getdata;unsigned int temp; long int i; 代替原來的unsigned char i; sbit ST=P3^0;sbit OE=P3^1;sbit EOC=P3^2;sbit CLK=P3^3; void main(void){ ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12; TH0=216; TL0=216; TH1=(65536-5000)/256; TL1=(65536-5000)%256; TR1=1; TR0=1; ST=1; ST=0; while(1) { if(EOC==1) { OE=1; getdata=P0; OE=0; i=getdata*196; dispbuf[5]=i/10000; i=i%10000; dispbuf[6]=i/1000; i=i%1000; dispbuf[7]=i/100; ST=1; ST=0; } } } void t0(void)interrupt 1 using 0 { CLK=~CLK;} void t1(void)interrupt 3 using 0 { TH1=(65536-6000)/256; TL1=(65536-6000)%256; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount]; if(dispcount==5) /*原來的: temp = getdata * 235; temp=temp/128; i=5; dispbuf[0]=10;dispbuf[1]=10;dispbuf[2]=10;dispbuf[3]=10;dispbuf[4]=10;dispbuf[5]=0;dispbuf[6]=0;dispbuf[7]=0;while(temp/10) { dispbuf[i]=temp%10; temp=temp/10; i++; } dispbuf[i]=temp;*/ //定時(shí)器0 中斷服務(wù) //定時(shí)器1 中斷服務(wù) { P1=P1 | 0x80; } dispcount++; if(dispcount==8) { dispcount=0; } } 3.總結(jié) 設(shè)計(jì)結(jié)果綜述: (1)、數(shù)字萬用表完成的功能主要是對電壓、電流、電阻的測量,它主要由分流電阻、分壓電阻、基準(zhǔn)電阻、51單片機(jī)最小系統(tǒng)、顯示部分、報(bào)警部分、AD轉(zhuǎn)換和控制部分組成。(2)、數(shù)字萬用表屬于一種測量工具,其本身的好壞直接影響到測量結(jié)果,因此上面的設(shè)計(jì)在實(shí)物上只可以測直流電壓,在仿真上可以測出直流電壓電流和電阻。(3)、單片機(jī)部分跟AD轉(zhuǎn)換部分是整個(gè)設(shè)計(jì)的核心,ADC0809的參考電壓VREF=VCC,所以轉(zhuǎn)換之后的數(shù)據(jù)要經(jīng)過數(shù)據(jù)處理,在數(shù)碼管上顯示出電壓值。實(shí)際顯示的電壓值(D/256*VREF);AT89S51單片機(jī)作為主控芯片,配以RC上電復(fù)位電路和震蕩電路,使系統(tǒng)穩(wěn)定運(yùn)行。(4)、在本次軟件設(shè)計(jì)過程中,采用的是C語言程序。 4心得體會(huì) 兩周的課程設(shè)計(jì)結(jié)束了,在這次的課程設(shè)計(jì)中不僅檢驗(yàn)了我所學(xué)習(xí)的知識(shí),也培養(yǎng)了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。通過此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)單片機(jī)方面的知識(shí),在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。過而能改,善莫大焉。在課程設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。最終的仿真環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多問題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會(huì)的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所12 在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會(huì)及他人對你的認(rèn)可!通過這次的課程設(shè)計(jì),使我更加透徹的了解到我在單片機(jī)這方面的知識(shí)的淺薄,從而促進(jìn)了握要更加了解單片機(jī)知識(shí)的決心。 5參考文獻(xiàn) C語言程序設(shè)計(jì)第三版 51單片機(jī)開發(fā)與應(yīng)用基礎(chǔ)教程13 C語言版) (第四篇:電子,單片機(jī)畢業(yè)設(shè)計(jì)畢業(yè)論文
第五篇:單片機(jī)數(shù)字萬用表課程設(shè)計(jì)