




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上中南林業(yè)科技大學(xué)單片機C51程序設(shè)計課程設(shè)計報告設(shè)計名稱: 溫度報警系統(tǒng) 姓 名: 高楓 學(xué) 號: 專 業(yè): 2016級電子信息工程一班 院 (系): 計算機與信息工程學(xué)院 設(shè)計時間: 2018秋第1518周 設(shè)計地點: 中南林業(yè)科技大學(xué) 指導(dǎo)教師評語: 成績: 簽名: 年 月 日目錄一、 題目二、 任務(wù)與要求三、 課程設(shè)計摘要及整體框圖1、 總體設(shè)計思路概述2、 硬件設(shè)計概述3、 軟件設(shè)計概述4、 程序流程圖四、 課程設(shè)計原理分析及相關(guān)知識概述五、 結(jié)論六、 體會與收獲附件:1、 源程序代碼(加注釋)2、 整體電路原理圖3、 元器件清單一、題目設(shè)計一個可調(diào)時、可設(shè)置
2、溫度并報警的溫度報警系統(tǒng)二、任務(wù)與要求一)、任務(wù): 設(shè)計并制作一個基于LCD1602液晶顯示,采用DS1302時鐘芯片顯示時間,DS18B20采集溫度的可調(diào)時,可設(shè)置報警溫度的溫度報警系統(tǒng)。二)、要求:利用單片機CPU芯片STC89C52、LCD1602、DS18B20、DS1302、蜂鳴器、按鍵等,設(shè)計一個可調(diào)時、可設(shè)置溫度并報警的溫度報警系統(tǒng)。由DS18B20感知環(huán)境溫度、DS1302時鐘芯片控制時間運行,利用單片機外部中斷INT0、INT1及按鍵設(shè)置溫度和時間、用LCD1602顯示,當(dāng)超過設(shè)置溫度3的時候蜂鳴器報警。三、課程設(shè)計摘要及整體框圖 一)課程設(shè)計摘要:本設(shè)計通過LCD1602顯
3、示由DS1302設(shè)置的時間(時、分、秒)、DS18B20采集的環(huán)境溫度(攝氏度)、以及通過外部中斷INT0、INT1兩個中斷即獨立按鍵K4、K1、K2設(shè)置當(dāng)前時間,按鍵K3設(shè)定目標溫度。當(dāng)環(huán)境溫度在目標溫度的3的范圍內(nèi)時蜂鳴器不報警,否則蜂鳴器報警。LCD1602液晶顯示DS1302設(shè)置時間二)整體框圖按鍵K3即外部中斷0STC89C52芯片按鍵K4即外部中斷1蜂鳴器報警DS18B20采集溫度三)總體設(shè)計思路DS1302是一個精確的時鐘芯片,能夠計算2100年前的時間,具有閏年調(diào)整的能力,設(shè)計只需要用到芯片的時、分、秒。DS18B20是一款性能優(yōu)良的數(shù)字溫度傳感器,通過DS18B20采集實時環(huán)
4、境溫度,外部中斷0設(shè)置目標溫度,當(dāng)二者溫度相差大于3時,蜂鳴器報警,否則正常測量。通過外部中斷1進入時鐘調(diào)時功能,通過按鍵K1,移位,按鍵K2進行加一操作,來調(diào)整時鐘的時分秒。四)硬件設(shè)計概述本設(shè)計通過仿真平臺Protues 7.0進行基礎(chǔ)的硬件仿真操作,先添加添加元器件AT89C52芯片 以及一些其他的電阻,電容和按鍵,其中P30, P31, P32, P33口分別連接獨立按鍵K1,K2,K3,K4。DS18B20,DS1302分別在對應(yīng)的端口正確連接即可。需要注意的是,DS18B20在仿真時不會出現(xiàn)真實的溫度值,在連接LCD1602時,則需要添加上拉電阻,本設(shè)計的硬件設(shè)計較為簡單,在此不再
5、一一贅述,詳見附件硬件設(shè)計原理圖。五)軟件設(shè)計概述軟件采用頭文件方式編程,分為主程序模塊TCmain模塊,LCD1602初始設(shè)置模塊,DS18B20初始設(shè)置模塊,DS1302初始設(shè)置模塊四個部分。其中LCD1602初始設(shè)置模塊,DS18B20初始設(shè)置模塊,DS1302初始設(shè)置模塊,均是根據(jù)三個原件的時序圖來編寫,固定使用。詳見附件源程序代碼。這里主要介紹TCmain模塊,在這里調(diào)用DS18B20采集的溫度并進行裝換,設(shè)置的時間均通過LCD1602顯示出來。采用了外部中斷0 1,在這兩個中斷服務(wù)程序里面,一個進行再數(shù)組里面移位,進行溫度顯示。另外一個設(shè)置時間進入調(diào)時功能以及正常顯示功能。6)程序
6、流程圖TCmain四、課程設(shè)計原理分析及相關(guān)知識概述1、LCD1602也稱1602字符型液晶,專門顯示字母、數(shù)字、符號的點陣型液晶模塊。由若干個5x7或5x10的點陣字符位組成,顯示通過ASCII碼值直接顯示。寫入顯示地址要求最高位D7位為高電平,寫入數(shù)據(jù)應(yīng)該加上0x80.2、DS18B20數(shù)字溫度傳感器可用于多種場合,具有適應(yīng)電壓范圍寬、精度高、抗干擾糾錯能力強、速度快的特點。核心功能是可以直接讀出數(shù)字的溫度數(shù)值。其默認精度為12位即0.0625,通過初始化時序、讀時序、寫時序進行傳感器的初始化。得到的12位數(shù)據(jù),前五位為符號位。大于0時數(shù)據(jù)乘以0.0625即可得到實際溫度。3、DS1302
7、時鐘芯片具有計算2100年之前的秒、分、時、日、月、年、周以及閏年調(diào)整的能力。采用SPI 3線接口,采用雙電源供應(yīng)。共有12個寄存器,存儲格式為秒、分、時、日、月、周、年,存放數(shù)據(jù)格式為BCD碼形式。數(shù)據(jù)輸入輸出均從低位0到高位7。在液晶顯示時要將BCD碼轉(zhuǎn)化成二進制碼,轉(zhuǎn)換方式為當(dāng)4位二進制碼大于1001時加6即可。五、結(jié)論下載到單片機開發(fā)板上驗證的,設(shè)計的溫度報警裝置基本實現(xiàn)了功能。但是較為遺憾的是,由于DS18B20溫度傳感器測量得到的溫度與實際的環(huán)境溫度有較大的誤差。比如手機顯示天氣溫度為2,但是傳感器測量得到溫度為9。再者就是由于DS1302與DS18B20二者的時序沖突問題,在調(diào)整
8、時間時,溫度傳感器不能與C52芯片通信,此刻溫度會顯示零。六、體會與收獲在大二由周凱老師講述單片機課程時,采用的是匯編語言講述,但是具體操作時采用的是C語言編寫,二者有較大的區(qū)別,并不能詳細理解單片機的內(nèi)涵。并且由于上學(xué)期周老師講述進度過慢,后面的SPI總線、I2C、LCD602等均沒有經(jīng)過系統(tǒng)學(xué)習(xí)。本學(xué)期不僅僅系統(tǒng)學(xué)習(xí)基于硬件的C51語言,也系統(tǒng)學(xué)習(xí)了I2C、LCD1602、DS18B20等元器件的使用。謝老師認真負責(zé),講述詳實,本學(xué)期收獲頗豐。本次課設(shè)是對這學(xué)期所學(xué)知識的總結(jié),所做的溫度報警裝置用到了LCD1602、DS18B20、DS1302、中斷以及基本的C51知識,期間碰到了一些較為
9、棘手的問題,比如DS18B20和DS1302二者沖突不能同時同單片機通信,溫度值一直為零,經(jīng)過排查二者有段代碼導(dǎo)致了時序沖突,解決這個問題后,就實現(xiàn)了所要實現(xiàn)的基本功能,較好的運用了本學(xué)期所學(xué)內(nèi)容。 附件:1、源程序代碼(加注釋)1)主函數(shù):#include "reg52.h"#include "math.h"#include "lcd1602.h"#include "DS18b20.h"#include "DS1302.h"sbit k1=P30; /按鍵K1 調(diào)時功能的移位鍵sbit k2=
10、P31; /按鍵K2 調(diào)試功能的加一鍵sbit k3=P32; /按鍵K3 溫度設(shè)置鍵sbit k4=P33; /按鍵K4 進入調(diào)時功能的按鍵sbit beep=P15; /蜂鳴器接口typedef unsigned int u16;typedef unsigned char u8;u8 set,setp,p=0,a,g,f=0;u8 lcd35;u8 codel10=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39;/LCD1602使用的ASCII碼值u8 temp32=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0
11、x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 0x28,0x29,0x30,0x31; /設(shè)置溫度的數(shù)組,范圍為BCD碼值為0到31void Tctemp(int temp) /溫度顯示函數(shù)float tp;u8 i;if(temp<0) /溫度值小于0則減一,取反temp=temp-1;temp=temp;tp=temp;temp=tp*0.0625*100+0.5;/加上0.5為了四舍五入;elsetp =temp;tem
12、p=tp*0.0625*100+0.5; lcd16=ltemp%10000/1000; /得到十位lcd17=ltemp%1000/100; /得到個位lcd18=0x2e; /小數(shù)點 . lcd19=ltemp%100/10; /十分位lcd20=ltemp%10; /百分位lcd21=0xdf;lcd22=0x43;/二者構(gòu)成的符號lcdwrc(0xc9);/第四位開始顯示for(i=16;i<=22;i+)lcdwrd(lcdi); a=temp/100; /溫度取整數(shù)兩位void Tctime()/時間顯示與設(shè)置函數(shù)if(set=0) Ds1302ReadTime();else
13、if(k1=0)delay(10000);/延時消抖if(k1=0)if(setp>=2)/調(diào)整調(diào)時的位置setp=0;elsesetp+;if (k2=0)delay(10000);if (k2=0)TIMEsetp+;if(TIMEsetp&0x0f)>9)/*ASCII碼換成BCD碼,換算規(guī)則低四位大于9則低四位減六修正,計算機按補碼運算,實際加六運算*/TIMEsetp=TIMEsetp+6;if(TIMEsetp>=0x60)&&(setp<2)/分秒只能到59TIMEsetp=0;if(TIMEsetp>=0x24)&&
14、amp;(setp=2)/小時只能到23TIMEsetp=0;lcdwrc(0x84);lcdwrd('0'+TIME2/16);/時 將BCD碼值裝換成ASCII碼值lcdwrd('0'+(TIME2&0x0f); lcdwrd(':');lcdwrd('0'+TIME1/16);/分lcdwrd('0'+(TIME1&0x0f);lcdwrd(':');lcdwrd('0'+TIME0/16);/秒lcdwrd('0'+(TIME0&0x0
15、f);void init0() /中斷初始化EX0=1; /外部中斷0IT0=1;EX1=1; /外部中斷1IT1=1;EA=1;void int0() interrupt 0/外部中斷0delay(10000);if (k3=0)if(setp=31)p=0;elsep+;/溫度設(shè)置的數(shù)組指針f=1; /按下按鍵開始比較void init2() interrupt 2 /外部中斷1delay(10000);if (k4=0) set=set;setp=0;Ds1302Init();f=f;/*f取反的原因是,進入調(diào)時時溫度會變 成0,為了防止此時蜂鳴器響起,因此取反*/void dis()
16、/設(shè)置溫度顯示函數(shù)u8 i;lcd23= 0x53;lcd24= 0x65;lcd25= 0x74;lcd26= 0x3a;lcd27= ltempp/16;/BCD碼裝換成ASCIII值lcd28= ltempp&0X0f;lcd29=0xdf;lcd30=0x43;lcdwrc(0xc0);for(i=23;i<=30;i+)lcdwrd(lcdi);g=(tempp/16)*10+(tempp&0x0f); /設(shè)置的溫度計算得到兩位整數(shù)if (abs(a-g)>3)&&(f=1) /溫差大于3時蜂鳴器響for(i=100;i+;i<=20
17、000)beep=beep;delay(i);void main() lcdinit();init0();while(1) Tctemp(Ds18b20ReadTemp(); Tctime(); dis();2)LCD1602初始化函數(shù)根據(jù)1602的時序圖編寫初始化函數(shù),時序圖如下其中RS=0 寫入數(shù)據(jù),RS=1 寫入命令#include "lcd1602.h"void delay(unsigned char i)/延時函數(shù)while(i-);void lcdwrc(unsigned int c)/寫入命令delay(1000);RS=0;RW=0;E=0;P0=c;E=1
18、;delay(1000);E=0;void lcdwrd(unsigned char dat)/寫入數(shù)據(jù)delay(1000);RS=1;RW=0;E=0;P0=dat;E=1;delay(1000);E=0;RS=0;void lcdinit()/初始化delay(500);lcdwrc(0x38); /8位總線,顯示兩行,5x10的點陣delay(500);lcdwrc(0x80); / 設(shè)置指針起點lcdwrc(0x01); /清屏指令lcdwrc(0x06); /光標右移,屏幕不移動lcdwrc(0x0c); /顯示功能開,無光標3)LCD1602頭文件#ifndef _lcd1602
19、_#define _lcd1602_#include "reg52.h"sbit RW=P25;sbit RS=P26;sbit E=P27;void delay(unsigned char i);/延時函數(shù)void lcdwrc(unsigned int c);/寫入命令void lcdwrd(unsigned char dat);/寫入數(shù)據(jù)void lcdinit();/初始化#endif4) DS1302初始化函數(shù)根據(jù)DS1302時序?qū)懭氤跏蓟瘮?shù)#include "DS1302.h"uchar code READ_RTC_ADDR7 = 0x81
20、, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d; uchar code WRITE_RTC_ADDR7 = 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c; /DS1302時鐘初始化2019年1月1日星期1 00點00分00秒。uchar TIME7 = 0, 0x00, 0x00, 0x01, 0x01, 0x02, 0x18; /存儲順序是秒分時日月周年,存儲格式是用BCD碼void Ds1302Write(uchar addr, uchar dat)uchar n;RST = 0;_nop_();SCLK = 0;/先將SCLK
21、置低電平。_nop_();RST = 1; /然后將RST(CE)置高電平。_nop_();for (n=0; n<8; n+)/開始傳送八位地址命令DSIO = addr & 0x01;/數(shù)據(jù)從低位開始傳送addr >>= 1;SCLK = 1;/數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)_nop_();SCLK = 0;_nop_();for (n=0; n<8; n+)/寫入8位數(shù)據(jù)DSIO = dat & 0x01;dat >>= 1;SCLK = 1;/數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)_nop_();SCLK = 0;_nop_();
22、 RST = 0;/傳送數(shù)據(jù)結(jié)束_nop_();uchar Ds1302Read (uchar addr)uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;/先將SCLK置低電平。_nop_();RST = 1;/然后將RST(CE)置高電平。_nop_();for(n=0; n<8; n+)/開始傳送八位地址命令DSIO = addr & 0x01;/數(shù)據(jù)從低位開始傳送addr >>= 1;SCLK = 1;/數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)_nop_();SCLK = 0;/DS1302下降沿時,放置數(shù)據(jù)_nop_();_no
23、p_();for(n=0; n<8; n+)/讀取8位數(shù)據(jù)dat1 = DSIO;/從最低位開始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;/DS1302下降沿時,放置數(shù)據(jù)_nop_();_nop_();/以下為DS1302復(fù)位的穩(wěn)定時間,必須的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;void Ds1302Init()uchar n;Ds1302Write(0x8E,0X00); /禁止寫保護,就是關(guān)閉寫保護功能f
24、or (n=0; n<7; n+)/寫入7個字節(jié)的時鐘信號:分秒時日月周年Ds1302Write(WRITE_RTC_ADDRn,TIMEn);Ds1302Write(0x8E,0x80); /打開寫保護功能void Ds1302ReadTime()uchar n;for (n=0; n<7; n+)/讀取7個字節(jié)的時鐘信號:分秒時日月周年TIMEn = Ds1302Read(READ_RTC_ADDRn);5)DS1302頭文件#ifndef _DS1302_H_#define _DS1302_H_#include<reg52.h>#include<intrin
25、s.h>#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endifsbit DSIO=P34;sbit RST=P35;sbit SCLK=P36;void Ds1302Write(uchar addr, uchar dat);uchar Ds1302Read (uchar addr);void Ds1302Init();void Ds1302ReadTime();extern uchar TIME7;/加入全局變量#endif6)DS18B20初始化函數(shù)DS18B2
26、0時序圖#include "DS18b20.h"void Delay1ms (uint y)uint x;for( ; y>0; y-)for(x=110; x>0; x-);uchar Ds18b20Init()uchar i;DSPORT = 0; /將總線拉低480us960usi = 70;while(i-);/延時642usDSPORT = 1;/然后拉高總線,如果DS18B20做出反應(yīng)會將在15us60us后總線拉低i = 0;while(DSPORT)/等待DS18B20拉低總線Delay1ms(1);i+;if(i>5)/等待>5MS
27、return 0;/初始化失敗return 1;/初始化成功void Ds18b20WriteByte (uchar dat)uint i, j;for(j=0; j<8; j+)DSPORT = 0; /每寫入一位數(shù)據(jù)之前先把總線拉低1usi+;DSPORT = dat & 0x01; /然后寫入一個數(shù)據(jù),從最低位開始i=6;while(i-); /延時68us,持續(xù)時間最少60usDSPORT = 1;/然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值dat >>= 1;uchar Ds18b20 ReadByte()uchar byte, bi;ui
28、nt i, j;for(j=8; j>0; j-)DSPORT = 0;/先將總線拉低1usi+;DSPORT = 1;/然后釋放總線i+;i+;/延時6us等待數(shù)據(jù)穩(wěn)定bi = DSPORT; /讀取數(shù)據(jù),從最低位開始讀取/*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/byte = (byte >> 1) | (bi << 7); i = 4;/讀取完之后等待48us再接著讀取下一個數(shù)while(i-);return byte;Void Ds18b20 ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳過ROM操作命令 Ds18b20WriteB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供銷保價合同范本
- 農(nóng)村臨時建房承包合同范本
- 書畫采購合同范本
- 出版合同范本填寫
- 書贈與合同范本
- 農(nóng)莊裝修合同范本
- 出資借款合同范本
- 分體機空調(diào)保養(yǎng)合同范本
- 企業(yè)合作運營合同范本
- 產(chǎn)品收款合同范本
- 2022年獸醫(yī)外科手術(shù)學(xué)作業(yè)題參考答案
- T∕CAMDI 009.1-2020 無菌醫(yī)療器械初包裝潔凈度 第1部分:微粒污染試驗方法 氣體吹脫法
- 醫(yī)院門診掛號收費系統(tǒng)操作要點
- 10KV變電所電氣調(diào)試施工方案
- 國家農(nóng)產(chǎn)品質(zhì)量安全監(jiān)督抽查抽樣單
- 聘書模板可編輯
- 離心式壓縮機功率公式
- 參保人員就醫(yī)流程doc
- 2019湘美版五年級《書法練習(xí)指導(dǎo)》下冊教案
- 東南大學(xué)建筑學(xué)專業(yè)課程設(shè)置
- Q∕CR 562.2-2017 鐵路隧道防排水材料 第2部分:止水帶
評論
0/150
提交評論