51單片機(jī)溫度報(bào)警器畢業(yè)設(shè)計(jì)說明書_第1頁(yè)
51單片機(jī)溫度報(bào)警器畢業(yè)設(shè)計(jì)說明書_第2頁(yè)
51單片機(jī)溫度報(bào)警器畢業(yè)設(shè)計(jì)說明書_第3頁(yè)
51單片機(jī)溫度報(bào)警器畢業(yè)設(shè)計(jì)說明書_第4頁(yè)
51單片機(jī)溫度報(bào)警器畢業(yè)設(shè)計(jì)說明書_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

畢業(yè)設(shè)計(jì)說明書題目:51單片機(jī)溫度報(bào)警器產(chǎn)品設(shè)計(jì)工藝設(shè)計(jì)方案設(shè)計(jì)√類型:學(xué)生姓名:學(xué)號(hào):學(xué)院:電子信息工程學(xué)院專業(yè):應(yīng)用電子班級(jí):電子1331班學(xué)校指導(dǎo)教師:企業(yè)指導(dǎo)教師:2016年4月16日

摘要該畢業(yè)設(shè)計(jì)是利用是單片機(jī)STC89C51和溫度傳感器DS18B20以及數(shù)碼管制作一個(gè)基本51單片機(jī)溫度報(bào)警器。溫度是一個(gè)很重要的物理量,它與人類的生活息息相關(guān),溫度傳感器DS18B20它是一種直接數(shù)字的溫度傳感器,使用方便。設(shè)計(jì)溫度報(bào)警器具有顯示溫度功能和高溫報(bào)警及低溫報(bào)警功能。溫度報(bào)警器還有一個(gè)省電功能,數(shù)據(jù)保存在單片機(jī)內(nèi)部EEPOM里,進(jìn)入設(shè)置界面后,如果沒有鍵被按下時(shí),系統(tǒng)在15秒后自動(dòng)退出設(shè)置界面。關(guān)鍵詞:溫度報(bào)警;STC89C51;DS18B20;數(shù)碼管目錄1.引言 32.方案設(shè)計(jì) 32.1單片機(jī)的最小系統(tǒng) 42.2溫度測(cè)量 42.3溫度設(shè)置 52.4模塊顯示 53.系統(tǒng)軟件設(shè)計(jì) 54.1程序結(jié)構(gòu)分析 64.2系統(tǒng)程序框架圖 65.安裝步驟 66.結(jié)論 6參考文獻(xiàn) 6致謝 7附錄:部分源程序 71.引言溫度是一個(gè)很重要的物理量,它與人類的生活息息相關(guān),利用單片機(jī)實(shí)時(shí)對(duì)溫度傳感器DS18B20進(jìn)行檢測(cè),并進(jìn)行數(shù)據(jù)處理。將測(cè)量實(shí)際環(huán)境溫度通過數(shù)碼管顯示,通過按鍵可以設(shè)置高、低報(bào)警值,當(dāng)檢測(cè)溫度高于設(shè)定的報(bào)警值時(shí),蜂鳴器報(bào)警,報(bào)警紅燈閃爍;當(dāng)檢測(cè)溫度低于設(shè)定的報(bào)警值時(shí),蜂鳴器報(bào)警,報(bào)警黃燈閃爍。溫度報(bào)警器還有一個(gè)省電功能,數(shù)據(jù)保存在單片機(jī)內(nèi)部EEPOM里,進(jìn)入設(shè)置界面后,如果沒有鍵被按下時(shí),系統(tǒng)在15秒后自動(dòng)退出設(shè)置界面。2.方案設(shè)計(jì)該系統(tǒng)主要由四部分組成:DS18B20溫度測(cè)量、按鍵溫度設(shè)置、測(cè)量溫度顯示及單片機(jī)最小系統(tǒng)。系統(tǒng)方框圖如圖2.0所示。圖2.0溫度報(bào)警器系統(tǒng)方框圖2.1單片機(jī)的最小系統(tǒng)使用STC89C51單片機(jī)作為整個(gè)系統(tǒng)的核心,它的最小系統(tǒng)是由單片機(jī)、復(fù)位電路、振蕩電路、P0口的上拉電阻、電源和地組成。單片機(jī)的最小系統(tǒng)原理圖如圖2.1所示。圖2.1溫度報(bào)警器單片機(jī)最小系統(tǒng)電路圖2.2溫度測(cè)量使用數(shù)字溫度芯片DS18B20測(cè)量實(shí)際溫度,輸出信號(hào)全數(shù)字化,便于單片機(jī)控制處理,省去了傳統(tǒng)測(cè)量很多外圍電路的溫度監(jiān)測(cè)方法。溫度傳感DS18B20有三個(gè)引腳,一個(gè)接電源正,一個(gè)接電源的負(fù),另一個(gè)與單片機(jī)進(jìn)行通訊。DS18B20接線圖如圖2.2所示。圖

2.2DS18B20測(cè)量電路圖2.3溫度設(shè)置溫度設(shè)置是通過鍵盤輸入設(shè)定報(bào)警溫度值,鍵盤輸入由四個(gè)按鈕組成,一個(gè)重置按鈕,一個(gè)確認(rèn)鍵,一個(gè)加,一個(gè)減按鈕。按鍵與單片機(jī)的P2.0、P2.1、P2.2、P2.3相連接。接線原理圖如圖2.3所示。圖

2.3按鍵與單片機(jī)接線電路圖2.4模塊顯示溫度報(bào)警器的實(shí)際測(cè)量溫度采用數(shù)碼管顯示,數(shù)碼管的位通過PNP三極管基極與P3.0、P3.1、P3.2、P3.3相連,數(shù)碼管的段與單片機(jī)的P1端口相連。顯示接線電路圖如圖2.4所示。圖2.4溫度報(bào)警器顯示電路圖3.系統(tǒng)軟件設(shè)計(jì)4.1程序結(jié)構(gòu)分析4.2系統(tǒng)程序框架圖5.安裝步驟1.檢查元件的好壞布局、焊接各元件焊完后編程調(diào)試6.結(jié)論溫度報(bào)警,通過實(shí)時(shí)檢測(cè)溫度傳感器DS18B20信號(hào)送到單片機(jī),單片機(jī)對(duì)DS18B20的數(shù)據(jù)處理。通過按鈕可以設(shè)置高、低報(bào)警值,當(dāng)檢測(cè)到的溫度高于設(shè)定的報(bào)警值時(shí),蜂鳴器報(bào)警,報(bào)警紅燈閃爍;當(dāng)檢測(cè)到的溫度低于設(shè)定的報(bào)警值時(shí),蜂鳴器報(bào)警,報(bào)警黃燈閃爍,具有斷電保存功能,和數(shù)據(jù)保存在單片機(jī)內(nèi)部EEPOM,同時(shí)還有省電功能,進(jìn)入設(shè)置界面,如果15秒沒有鍵按下,系統(tǒng)自動(dòng)退出設(shè)置界面。設(shè)計(jì)功能基本完成。參考文獻(xiàn)[1]曹巧媛主編.單片機(jī)原理及應(yīng)用(第二版).北京:電子工業(yè)出版社,2002[2]全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽組委會(huì)編.第五屆全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽獲獎(jiǎng)作品選編(2001),北京:北京理工大學(xué)出版社,2003[3]何力民編.單片機(jī)高級(jí)教程.北京:北京航空大學(xué)出版社,2000[4]金發(fā)慶等編.傳感器技術(shù)與應(yīng)用.北京機(jī)械工業(yè)出版社,2002[5]劉坤、宋戈、趙洪波、張憲棟編.51單片機(jī)C語(yǔ)言應(yīng)用開發(fā)技術(shù)大全,北京:人民郵電出版社,2008[6]譚浩強(qiáng)著.C程序設(shè)計(jì).北京:清華大學(xué)出版社,2007;[7]王忠飛,胥芳.MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2007.P268-273[8]PeterVanDerLinden著,徐波譯.C專家編程,人民郵電出版社,2003致謝在說明書的寫作過程中遇到了無數(shù)的困難和障礙,都在同學(xué)的幫助和老師的指導(dǎo)下克服了困難。尤其要強(qiáng)烈感謝我的畢業(yè)設(shè)計(jì)指導(dǎo)老師—李桂平老師,她對(duì)我進(jìn)行了無私的指導(dǎo)和幫助,不厭其煩的幫助進(jìn)行說明書的修改和改進(jìn)。感謝我的同學(xué)和朋友,在我寫設(shè)計(jì)說明書的過程中給予我了很多素材,還在此撰寫和排版的過程中提供熱情的幫助。感謝民政職業(yè)技術(shù)學(xué)院三年來對(duì)我的培養(yǎng)和教育。感謝電子學(xué)院所有的專業(yè)老師。附錄:部分源程序#include<reg52.h>#include"eepom52.h"#defineucharunsignedchar#defineuintunsignedint//數(shù)碼管段選定義012345 6 7 8 9 ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //斷碼//數(shù)碼管位選定義ucharcodesmg_we[]={0xef,0xdf,0xbf,0x7f};uchardis_smg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; ucharsmg_i=3;//顯示數(shù)碼管的個(gè)位數(shù)sbitdq=P2^4; //18b20IO口的定義sbitbeep=P2^5;//蜂鳴器IO口定義uchara_a;uinttemperature;//bitflag_300ms;ucharkey_can; //按鍵值的變量ucharmenu_1;//菜單設(shè)計(jì)的變量uintt_high=300,t_low=100;bitflag_lj_en; //按鍵連加使能bitflag_lj_3_en; //按鍵連3次連加后使能加的數(shù)就越大了ucharkey_time,flag_value;//用做連加的中間變量bitkey_500ms;ucharflag_clock;ucharzd_break_en,zd_break_value;//自動(dòng)退出設(shè)置界面/***********************1ms延時(shí)函數(shù)*****************************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/***********************小延時(shí)函數(shù)*****************************/voiddelay_uint(uintq){ while(q--);}/***********************數(shù)碼顯示函數(shù)*****************************/voiddisplay(){ uchari; for(i=0;i<smg_i;i++) { P3=smg_we[i]; //位選 P1=dis_smg[i]; //段選 delay_1ms(1); P3=0xff; //位選 P1=0xff; //消隱 } }/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eepom中******************/voidwrite_eepom(){ SectorErase(0x2000); byte_write(0x2000,t_high%256); byte_write(0x2001,t_high/256); byte_write(0x2002,t_low%256); byte_write(0x2003,t_low/256); byte_write(0x2055,a_a); }/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eepom中讀出來*****************/voidread_eepom(){ t_high=byte_read(0x2001); t_high<<=8; t_high|=byte_read(0x2000); t_low=byte_read(0x2003); t_low<<=8; t_low|=byte_read(0x2002); a_a=byte_read(0x2055);}/***********************18b20初始化函數(shù)*****************************/voidinit_18b20(){ bitq; dq=1; //把總線拿高 delay_uint(1); //15us dq=0; //給復(fù)位脈沖 delay_uint(80); //750us dq=1; //把總線拿高等待 delay_uint(10); //110us q=dq; //讀取18b20初始化信號(hào) delay_uint(20); //200us dq=1; //把總線拿高釋放總線}/*************寫18b20內(nèi)的數(shù)據(jù)***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //寫數(shù)據(jù)是低位開始 dq=0; //把總線拿低寫時(shí)間隙開始 dq=dat&0x01;//向18b20總線寫數(shù)據(jù)了 delay_uint(5); //60us dq=1; //釋放總線 dat>>=1; } }/*************讀取18b20內(nèi)的數(shù)據(jù)***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把總線拿低讀時(shí)間隙開始 value>>=1; //讀數(shù)據(jù)是低位開始 dq=1; //釋放總線 if(dq==1) //開始讀寫數(shù)據(jù) value|=0x80; delay_uint(5); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間 } returnvalue; //返回?cái)?shù)據(jù)}/*************讀取溫度的值讀出來的是小數(shù)***************/uintread_temp(){ uintvalue; ucharlow; //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0x44); //啟動(dòng)一次溫度轉(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ù) returnvalue; //返回讀出的溫度帶小數(shù)}/*************定時(shí)器0初始化程序***************/voidtime_init() { EA=1; //開總中斷 TMOD=0X01; //定時(shí)器0、定時(shí)器1工作方式1 ET0=1; //開定時(shí)器0中斷 TR0=1; //允許定時(shí)器0定時(shí)}/****************獨(dú)立按鍵處理函數(shù)************************/voidkey(){ staticucharkey_new=0,key_old=0,key_value=0; if(key_new==0) { //按鍵松開的時(shí)候做松手檢測(cè) if((P2&0x0f)==0x0f) key_value++; else key_value=0; if(key_value>=10) { write_eepom(); key_value=0; key_new=1; flag_lj_en=0; //關(guān)閉連加使能 flag_lj_3_en=0; //關(guān)閉3秒后使能 flag_value=0; //清零 } } else { if((P2&0x0f)!=0x0f) key_value++;//按鍵按下的時(shí)候 else key_value=0; if(key_value>=7) { key_value=0; key_new=0; flag_lj_en=1; //連加使能 zd_break_en=1;//自動(dòng)退出設(shè)置界使能 zd_break_value=0;//自動(dòng)退出設(shè)置界變量清零 } } key_can=20; if(key_500ms==1) { key_500ms=0; zd_break_en=1;//自動(dòng)退出設(shè)置界使能 zd_break_value=0;//自動(dòng)退出設(shè)置界變量清零 key_new=0; key_old=1; } if((key_new==0)&&(key_old==1)) { switch(P2&0x0f) { case0x0e:key_can=4;break; //得到k1鍵值 case0x0d:key_can=3;break; //得到k2鍵值 case0x0b:key_can=2;break; //得到k3鍵值 case0x07:key_can=1;break; //得到k4鍵值 } } key_old=key_new; }/****************按鍵處理數(shù)碼管顯示函數(shù)***************/voidkey_with(){ if(key_can==4) { menu_1++; if(menu_1>=3) { menu_1=0; } if(menu_1==0) { 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]; //取溫度的十位顯示 smg_i=3; } if(menu_1==1) { dis_smg[0]=smg_du[t_high%10]; //取小數(shù)顯示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_high/100%10]; //取low十位顯示 dis_smg[3]=0x89; smg_i=4; } if(menu_1==2) { dis_smg[0]=smg_du[t_low%10]; //取low小數(shù)顯示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_low/100%10]; //取十位顯示 dis_smg[3]=0xc7; smg_i=4; } } if(menu_1==1) //設(shè)置高溫報(bào)警 { if(key_can==3) { if(flag_lj_3_en==0) t_high++; //按鍵按下未松開自動(dòng)加三次 else t_high+=10; //按鍵按下未松開自動(dòng)加三次之后每次自動(dòng)加10 if(t_high>990) t_high=990; dis_smg[0]=smg_du[t_high%10]; //取小數(shù)顯示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_high/100%10]; //取十位顯示 dis_smg[3]=0x89; //H } if(key_can==1) { if(flag_lj_3_en==0) t_high--; //按鍵按下未松開自動(dòng)加三次 else t_high-=10; //按鍵按下未松開自動(dòng)減三次之后每次自動(dòng)減10 if(t_high<=t_low) t_high=t_low+1; dis_smg[0]=smg_du[t_high%10]; //取小數(shù)顯示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_high/100%10]; //取十位顯示 dis_smg[3]=0x89; //H }// write_eepom(); } if(menu_1==2) //設(shè)置低溫報(bào)警 { if(key_can==3) { if(flag_lj_3_en==0) t_low++; else t_low+=10; if(t_low>=t_high) t_low=t_high-1; dis_smg[0]=smg_du[t_low%10]; //取小數(shù)顯示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_low/100%10]; //取十位顯示 dis_smg[3]=0xc7; //L } if(key_can==1) { if(flag_lj_3_en==0) t_low--; else t_low-=10; if(t_low<=10) t_low=10; dis_smg[0]=smg_du[t_low%10]; //取小數(shù)顯示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取個(gè)位顯示 dis_smg[2]=smg_du[t_low/100%10]; //取十位顯示 dis_smg[3]=0xc7; //L }// write_eepom(); } }/****************報(bào)警函數(shù)***************/voidclock_h_l(){ if((temperature<=t_low)||(temperature>=t_high)) { flag_clock=1; } else { flag_clock=0; beep=1; } }voidmain(){ temperature=read_temp(); //先讀出溫度的值 time_init();//初始化定時(shí)器 read_eepom(); if(a_a==0xff) //新的單片機(jī)初始單片機(jī)內(nèi)問EEPOM { t_high=300; t_low=100; a_a=1; write_eepom(); } 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]; //取溫度的十位顯示 w

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論