版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 單片機課程設計</b></p><p> 課題: 數(shù)字溫度計</p><p><b> 系 別: </b></p><p> 專 業(yè) </p><p><b> 姓 名: </b></p>&l
2、t;p> 學 號: </p><p><b> 河南城建學院</b></p><p> 2012年12月28日</p><p><b> 成績評定·</b></p><p> 一、指導教師評語(根據(jù)學生設計報告質量、答辯情況及其平時表現(xiàn)綜合評定)。</p&
3、gt;<p><b> 二、評分</b></p><p><b> 課程設計成績評定</b></p><p><b> 一、設計目的及要求</b></p><p> 1、基本范圍為-50℃—110℃;</p><p> 2、精度誤差小于0.5℃;<
4、/p><p> 3、LED數(shù)碼管直讀顯示;</p><p><b> 擴展功能 :</b></p><p> 1、可以任意設定溫度上的上下限報警功能;</p><p><b> 2、實現(xiàn)語音報數(shù)。</b></p><p><b> 二、總體設計</b&g
5、t;</p><p> ?。ㄒ唬?、系統(tǒng)硬件設計方案</p><p> 根據(jù)系統(tǒng)功能要求,構造如下圖所示的系統(tǒng)原理結構框圖。</p><p> 圖1 系統(tǒng)原理結構框圖</p><p><b> 單片機的選擇</b></p><p> STC89C52RC是新一代超強抗干擾/高速/低功耗的單
6、片機,指令代碼完全兼容傳統(tǒng)8051單片機,12時鐘/機械周期和6時鐘/機械周期可以任意選擇,其內核與AT51系列單片機一樣,但是其造價較之更低,功能更強。</p><p> AT51單片機小系統(tǒng)的電路圖如下所示。</p><p> 圖1:單片機小系統(tǒng)電路</p><p><b> 1)、引腳說明</b></p><p&
7、gt; stc89c52的內核和AT51系列單片機一樣,故引腳也相同:</p><p> 1~8:I/OP1口(P1.0~P1.7);</p><p> 9: 復位腳(RST/Vpd);</p><p> 10~17:I/OP3口(P3.0=RXD,P3.1=TXD,P3.2=-INT0,P3.3=-INT1,P3.4=T0,P3.5=T1,P3.6=-W
8、R,P3.7=-RD);</p><p> 18、19:晶振(18=XTAL2,19=XTAL1);</p><p> 20: 地(Vss);</p><p> 21~28:I/OP2口(P2.0~P2.7); </p><p><b> 29:-PSEN;</b></p><p>
9、30:ALE/-PROG;</p><p> 31:-EA/Vpp</p><p> 32~39:I/OP0口(P0.7~P0.0);</p><p><b> 40:+5V電源。</b></p><p> 注:引腳功能前加“-”,說明其是低電平有效。如P3.2=-INT0。</p><p&g
10、t;<b> 2)、內部功能</b></p><p> 1. I/O 口:輸入/ 輸出口經過特殊處理,很多干擾是從I/O 進去的,每個I/O 均有對VCC/ 對GND二級管箝位保護。</p><p> 2. 電源:單片機內部的電源供電系統(tǒng)經過特殊處理,很多干擾是從電源進去的</p><p> 3. 時鐘單片機內部的時鐘電路經過特殊處理,
11、很多干擾是從時鐘部分進去的</p><p> 4 . 空閑模式:典型功耗 2mA</p><p> 5.正常工作模式:典型功耗 4mA - 7mA</p><p> 單片機內部的時鐘電路經過特殊處理,很多干擾是從時鐘部分進去的</p><p><b> 6. 復位電路</b></p><p&g
12、t; 單片機內部的復位電路經過特殊處理,很多干擾是從復位電路部分進去的,</p><p> STC89C51RC/RD+系列單片機為高電平復位。推薦外置復位電路為MAX810/STC810,STC6344,</p><p> STC6345,813L,706P;也可用R/C 復位,10uF 電容/10k 電阻,22uF/8.2k 等。</p><p> 6.
13、寬電壓,不怕電源抖動5V: 6v - 3.4v 3V: 4v - 1.9v</p><p><b> 2、溫度傳感器介紹</b></p><p> DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B2
14、0內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20可以程序設定9~12位的分辨率,精度為±0.5°C??蛇x更小的封裝方式,更寬的電壓適用范圍。分辨率設定存儲在EPROM中,掉電后依然保存。而在此,我們設定12為分辨率,即溫度分辨率0.0625℃。</p><p> DS18B20的性能特點如下:</p><
15、;p> ●獨特的單線接口僅需要一個端口引腳進行通信;</p><p> ●多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網功能;</p><p><b> ●無須外部器件;</b></p><p> ●可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b> ●零待機功耗;
16、</b></p><p> ●溫度以9或12位數(shù)字;</p><p> ●用戶可定義報警設置;</p><p> ●報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;</p><p> ●負電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p> DS18
17、B20采用3腳PR-35封裝或8腳SOIC封裝,其內部結構框圖如下圖所示。</p><p> 圖2DS18B20內部結構</p><p> 根據(jù)DS18B20的通訊協(xié)議,主機控制DS18B20完成溫度轉換必須經過三個步驟:</p><p><b> ?。?).初始化</b></p><p> (2) 執(zhí)行某個ROM
18、指令</p><p> ?。?) 執(zhí)行RAM內存指令</p><p><b> (4) 數(shù)據(jù)傳輸</b></p><p> 復位要求主CPU將數(shù)據(jù)線下拉480微秒,然后釋放,DS18B20收到信號后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。</p><p> 圖3D
19、S18B20與單片機的接口電路</p><p> 3、液晶顯示LG364BH</p><p> 液晶顯示模塊是128×64 點陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內置國標GB2312 碼簡體中文字庫(16X16 點陣)、128 個字符(8X16 點陣)及64X256 點陣顯示RAM(GDRAM)??膳cCPU 直接接口,提供兩種界面來連接微處理機:8-位并行及串行兩種
20、連接方式。</p><p><b> 三、總體設計</b></p><p><b> ?。ㄒ唬⒄w思路</b></p><p> 根據(jù)要求,我們將整個程序分為三大部分。主要包括主程序,溫度傳感程序,LG3641BH液晶顯示程序。</p><p><b> ?。ǘ⒊绦蛄鲌D</
21、b></p><p> DS18B20溫度計程序</p><p> DS18B20溫度計程序包括讀出溫度子程序,溫度轉換命令子程序,計算溫度子程序。</p><p> 主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量溫度值,溫度測量每0.5s進行一次。讀出溫度子程序的主要功能是讀出RAM中的字節(jié)。溫度轉換命令子程序主要是發(fā)溫度轉換開始
22、命令,采用12位分辯率為0.065℃,在本程序設計中采用0.5s顯示程序延時法等待轉換的完成。</p><p> DS18B20溫度計程序流程圖如下:</p><p> 圖4DS18B20溫度計程序流程圖</p><p> ?。ㄈ⒖傮w設計框圖</p><p> 溫度計電路設計總體設計方框圖如圖1所示,控制器采用單片機AT89S51,
23、A/D轉換器采用0809傳輸,溫度傳感器采用DS18B20,用3位LED數(shù)碼管以串口傳送數(shù)據(jù)實現(xiàn)溫度顯示,并用蜂鳴報警器來監(jiān)視溫度的值不超過量程范圍。</p><p><b> 圖5總體設計方框圖</b></p><p><b> 四、整體電路圖</b></p><p><b> 圖6整體電路圖</b
24、></p><p><b> 五、結論</b></p><p> 在這一學期的單片機課程中,李老師給我們講了許多單片機的內部結構,編譯語言,一直在朦朦朧朧的學習,模模糊糊的接受,即使到了考試的時候,我甚至感覺自己對單片機還是那么陌生。</p><p> 一周的課程實習,不長不短,但是又不可或缺,它似乎是對一學期的課程的潤色,把抽象變
25、為形象,讓我們突然跳出理論,開始實踐,當然是理論結合實踐,真正在做得時候,才發(fā)現(xiàn)之前學的那么少,進行課程實習的時候,我看了很多關于單片機,溫度傳感器,液晶顯示器的資料和相應的程序代碼,越看越不懂,但是越看就越想看,就感覺看到一個不懂的,去找答案,于是就剎不住車了,一個套著一個,但是雖然模糊,但是卻越想看,又一次,我看的最晚的一次是從下午一直到晚上3點多,一直沒有看表也沒有注意時間,那次我才發(fā)現(xiàn)知識那么可貴,不能說自己看懂,但是那種被知識
26、灌輸?shù)母杏X讓我很舒服。</p><p> 對于此次的課程實習,我也總結了很多我認為適合我們,起碼適合我自己的一些方法。</p><p> 要對硬件功能了解,要熟悉相應程序代碼和功能實現(xiàn),</p><p> 設計程序要有思路,根據(jù)思路才能有效進行</p><p> 編寫程序要有所根據(jù),出現(xiàn)錯誤很正常,要一步步的排查錯誤,一定要細心耐心&
27、lt;/p><p> 要懂得聽取正確意見,多和人交流,集思廣益,合作的力量是無窮大的。</p><p> 向別人講解程序時,流程圖是最好的展示。</p><p> 而我們小組正是在不斷的合作中在兩次的課題中都順利完成。當然在此感謝各位指導老師這幾周里對我們的幫助和指導。</p><p><b> 參考文獻</b>&l
28、t;/p><p> [1]楊恢先,黃輝先.單片機原理及應用(第一版) [M].北京:人民郵電出版社,2006:214-221.</p><p> [2]馬忠梅.單片機C語言程序設計 [M].北京:北航出版社,2007:36-48.</p><p> [3] 田立,田清,代方震. 51單片機C語言程序設計快速入門(第一版) [M].北京:人民郵電出版社,2007:3
29、5-40.</p><p><b> 附件1:</b></p><p> #include <AT89X52.H></p><p> #define uchar unsigned char</p><p> #define schar signed char</p><p>
30、; #define uint unsigned int</p><p> #define JDQ P2_2 //繼電器輸出</p><p> #define LEDPort P0 //LED控制口</p><p> #define LEDOneC P3_3 //LED
31、 DS1控制(百位)</p><p> #define LEDTwoC P3_2 //LED DS2控制(十位)</p><p> #define LEDThreeC P3_1 //LED DS3控制(個位)</p><p> #define LEDFourC P3_0 //固定顯示攝氏度符號<
32、;/p><p> #define DQ P2_0 //DS1820 DataPort</p><p> #define KEY_IO P1 //按鍵所連的IO口</p><p> #define NO_KEY_VALUE 0x0f //當按鍵沒有被按下時IO口的值</p><p&
33、gt; #define KEY_WOBBLE_TIME 8 //去抖動時間(待定)</p><p> #define KEY_OVER_TIME 50 //等待進入連擊時間(待定),該常數(shù)要比正常按鍵時間要長,防止非目的性進入連擊模式</p><p> #define KEY_QUICK_TIME 8 //等待按鍵抬起的連擊時間(待定)</p><
34、p> uchar TLV,THV,KeyV,Sign,SetTF,NUM,BZ,CQBZ;</p><p> uint cs,css;</p><p> schar TMV,TMHRomV,TMLRomV,TMHSetV,TMLSetV,LED_One,LED_Two,LED_Three,LED_Four;</p><p> unsigned char
35、 code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF,0x46}; //0-9的LED筆劃,0xFF為空,0xF7為負號,0x46為攝氏度符號</p><p> /*****************11us延時函數(shù)*************************/</p><p><
36、b> //</b></p><p> void delay(unsigned int time) </p><p> {while(time--);}</p><p><b> //</b></p><p> void delay_ms(unsigned int i)</p>
37、<p><b> {</b></p><p> unsigned int j;</p><p> while(i--)</p><p><b> {</b></p><p> for(j = 0; j < 125; j++);</p><p>&l
38、t;b> }</b></p><p><b> }</b></p><p> /****************DS18B20復位函數(shù)************************/</p><p> void Init_DS18B20(void)</p><p><b> {&l
39、t;/b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復位,使總線為高電平</p><p> delay(8); //稍做延時</p><p> DQ = 0; //單片機將DQ拉低(單片機將數(shù)據(jù)線下拉,發(fā)復位脈沖,脈寬最小480us,最大960us)<
40、/p><p> delay(80); //精確延時 大于 480us</p><p> DQ = 1; //釋放,拉高總線</p><p> delay(14); //延時一段時間,等待ds18b20回應低電平(15至60us左右)</p><p> x=DQ; //稍做延時后,將ds18b20的回應讀到變量x,用于判斷復
41、位是否成功,如果x=0則初始化成功 x=1則初始化失敗</p><p> delay(20); //延時一段時間結束</p><p><b> }</b></p><p><b> //</b></p><p><b> //</b></p><p&
42、gt; /****************DS18B20寫命令函數(shù)************************/</p><p> void Write_18b20_Byte(unsigned char dat)</p><p><b> {</b></p><p> unsigned char i=0;//設置位循環(huán)變量</
43、p><p> for (i=8; i>0; i--)//按位循環(huán)</p><p><b> {</b></p><p> DQ = 0;//使總線為低電平</p><p> DQ = dat&0x01;//將發(fā)送字節(jié)的最低位送到總線</p><p> delay(5);//延時
44、一段時間(30us),等待ds18b20取走總線數(shù)據(jù)</p><p> DQ = 1;//將總線拉高</p><p> dat>>=1;//將待發(fā)送的字節(jié)右移后繼續(xù)發(fā)送</p><p><b> }</b></p><p><b> delay(4);</b></p>
45、<p><b> }</b></p><p> /****************DS18B20讀1字節(jié)函數(shù)************************/</p><p> unsigned char Read_18b20_Byte(void)</p><p><b> {</b></p&g
46、t;<p> unsigned char i=0; //位循環(huán)變量</p><p> unsigned char dat = 0; //暫存變量</p><p> for (i=8;i>0;i--) //讀位循環(huán)</p><p><b> {</b></p>&
47、lt;p> DQ = 0; // 使總線電平為低電平</p><p> dat>>=1;//暫存變量右移</p><p> DQ = 1; // 給脈沖信號,使總線電平為高電平后執(zhí)行如下的讀操作</p><p> if(DQ) //如果ds18b20的輸出為高電平(總線電平為1)</p><p> dat|=0x8
48、0; //將暫存變量的最高位置1</p><p> delay(4);//延時一段時間</p><p><b> }</b></p><p> return(dat); //將暫存變量返回調用程序</p><p><b> }</b></p><p> //==
49、=============================</p><p> //配置18b20,設置上下溫度,及靈敏度</p><p> //===============================</p><p> void Config18b20()</p><p><b> {</b></p&
50、gt;<p> Init_DS18B20();</p><p> Write_18b20_Byte(0xcc); // 跳過讀序號列號的操作</p><p> Write_18b20_Byte(0x4e); //寫 EEPROM</p><p> Write_18b20_Byte(TMHSetV); //寫入上限溫度</p>&l
51、t;p> Write_18b20_Byte(TMLSetV); //下限溫度</p><p> Init_DS18B20();</p><p> Write_18b20_Byte(0xcc); // 跳過讀序號列號的操作</p><p> Write_18b20_Byte(0x48); //保存上面所設定值</p><p>
52、Init_DS18B20();</p><p> Write_18b20_Byte(0xcc); // 跳過讀序號列號的操作</p><p> Write_18b20_Byte(0xb8); //回調設定值,將rom的內容重調到RAM中</p><p><b> }</b></p><p> void Read_
53、18b20_first(void)</p><p><b> {</b></p><p> unsigned int t=0;</p><p> Init_DS18B20();</p><p> Write_18b20_Byte(0xCC); // 跳過讀序號列號的操作</p><p>
54、 Write_18b20_Byte(0x44); // 啟動溫度轉換</p><p> delay_ms(700);</p><p> Init_DS18B20();</p><p> Write_18b20_Byte(0xCC); //跳過讀序號列號的操作 </p><p> Write_18b20_Byte(0xBE); //讀取
55、溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度,依次讀取</p><p> TLV=Read_18b20_Byte();// 溫度值低位字節(jié)(其中低4位為二進制的“小數(shù)”部分最小0.0625量)</p><p> THV=Read_18b20_Byte();// 高位值高位字節(jié)(其中高5位為符號位)</p><p> TMHRomV=Read_18b20_B
56、yte();// 讀取溫度設定上限值</p><p> TMLRomV=Read_18b20_Byte();// 讀取溫度設定下限值</p><p><b> }</b></p><p> void Read_18b20_Temprature(void)</p><p><b> {</b>
57、</p><p> unsigned int t=0;</p><p> Init_DS18B20();</p><p> Write_18b20_Byte(0xCC); // 跳過讀序號列號的操作</p><p> Write_18b20_Byte(0x44); // 啟動溫度轉換</p><p> del
58、ay(200);</p><p> Init_DS18B20();</p><p> Write_18b20_Byte(0xCC); //跳過讀序號列號的操作 </p><p> Write_18b20_Byte(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度,依次讀取</p><p> TLV=Read_18
59、b20_Byte();// 溫度值低位字節(jié)(其中低4位為二進制的“小數(shù)”部分最小0.0625量)</p><p> THV=Read_18b20_Byte();// 高位值高位字節(jié)(其中高5位為符號位)</p><p> TMHRomV=Read_18b20_Byte();// 讀取溫度設定上限值</p><p> TMLRomV=Read_18b20_Byt
60、e();// 讀取溫度設定下限值</p><p><b> }</b></p><p> void display_wendu(void)//數(shù)值轉換</p><p><b> {</b></p><p> TLV = TLV >> 4; //將溫度
61、低四位移除,及去掉小數(shù)部分</p><p> THV = THV << 4;//將溫度高四位移除,及去掉符號位前四位,保留一位符號位即可,此為為0表示正,為1表示負</p><p> TMV = TLV | THV;//合并高低位放入TMV為實際溫度值</p><p> Sign = 0;//先將符號位清零</p>
62、<p> if (SetTF) //如果在設置狀態(tài)</p><p> Sign = TMLSetV >> 7; //將設置溫度值左移七位取最高位符號</p><p> else //如果不在設置狀態(tài)</p><p> Sign = TMV >>
63、 7; //就將當前溫度值左移7位取出符號位</p><p> if (Sign) //如果sign為1,表示最高位符號位為1,即表示負數(shù)</p><p><b> {</b></p><p> if (SetTF) //如果在設置狀態(tài),顯示設定值,將負數(shù)變成正數(shù)方便處理,因為18B20的負
64、溫度是用補碼表示的,即 負數(shù)=~正數(shù)+1,那么倒推過來,正數(shù)=~(負數(shù)-1)</p><p><b> {</b></p><p> LED_One = (~(TMLSetV-1)) / 100; //第一位數(shù)碼管顯示設定時的百位</p><p> LED_Two
65、= ((~(TMLSetV-1)) - LED_One * 100)/10; //第二位數(shù)碼管顯示設定時的十位</p><p> LED_Three = (~(TMLSetV-1)) - LED_One * 100 - LED_Two * 10; //第三位數(shù)碼管顯示設定時的個位</p><p><b> }</b
66、></p><p> else //如果不在設定狀態(tài)就顯示當前采集的溫度值 </p><p><b> {</b></p><p> LED_One = (~(TMV-1)) / 100; //第一位數(shù)碼管顯示正常時的百位</p>&
67、lt;p> LED_Two = ((~(TMV-1)) - LED_One * 100)/10; //第二位數(shù)碼管顯示正常時的十位</p><p> LED_Three = (~(TMV-1)) - LED_One * 100 - LED_Two * 10; //第三位數(shù)碼管顯示正常時的個位</p><p><b> }</b><
68、;/p><p><b> }</b></p><p> else //否則sign為0,表示最高位符號位為0,即表示正數(shù),一下一段注釋同上</p><p><b> { </b></p><p> if (SetTF)</p><p>
69、;<b> {</b></p><p> LED_One = (TMLSetV) / 100; </p><p> LED_Two = (TMLSetV - LED_One * 100)/10;</p><p> LED_Three = TMLSetV - LED_One * 100 - LED_Two * 10;<
70、/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> LED_One = (TMV) / 100;</p><p> LED_Two = (TMV - L
71、ED_One * 100)/10;</p><p> LED_Three = TMV - LED_One * 100 - LED_Two * 10;</p><p><b> }</b></p><p><b> }</b></p><p> //將以上數(shù)據(jù)處理的值轉換為LED字段<
72、/p><p> if (LED_One) //如果第一位數(shù)碼管顯示為1,即百位顯示1,超過了一百</p><p> LED_Two = LEDDis[LED_Two]; //十位就顯示十位的值</p><p> else //如果沒有超過一百,即只有兩位時,也有兩種情況</p><p><b> {</
73、b></p><p> LED_Two = LEDDis[LED_Two];//顯示十位</p><p><b> }</b></p><p> if (Sign) //如果為負數(shù)時</p><p> LED_One = LEDDis[11];//第一位數(shù)碼管,即百位顯示“負號”</p>
74、<p> else //如果不為負數(shù)時</p><p><b> {</b></p><p> if (LED_One == 0) //百位為0時,百位不顯示</p><p> LED_One = LEDDis[10];</p><p> else //否則顯示百
75、位</p><p> LED_One = LEDDis[LED_One];</p><p><b> }</b></p><p> LED_Three = LEDDis[LED_Three]; //各位始終就顯示個位的值</p><p> LED_Four = LEDDis[12];</p>&l
76、t;p><b> }</b></p><p> void init (void)</p><p><b> {</b></p><p><b> JDQ=1;</b></p><p> LEDPort=0xff;</p><p><
77、b> }</b></p><p> /****************************************************************************/</p><p> //文 件 名:key.c</p><p> //功 能:短擊\連擊</p><p> //調用方
78、法:unsigned char keyValue = ReadKey();</p><p> //說 明:該程序不適用于陣列鍵盤.</p><p> // 該程序不需要使用定時器.</p><p> // 調用處要加入switch語句來判斷相應按鍵按下并執(zhí)行相應動作.</p><p> //
79、 如需要在按鍵松開后執(zhí)行動作,則調用函數(shù)需要定義一個bit標志位,在default語句里判斷標志位狀態(tài).</p><p> // KEY_WOBBLE_TIME 指程序程序執(zhí)行次數(shù).實際應用中要根據(jù)程序的長短來調整成合適的數(shù)值.</p><p> // </p><p> //備 注:程序思路是當
80、按鍵被按下時開始計算程序的執(zhí)行次數(shù),如小于KEY_WOBBLE_TIME,則認為按鍵沒有被按下.</p><p> // 引用自http://www.rupeng.com/forum/thread-12239-1-1.html,略做更改. </p><p> // KEIL編譯時會提示WARNING C291: not every exit path
81、returns a value.不影響使用. </p><p> /****************************************************************************/</p><p> uchar ReadKey()</p><p> {
82、 //判斷哪個鍵被按下</p><p> static uchar lastKey = NO_KEY_VALUE ;</p><p> static uint keyCount = 0;</p><p> static uint keyOverTime = KEY_OVER_TIME;</p><p> uchar
83、keyTemp = NO_KEY_VALUE ;</p><p> keyTemp = KEY_IO & NO_KEY_VALUE ; //讀取鍵值</p><p> if(keyTemp == NO_KEY_VALUE )</p><p> { //無按鍵按下時</p><p> keyCo
84、unt = 0;</p><p> keyOverTime = KEY_OVER_TIME;</p><p><b> BZ=0;</b></p><p> return NO_KEY_VALUE ;</p><p><b> }</b></p><p><b&
85、gt; else</b></p><p> { //有按鍵按下時</p><p> if(keyTemp==lastKey)</p><p><b> {</b></p><p> if(++keyCount == KEY_WOBBLE
86、_TIME) //不是第1次按下判斷抖動是否結束</p><p><b> { </b></p><p> return keyTemp; //去抖結束,返回鍵值 //短按時,將標志置0,說明在短按,閃爍</p><p><b> }</b></p><
87、;p><b> else</b></p><p><b> {</b></p><p> if(keyCount>keyOverTime)</p><p><b> {</b></p><p> keyCount = 0;</p><p
88、> keyOverTime = KEY_QUICK_TIME;</p><p> BZ=1;//長按將標志置1,不閃爍</p><p><b> }</b></p><p> return NO_KEY_VALUE ;</p><p><b> }</b></p>
89、;<p><b> }</b></p><p> else //是第1次按下則保存鍵值,下次執(zhí)行此函數(shù)時與讀到的鍵值作比較</p><p><b> { </b></p><p> lastKey = keyTemp ; //保存第1次讀到的鍵值</p>&l
90、t;p> keyCount = 0; //延時計數(shù)器清零</p><p> keyOverTime = KEY_OVER_TIME ;</p><p> return NO_KEY_VALUE ; </p><p><b> }</b></p><p><b> }<
91、/b></p><p><b> }</b></p><p> ///////////////////////////////////////////////////////////////////////////////////</p><p> void main()</p><p><b>
92、 {</b></p><p><b> init();</b></p><p> Read_18b20_first(); //先讀一次溫度,避開85度</p><p> TMHSetV=TMHRomV;</p><p> TMLSetV=TMLRomV;</p><p> C
93、onfig18b20();</p><p><b> SetTF=0;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p><b> NUM++;</b></p><
94、p> if(NUM==40)</p><p><b> {</b></p><p><b> NUM=0;</b></p><p><b> }</b></p><p> KeyV=ReadKey();</p><p> if(KeyV
95、==0x0e)</p><p><b> {</b></p><p> SetTF=~SetTF;</p><p><b> cs=0;</b></p><p><b> }</b></p><p><b> if(SetTF)<
96、;/b></p><p><b> {</b></p><p> if(KeyV==0x0d)</p><p><b> {</b></p><p><b> cs=0;</b></p><p> TMLSetV=TMLSetV+1;&l
97、t;/p><p> TMHSetV=TMLSetV+2;</p><p><b> }</b></p><p> if(KeyV==0x0b)</p><p><b> {</b></p><p><b> cs=0;</b></p>
98、<p> TMLSetV=TMLSetV-1;</p><p> TMHSetV=TMLSetV+2;</p><p><b> }</b></p><p> if(TMLSetV>=60)</p><p><b> {</b></p><p>
99、 TMLSetV=60;</p><p><b> }</b></p><p> if(TMLSetV<=-20)</p><p><b> {</b></p><p> TMLSetV=-20;</p><p><b> }</b>&l
100、t;/p><p><b> cs++;</b></p><p> if(cs>200)</p><p><b> {</b></p><p><b> cs=0;</b></p><p><b> SetTF=0;</b>
101、;</p><p> Config18b20();</p><p><b> }</b></p><p><b> }</b></p><p> Read_18b20_Temprature();//讀出溫度高低位THV、TLV及溫度限制TMRomV</p><p>
102、 display_wendu();</p><p><b> if(SetTF)</b></p><p><b> {</b></p><p> if(!BZ) //短按下閃爍</p><p><b> {</b></p><p> if(
103、NUM<20)</p><p><b> {</b></p><p> LEDPort=0xff;</p><p><b> }</b></p><p> else if(20<NUM<40)</p><p><b> {<
104、/b></p><p> LEDPort = LED_One;</p><p> LEDOneC = 0;</p><p> delay(300);</p><p> LEDOneC = 1; //顯示百位數(shù)</p><p> LEDPort = LED_Two;</p><p
105、> LEDTwoC = 0;</p><p> delay(300);</p><p> LEDTwoC = 1; //顯示十位數(shù)</p><p> LEDPort = LED_Three;</p><p> LEDThreeC = 0;</p><p> delay(300);</p&g
106、t;<p> LEDThreeC = 1; //顯示個位數(shù)</p><p> LEDPort = LED_Four;</p><p> LEDFourC=0;</p><p> delay(300);</p><p> LEDFourC=1;</p><p><b> }<
107、;/b></p><p><b> }</b></p><p> else //長按不閃爍</p><p><b> {</b></p><p> LEDPort = LED_One;</p><p> LEDOneC = 0;</p>&
108、lt;p> delay(300);</p><p> LEDOneC = 1; //顯示百位數(shù)</p><p> LEDPort = LED_Two;</p><p> LEDTwoC = 0;</p><p> delay(300);</p><p> LEDTwoC = 1; //顯示
109、十位數(shù)</p><p> LEDPort = LED_Three;</p><p> LEDThreeC = 0;</p><p> delay(300);</p><p> LEDThreeC = 1; //顯示個位數(shù)</p><p> LEDPort = LED_Four;</p>&
110、lt;p> LEDFourC=0;</p><p> delay(300);</p><p> LEDFourC=1;</p><p><b> }</b></p><p><b> }</b></p><p> if(!SetTF)</p>
111、<p><b> {</b></p><p> LEDPort = LED_One;</p><p> LEDOneC = 0;</p><p> delay(300);</p><p> LEDOneC = 1; //顯示百位數(shù)</p><p> LEDPort =
112、LED_Two;</p><p> LEDTwoC = 0;</p><p> delay(300);</p><p> LEDTwoC = 1; //顯示十位數(shù)</p><p> LEDPort = LED_Three;</p><p> LEDThreeC = 0;</p><p
113、> delay(300);</p><p> LEDThreeC = 1; //顯示個位數(shù)</p><p> LEDPort = LED_Four;</p><p> LEDFourC=0;</p><p> delay(300);</p><p> LEDFourC=1;</p>
114、<p><b> }</b></p><p> if(!SetTF)</p><p><b> {</b></p><p> if (TMV <= TMLSetV) //根據(jù)采集到的溫度值控制繼電器</p><p><b> {</b></
115、p><p> JDQ = 1; //壓縮機停止</p><p> CQBZ = 1; //重啟標志位置1</p><p><b> }</b></p><p> if((TMLSetV < TMV < TMHSetV)&&(CQBZ == 1))</p><p&
116、gt;<b> {</b></p><p> JDQ = 1; //壓縮機保持</p><p><b> }</b></p><p> if((TMLSetV < TMV < TMHSetV)&&(CQBZ == 0))</p><p><b>
117、 {</b></p><p> JDQ = 0; //壓縮機重啟</p><p><b> }</b></p><p> if (TMV >= TMHSetV) //根據(jù)采集到的溫度值控制繼電器</p><p><b> {</b></p>&l
118、t;p> JDQ = 0; //壓縮機停止</p><p> CQBZ = 0; //重啟標志位置1</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計--數(shù)字溫度計
- 單片機課程設計-數(shù)字溫度計
- 單片機課程設計—數(shù)字溫度計
- 單片機數(shù)字溫度計課程設計
- 單片機課程設計---數(shù)字溫度計
- 單片機課程設計-數(shù)字溫度計
- 單片機課程設計—數(shù)字溫度計
- 單片機課程設計——數(shù)字溫度計
- 單片機課程設計—數(shù)字溫度計
- 單片機課程設計-數(shù)字溫度計
- 數(shù)字溫度計--單片機課程設計
- 數(shù)字溫度計課程設計---基于51單片機數(shù)字溫度計設計
- 單片機課程設計--數(shù)字溫度計設計
- 單片機課程設計--數(shù)字溫度計設計
- 溫度計課程設計---基于51單片機數(shù)字溫度計設計
- 單片機課程設計---單片機數(shù)字顯示溫度計
- 數(shù)字溫度計課程設計---基于51單片機數(shù)字溫度計設計
- 單片機課程設計數(shù)字溫度計
- 單片機課程設計報告--數(shù)字溫度計
- 單片機課程設計報告數(shù)字溫度計
評論
0/150
提交評論