版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 基于52單片機——</b></p><p><b> 數字電子鐘課程設計</b></p><p> 題 目: 數字電子鐘 </p><p> 院 (系): 電氣與控制工程學院 </p><p> 專 業(yè):
2、 自動化 </p><p> 學生姓名: </p><p> 指導教師: </p><p><b> 摘 要</b></p><p> 單片機自20世紀70年代問世以來,以其極高的性能價格比,受
3、到人們的重視和關注,應用很廣、發(fā)展很快。單片機體積小、重量輕、抗干擾能力強、環(huán)境要求不高、價格低廉、可靠性高、靈活性好、開發(fā)較為容易。由于具有上述優(yōu)點,在我國,單片機已廣泛地應用在工業(yè)自動化控制、自動檢測、智能儀器儀表、家用電器、電力電子、機電一體化設備等各個方面。本設計采用LCD液晶屏幕顯示系統(tǒng),以AT89C52單片機為核心,由鍵盤、溫度采集、定時鬧鈴、日期提醒等功能模塊組成?;陬}目基本要求,本系統(tǒng)對時間顯示、鬧鈴方式進和溫度采集系
4、統(tǒng)行了重點設計。本系統(tǒng)大部分功能由軟件來實現,吸收了硬件軟件化的思想,大部分功能通過軟件來實現,使電路簡單明了,系統(tǒng)穩(wěn)定性大大提高。本系統(tǒng)不僅成功的實現了要求的基本功能,多數發(fā)揮部分也得到了實現,而且還具有一定的創(chuàng)新功能。</p><p> 關鍵字:單片機、 LCD液晶顯示;溫度采集;定時鬧鈴</p><p><b> 目 錄</b></p>
5、<p><b> 摘 要2</b></p><p><b> 前 言3</b></p><p><b> 1設計方案4</b></p><p> 1.1 顯示模塊4</p><p> 1.2 溫度模塊4</p><p
6、> 1.3 鍵盤模塊4</p><p> 1.4 時鐘模塊5</p><p><b> 1.5其他模塊5</b></p><p><b> 2總體框架5</b></p><p><b> 3硬件電路5</b></p><p>
7、 3.1單片機最小系統(tǒng):6</p><p> 3.2溫度測量模塊:7</p><p> 3.3 LCD液晶顯示模塊:7</p><p> 3.4整體電路圖8</p><p> 4系統(tǒng)軟件設計流程9</p><p> 4.1主程序流程8</p><p> 4.2 溫度測量流
8、程圖10</p><p> 4.3鍵值處理流程10</p><p> 4.3處理事件流程11</p><p><b> 5程序代碼12</b></p><p><b> 6 元件清單13</b></p><p><b> 7 心得體會14<
9、;/b></p><p><b> 附程序15</b></p><p><b> 參考文獻30</b></p><p><b> 前言</b></p><p> 時鐘,自從它發(fā)明的那天起,就成為人類的朋友,但隨著時間的推移,科學技術的不斷發(fā)展,人們對時間計量的
10、精度要求越來越高,應用越來越廣。怎樣讓時鐘更好的為人民服務,怎樣讓我們的老朋友煥發(fā)青春呢?這就要求人們不斷設計出新型時鐘。</p><p> 現今,高精度的計時工具大多數都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技術,因此走時精度高,穩(wěn)定性好,使用方便,不需要經常調校,數字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具
11、有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。</p><p> 時鐘電路在計算機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎。在一個單片機應用系統(tǒng)中,時鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢;二是指系統(tǒng)的標準定時時鐘,即定時時間,它通常有兩種實現方法:一是用軟件實現,即用單片機內部的可編程定時
12、/計數器來實現,但誤差很大,主要用在對時間精度要求不高的場合;二是用專門的時鐘芯片實現,在對時間精度要求很高的情況下,通常采用這種方法,典型的時鐘芯片有:DS1302,DS12887,X1203等都可以滿足高精度的要求。</p><p> 本文主要介紹用單片機內部的定時/計數器來實現電子時鐘的方法,本設計由單片機AT89S51芯片和LED數碼管為核心,輔以必要的電路,構成了一個單片機電子時鐘。</p>
13、;<p><b> 1設計方案</b></p><p><b> 1.1 顯示模塊</b></p><p> 顯示模塊采用Lcd1602。Lcd1602液晶顯示具有豐富多樣性、靈活性、電路簡單、易于控制而且功耗小等優(yōu)點,對于信息量多的系統(tǒng),是比較適合的。1602液晶模塊內部的字符發(fā)生存儲器(CGROM)已經存儲了160個不同的
14、點陣字符圖形,這些字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。</p><p> 因為1602識別的是ASCII碼,試驗可以用ASCII碼直接賦值,在單片機編程中還可以用字符型常量或變量賦值,如'A’。 </p>
15、;<p><b> 1.2 溫度模塊</b></p><p> 溫度模塊采用DS18B20,其獨特的一線接口,只需要一條口線通信多點能力,簡化了分布式溫度傳感應用 無需外部元件 可用數據總線供電,電壓范圍為3.0 V至5.5 V 無需備用電源 測量溫度范圍為-55 ° C至+125 ℃ 。華氏相當于是-67 ° F到257華氏度 -10 ° C
16、至+85 ° C范圍內精度為±0.5 ° 。</p><p> 溫度傳感器可編程的分辨率為9~12位 溫度轉換為12位數字格式最大值為750毫秒,用戶可定義的非易失性溫度報警設置。應用范圍包括恒溫控制,工業(yè)系統(tǒng),消費電子產品溫度計,或任何熱敏感系統(tǒng)。</p><p> DS18B20的數字溫度計提供9至12位(可編程設備溫度讀數。信息被發(fā)送到/從DS18B
17、20 通過1線接口,所以中央微處理器與DS18B20只有一個一條口線連接。為讀寫以及溫度轉換可以從數據線本身獲得能量,不需要外接電源。 因為每一個DS18B20的包含一個獨特的序號,多個DS18B20可以同時存在于一條總線。這使得溫度傳感器放置在許多不同的地方。它的用途很多,包括空調環(huán)境控制,感測建筑物內溫設備或機器,并進行過程監(jiān)測和控制。</p><p><b> 1.3 鍵盤模塊</b&g
18、t;</p><p> 鍵盤模塊采用4×4矩陣鍵盤。在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P2口)就可以構成4×4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區(qū)別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(
19、9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。</p><p><b> 1.4時鐘模塊</b></p><p> 時鐘模塊采用定時器0提供時鐘源。定時/計數器0可以工作在4種工作方式中。工作方式0是13位的計數器;工作方式1是16位的計數器;工作方式2帶有數據自動重裝的功能,因此,定時更精確。經常用于波特率發(fā)生器。;工作方式3是將它當做兩個
20、8位的定時器來用。主要與另一個定時器工作于方式2時配套使用。為了方便處理和提高精度采用方式2。但要提供秒信號還需要一個計數器來記錄中斷的次數以產生秒信號。</p><p><b> 1.5其他模塊</b></p><p> 程序提供校時功能,通過4×4矩陣鍵盤校時,鍵盤功能鍵(即鍵值大于9的6個鍵)和鍵盤的數字鍵(即鍵值為0~9的9個鍵)來校時。<
21、/p><p> 程序可以通過設定的時間計算出當天是星期幾。并在Lcd1602的左上角顯示出來。程序日期模塊的年份區(qū)間為2000年到2099年一百年的時間。</p><p><b> 2總體框架</b></p><p><b> 圖1總體框架</b></p><p><b> 3硬件電路
22、</b></p><p> 3.1單片機最小系統(tǒng):</p><p> 最小系統(tǒng)包括晶體振蕩電路、復位開關和電源部分。圖2為AT89C52單片機的最小系統(tǒng)。MCS-51是標準的40引腳雙列直插式集成電路芯片,引腳分布請參照----單片機引腳圖:</p><p> l P0.0~P0.7 P0口8位雙向口線(在引腳的39~32號端子)。 </p&
23、gt;<p> l P1.0~P1.7 P1口8位雙向口線(在引腳的1~8號端子)。</p><p> l P2.0~P2.7 P2口8位雙向口線(在引腳的21~28號端子)。 </p><p> l P3.0~P3.7 P3口8位雙向口線(在引腳的10~17號端子)。</p><p> P0做一般的I/O使用,但內部無上拉電阻,作為輸入或
24、輸出時應在外部接上拉電阻。 P1口只做I/O口使用:其內部有上拉電阻。P3 除了作為I/O使用外(其內部有上拉電阻),還有一些特殊功能,由特殊寄存器來設置2 </p><p> 圖2 最小系統(tǒng)電路圖</p><p><b> 程序下載接口</b></p><p><b> 圖3-4</b></p>&l
25、t;p> 如圖3-4所示,由AT89S ISP構成的兩排十針下載口,板圖上有一個小方框,為1號引角;下載線的凸口為正方向,凸口的右側邊的第一個插孔為1號引角。</p><p> 3.2溫度測量模塊:</p><p> 溫度測量傳感器采用DALLAS公司DS18B20的單總線數字化溫度傳感器,測溫范圍為-55℃~125℃,可編程為9位~12位A/D轉換精度,測溫分辨率達到0.06
26、25℃,采用寄生電源工作方式,CPU只需一根口線便能與DS18B20通信,占用CPU口線少,可節(jié)省大量引線和邏輯電路。接口電路如圖3所示。</p><p> 圖3 DS18B20測量電路</p><p> 3.3. LCD液晶顯示模塊:</p><p> LCD液晶顯示模塊采用LCD1602型號,具有很低的功耗,正常工作時電流僅2.0mA/5.0V。通過編
27、程實現自動關閉屏幕能夠更有效的降低功耗。LCD1602分兩行顯示,每行可顯示多達16個字符。LCD1602液晶模塊內部的字符發(fā)生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,通過內部指令可實現對其顯示多樣的控制,并且還能利用空余的空間自定義字符。</p><p> 3.4. 整體電路圖</p><p><b> 4系統(tǒng)軟件設計流程</b></p&
28、gt;<p><b> 4.1主程序流程</b></p><p><b> 否</b></p><p><b> 是</b></p><p> 圖7 系統(tǒng)主程序流程</p><p> 4.2. 溫度測量流程圖如圖11所示:</p><
29、p> 圖11 溫度測量程序流程圖</p><p><b> 、</b></p><p><b> 4.3鍵值處理流程</b></p><p><b> 否</b></p><p><b> 是</b></p><p>
30、;<b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><
31、b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p> 圖9 鍵值處理
32、流程圖</p><p> 4.4 處理事件流程圖</p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p>
33、<p><b> 是</b></p><p><b> 否</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><
34、p><b> 是</b></p><p> 圖8 溫度測量流程圖</p><p><b> 5程序代碼</b></p><p><b> 主程序代碼</b></p><p> 5#include"Feiyun.h"</p>&l
35、t;p> uchar sws=3;</p><p> void Init()</p><p><b> {</b></p><p> LcdInit();</p><p> TimeDateInit();</p><p> TimerInit();</p><
36、;p><b> }</b></p><p> void KeyPro()</p><p><b> {</b></p><p><b> KEY temp;</b></p><p> ReadKey(&temp);</p><p&g
37、t; if(temp.c_key==0x0a)</p><p> cls,sws=1;</p><p> if(temp.c_key==0x0b)</p><p> cls,sws=2;</p><p> if(temp.c_key==0x0c)</p><p> Set(0x08);</p>
38、<p> if(temp.c_key==0x0d)</p><p> Set(0x47);</p><p> if(temp.c_key==0x0e)</p><p><b> sws=3;</b></p><p> if(temp.c_key==0x0f)</p><p>
39、<b> sws=0;</b></p><p><b> }</b></p><p> void MsgPro()</p><p><b> {</b></p><p> if(timer.iscg&0xf0) </p><p>&l
40、t;b> {</b></p><p> timer.iscg&=0x0f;</p><p><b> DateCg();</b></p><p> if(sws==0)</p><p><b> {</b></p><p> BuzzCl
41、ose;</p><p> TimeShow();</p><p> DateShow();</p><p><b> }</b></p><p> else if(sws==1)</p><p><b> { </b></p><p&g
42、t; TempShow();</p><p><b> }</b></p><p> else if(sws==2)</p><p><b> {</b></p><p> AlarmClock();</p><p><b> }</b>&l
43、t;/p><p> else if(sws==3)</p><p><b> {</b></p><p> TimeShow();</p><p> DateShow();</p><p> if(CheckTime())</p><p><b> Bu
44、zzOpen;</b></p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> {&l
45、t;/b></p><p><b> Init();</b></p><p><b> while(1)</b></p><p><b> {</b></p><p><b> MsgPro();</b></p><p&g
46、t; if(KeyDown) </p><p> KeyPro(); </p><p><b> } </b></p><p><b> }</b></p><p><b> 6 元件清單</b></p><p><b>
47、; 7 心得體會</b></p><p> 王慧 自動化1002班 1006050203</p><p> 這次課程設計里我學到了很多在書本上所沒有學到過的知識。以前在上課的時候,老師經常強調在寫一個程序的時候,一定要事先把程序原理方框圖化出來,但是我開始總覺得這樣做沒必要,很浪費時間。但是,這次課程設計完全改變了我以前的那種錯誤的認識,以前我接觸的那些程序
48、都是很短、很基礎的,但是在課程設計中碰到的那些需要很多代碼才能完成的任務,畫程序方框圖是很有必要的。因為通過程序方框圖,在做設計的過程中,我們每一步要做什么,每一步要完成什么任務都有一個很清楚的思路,而且在程序測試的過程中也有利于查錯。</p><p> 其次,以前對于編程工具的使用還處于一知半解的狀態(tài)上,但是經過一段上機的實踐,對于怎么去排錯、查錯,怎么去看每一步的運行結果,怎么去了解每個寄存器的內容以確保程
49、序的正確性上都有了很大程度的提高。</p><p> 通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現了自己的不足之處,對以前所學過的知識理解得不夠深
50、刻,掌握得不夠牢固。</p><p> 邵云杰 自動化1002班 1006050208</p><p> 回顧起此課程設計,至今我仍感慨頗多,從理論到實踐,在這段日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不
51、夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。,課程設計的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。實驗過程中,也對團隊精神的進行了考察,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結就是力量,只有互相之間默契融洽的配合才能換來最終完美的結果。</p><p> 此次設計也讓我明白了思路即出路
52、,有什么不懂不明白的地方要及時請教或上網查詢,只要認真鉆研,動腦思考,動手實踐,就沒有弄不懂的知識,收獲頗豐。</p><p> 徐銑蔚 自動化1001班 1006050102</p><p> 兩周的課程設計結束了,在這次的課程設計中不僅檢驗了我所學習的知識,也培養(yǎng)了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在設計過程中,與同學分工設計,和同學們相
53、互探討,相互學習,相互監(jiān)督。學會了合作,學會了運籌帷幄,學會了寬容,學會了理解,也學會了做人與處世。 課程設計是我們專業(yè)課程知識綜合應用的實踐訓練,著是我們邁向社會,從事職業(yè)工作前一個必不少的過程.”千里之行始于足下”,通過這次課程設計,我深深體會到這句千古名言的真正含義.我今天認真的進行課程設計,學會腳踏實地邁開這一步,就是為明天能穩(wěn)健地在社會大潮中奔跑打下堅實的基礎。 通過這次單片機數字電子鐘設計,我在多方面都有所提
54、高,綜合運用本專業(yè)所學課程的理論和生產實際知識進行一次數字電子鐘的設計設計工作的實際訓練從而培養(yǎng)和提高獨立工作能力,鞏固與擴充了課程所學的內容,掌握設計的方法和步驟,掌握設計的基本的技能,同時各科相關的課程都有了全面的復習,獨立思考的能力也有了提高。在這次設計過程中,體現出設計電路的能力以及綜合運用知識的能力,體會了學以致用、突出勞動成果的喜悅心情,從中發(fā)現自己平時學習的不足和薄弱環(huán)</p><p> 1、時間
55、日期的設置初始化</p><p> #include"Feiyun.h"</p><p> uchar hour=0;</p><p> uchar min=0;</p><p> uchar sec=0;</p><p> uchar year=0;</p><p&g
56、t; uchar month=0;</p><p> uchar day=0;</p><p> uchar ahour=0;</p><p> uchar amin=0;</p><p> void TimeDateInit() //時間和日期的初始化</p><p><b> {</b
57、></p><p><b> year=11;</b></p><p><b> month=6;</b></p><p><b> day=19;</b></p><p><b> hour=23;</b></p><p
58、><b> min=0;</b></p><p><b> sec=0;</b></p><p><b> ahour=23;</b></p><p><b> amin=1;</b></p><p><b> }</b&g
59、t;</p><p> uchar isleep(y)</p><p><b> {</b></p><p> return !(y%4);</p><p><b> }</b></p><p> uchar GetMDM(y,m)</p><p
60、><b> {</b></p><p> uchar mon[]={31,28,31,30,31,30,31,31,30,31,30,31};</p><p><b> if(m==2) </b></p><p> return mon[1]+isleep(y);</p><p>&l
61、t;b> else </b></p><p> return mon[m-1];</p><p><b> }</b></p><p> uint GetMDY(y)</p><p><b> {</b></p><p> if(isle
62、ep(y))</p><p> return 366;</p><p><b> else </b></p><p> return 365;</p><p><b> }</b></p><p> uchar GetWeek()</p><p&
63、gt;<b> {</b></p><p> uint num=0;</p><p> uchar i,week;</p><p> for(i=1;i<year;i++)</p><p> num+=GetMDY(i);</p><p> for(i=1;i<month;
64、i++)</p><p> num+=GetMDM(year,i);</p><p> num+=day; </p><p> week=num%7;</p><p> return week; </p><p><b> }</b></p><p>
65、void DateCg()</p><p><b> {</b></p><p> if(hour==24)</p><p> hour=0,day++;</p><p> if(day>GetMDM(year,month))</p><p> day=1,month++;<
66、/p><p> if(month>12)</p><p> month=1,year++;</p><p><b> }</b></p><p> void TimeCg() //時間模塊</p><p><b> {</b><
67、/p><p><b> sec++;</b></p><p> if(sec==60)</p><p> sec=0,min++;</p><p> if(min==60)</p><p> min=0,hour++; </p><p><b> }&l
68、t;/b></p><p> String TimetoStr() </p><p><b> {</b></p><p> uchar time[6];</p><p> uchar buf[6];</p><p><b> uchar i;</b&g
69、t;</p><p> time[0]=hour/10-1+'1';</p><p> time[1]=hour%10-1+'1';</p><p> time[2]=min/10-1+'1';</p><p> time[3]=min%10-1+'1';</p&g
70、t;<p> time[4]=sec/10-1+'1';</p><p> time[5]=sec%10-1+'1';</p><p> for(i=0;i<6;i++)</p><p> buf[i]=time[i];</p><p> return buf;</p>
71、<p><b> }</b></p><p> void TimeShow() //用LCD1602顯示時間 </p><p><b> {</b></p><p> String time;</p><p> time=TimetoStr();<
72、/p><p> LcdStr(0x04,"Time");</p><p> LcdData(0x08,hour);</p><p> LcdChar(0x0a,'-');</p><p> LcdData(0x0b,min);</p><p> LcdChar(0x0d,
73、9;-');</p><p> LcdData(0x0e,sec);</p><p><b> }</b></p><p> String DatetoStr() //日期模塊</p><p><b> {</b></p><p> uchar Dat
74、e[6];</p><p> uchar buf[6];</p><p><b> uchar i;</b></p><p> Date[0]=year/10+'1'-1;</p><p> Date[1]=year%10+'1'-1;</p><p>
75、Date[2]=month/10+'1'-1;</p><p> Date[3]=month%10+'1'-1;</p><p> Date[4]=day/10+'1'-1;</p><p> Date[5]=day%10+'1'-1;</p><p> for(i=0;
76、i<6;i++)</p><p> buf[i]=Date[i];</p><p> return buf;</p><p> }</p><p> void WeekShow()</p><p><b> {</b></p><p>
77、uchar wk[]="Sun Mon Tue Wed Thu Fri Sat Erro";</p><p> uchar D[]="Date 20";</p><p> uchar week=0;</p><p><b> uchar i;</b></p><p><
78、;b> pd(0x00);</b></p><p> week=GetWeek();</p><p> for(i=0;i<4;i++)</p><p> write_data(wk[week*4+i]);</p><p><b> pd(0x40);</b></p>&l
79、t;p> for(i=0;i<7;i++)</p><p> write_data(D[i]);</p><p><b> }</b></p><p> void DateShow()</p><p><b> {</b></p><p> Strin
80、g date;</p><p> WeekShow();</p><p> date=DatetoStr();</p><p> write_data(date[0]);</p><p> write_data(date[1]);</p><p> write_data('-');</p
81、><p> write_data(date[2]);</p><p> write_data(date[3]);</p><p> write_data('-');</p><p> write_data(date[4]);</p><p> write_data(date[5]);</p&
82、gt;<p><b> pd(0x50);</b></p><p><b> }</b></p><p> void Loadbuf(uchar p,String buf)</p><p><b> {</b></p><p> if(p==0x08)&
83、lt;/p><p><b> {</b></p><p> buf[0]=hour/10;</p><p> buf[1]=hour%10;</p><p> buf[2]=min/10;</p><p> buf[3]=min%10;</p><p> buf[4
84、]=sec/10;</p><p> buf[5]=sec%10;</p><p><b> }</b></p><p> if(p==0x47)</p><p><b> {</b></p><p> buf[0]=year/10;</p><
85、p> buf[1]=year%10;</p><p> buf[2]=month/10;</p><p> buf[3]=month%10;</p><p> buf[4]=day/10;</p><p> buf[5]=day%10;</p><p><b> }</b>&l
86、t;/p><p><b> }</b></p><p> void Save(uchar p,String buf)</p><p><b> {</b></p><p> if(p==0x08)</p><p><b> {</b></p&
87、gt;<p> hour=buf[0]*10+buf[1];</p><p> min=buf[2]*10+buf[3];</p><p> sec=buf[4]*10+buf[5];</p><p><b> }</b></p><p> if(p==0x47)</p><p
88、><b> {</b></p><p> year=buf[0]*10+buf[1];</p><p> month=buf[2]*10+buf[3];</p><p> day=buf[4]*10+buf[5];</p><p><b> }</b></p><
89、p><b> }</b></p><p> void Set(uchar p)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar tmp[8]={0,1,1,2,3,3,4,5};</p><p>
90、uchar imr[8]={1,3,4,4,6,6,7,0};</p><p> uchar iml[8]={7,0,1,1,3,4,4,6};</p><p> uchar buf[6]={0,0,0,0,0,0};</p><p> uchar dat=0x10; </p><p> Loadbuf(p,buf);
91、 </p><p> while((dat!=0x0f)&&(dat!=0x0e))</p><p><b> {</b></p><p> if(KeyDown) dat=scankey();</p><p> if(dat<0x10)</p><p><
92、b> {</b></p><p> if(dat<0x0a)</p><p><b> {</b></p><p> buf[tmp[i]]=dat;</p><p> write_data(buf[tmp[i]]+'1'-1);</p><p>
93、<b> dat=0x10;</b></p><p><b> i=imr[i];</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p&
94、gt;<p> switch (dat)</p><p><b> {</b></p><p><b> case 12:</b></p><p><b> {</b></p><p><b> dat=0x10;</b></
95、p><p><b> i=iml[i];</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 13:{</b></p><p><b>
96、dat=0x10;</b></p><p><b> i=imr[i];</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 14:</b></p>
97、;<p><b> { </b></p><p> Save(p,buf);</p><p><b> break;</b></p><p><b> }</b></p><p> case 15:break; </p><p>
98、<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> pd(p+i);</b></p><p><b> }</b></p><p&g
99、t; pd(0x50); </p><p><b> }</b></p><p> void setahour()</p><p><b> {</b></p><p> uchar dat=0xff,state;</p><p><b> pd(0
100、x45);</b></p><p> while(dat!=0x0e) </p><p><b> { </b></p><p> if(dat<0x10)</p><p><b> {</b></p><p> if(state==0)</
101、p><p><b> {</b></p><p><b> state++;</b></p><p> ahour=ahour%10;</p><p> ahour=ahour+dat*10;</p><p> LcdData(0x45,ahour);</p>
102、;<p><b> pd(0x46);</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> state=0;</b
103、></p><p> ahour=ahour/10;</p><p> ahour=ahour*10;</p><p> ahour=ahour+dat;</p><p> LcdData(0x45,ahour);</p><p><b> pd(0x45);</b></p&
104、gt;<p><b> }</b></p><p><b> }</b></p><p> if(KeyDown) dat=scankey();</p><p> else dat=0xff;</p><p><b> } </b></p>
105、<p><b> pd(0x50);</b></p><p><b> }</b></p><p> void setamin()</p><p><b> {</b></p><p> uchar dat=0xff,state;</p>
106、<p><b> pd(0x4c);</b></p><p> while(dat!=0x0e) </p><p><b> {</b></p><p> if(dat<0x10)</p><p><b> {</b></p><p
107、> if(state==0)</p><p><b> {</b></p><p><b> state++;</b></p><p> amin=amin%10;</p><p> amin=amin+dat*10;</p><p> LcdData(0x
108、4c,amin);</p><p><b> pd(0x4d);</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b&g
109、t; state=0;</b></p><p> amin=amin/10;</p><p> amin=amin*10;</p><p> amin=amin+dat;</p><p> LcdData(0x4c,amin);</p><p><b> pd(0x4c);</b
110、></p><p><b> }</b></p><p><b> }</b></p><p> if(KeyDown) dat=scankey();</p><p> else dat=0xff;</p><p><b> } </b>
111、;</p><p><b> pd(0x50);</b></p><p><b> }</b></p><p> void AlarmClock()</p><p><b> {</b></p><p> uchar dat;</p>
112、;<p> LcdStr(0x00,"The Alarm Clock:");</p><p> LcdStr(0x40,"Hour");</p><p> LcdData(0x45,ahour);</p><p> LcdStr(0x48,"Min");</p><
113、p> LcdData(0x4c,amin);</p><p> while((dat!=0x0f)&&(dat!=0x0e))</p><p><b> {</b></p><p> if(KeyDown) dat=scankey();</p><p> else dat=0xff;<
114、;/p><p> if(dat==0x0c) setahour();</p><p> if(dat==0x0d) setamin(); </p><p><b> }</b></p><p><b> }</b></p><p> uchar CheckTime()&
115、lt;/p><p><b> {</b></p><p> if(hour==ahour&&min==amin)</p><p><b> return 1;</b></p><p> else return 0;</p><p><b> }
116、</b></p><p> 2、溫度傳感器的復位延時</p><p> #include "Feiyun.h" </p><p> uint temp=270; </p><p> void delay_us(uint t) ////延時函數</p><p><
117、;b> {</b></p><p> for(;t>0;t--);</p><p><b> } </b></p><p> void reset(void) ////DS18B20復位函數 </p><p><b> {</b></p
118、><p> uchar state=1;</p><p> while(state)</p><p><b> {</b></p><p> while(state)</p><p><b> {</b></p><p><b> D
119、Q=1;</b></p><p> _nop_();_nop_();</p><p><b> DQ=0;</b></p><p> delay_us(50);</p><p><b> DQ=1;</b></p><p> delay_us(6);&l
120、t;/p><p><b> state=DQ;</b></p><p><b> }</b></p><p> delay_us(45);</p><p> state=~DQ;</p><p><b> }</b></p><
121、p><b> DQ=1;</b></p><p><b> }</b></p><p> void write_byte(uchar val)//寫一個字節(jié) </p><p><b> {</b></p><p><b> uchar i;</
122、b></p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> DQ=1;_nop_();_nop_();</p><p> DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();</p><p&
123、gt; DQ=val&0x01;</p><p> delay_us(6);</p><p> val=val/2;</p><p><b> }</b></p><p><b> DQ=1;</b></p><p><b> _nop_();&
124、lt;/b></p><p><b> } </b></p><p> uchar read_byte(void) ///////讀一個字節(jié)</p><p><b> {</b></p><p><b> uchar i;</b></p>
125、<p> uchar value=0;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> DQ=1;_nop_();_nop_();</p><p> value>>=1;</p><p><
126、b> DQ=0;</b></p><p> _nop_();_nop_();_nop_();_nop_();</p><p> DQ=1;_nop_();_nop_();_nop_();_nop_();</p><p> if(DQ)value|=0x80;</p><p> delay_us(6);</p&
127、gt;<p><b> }</b></p><p><b> DQ=1;</b></p><p> return(value);</p><p><b> }</b></p><p> void gettemp()</p><p>
128、;<b> {</b></p><p> uchar a,b;</p><p> uint t; </p><p><b> reset();</b></p><p> write_byte(0xcc);</p><p> write_byte(0xbe);&
129、lt;/p><p> a=read_byte(); //讀取高字節(jié)</p><p> b=read_byte(); //讀取低字節(jié)</p><p><b> reset();</b></p><p> write_byte(0xcc);</p><p> write_byte(0
130、x44);</p><p> //處理讀取溫度t </p><p><b> t=b;</b></p><p> t<<=8; //值左移8位 </p><p> t=t|a; //合并高低位數值</p><p> if(t>
131、;0xfff) //判斷溫度是為正還是為負</p><p> t=~t+1; //負值換算</p><p> t=t*(0.625); //溫度擴大10倍,精確到1位小數</p><p> if((temp-t)<100||(t-temp)<100)</p><p><b> temp=t;&
132、lt;/b></p><p><b> }</b></p><p> void TempShow() ///溫度讀取函數</p><p><b> { </b></p><p> char buf[4];</p><p> gettemp();<
133、;/p><p> buf[0]=temp%1000/100+0x30; //十位數</p><p> buf[1]=temp%100/10+0x30; //個位數</p><p> buf[2]='.';</p><p> buf[3]=temp%10+0x30; //小數位</p>&
134、lt;p><b> pd(0x40);</b></p><p> write_data(buf[0]);</p><p> write_data(buf[1]);</p><p> write_data(buf[2]);</p><p> write_data(buf[3]);</p>&l
135、t;p> write_data(du);</p><p> write_data('C');</p><p> LcdStr(0x00,"The Temperature:");</p><p><b> }</b></p><p><b> 3、掃描函數&l
136、t;/b></p><p> #include"Feiyun.h"</p><p> uchar code Key[]={1,2,3,10,4,5,6,11,7,8,9,14,0,12,13,15};</p><p> uchar code check[]={0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7
137、b,</p><p> 0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e};</p><p> uchar code num[]="0123456789UDLREQ";</p><p> uchar scankey(void) //掃描函數</p><p><b
138、> {</b></p><p> uchar readkey,key,i;</p><p> uchar x_key,y_key; //X為行,Y為豎</p><p> uchar dat;</p><p> scan:P2=0xf0;</p><p> delay(20);
139、 //去抖</p><p> if(P2!=0xf0) //確認有鍵按下</p><p><b> {</b></p><p> y_key=P2; //讀Y鍵值</p><p><b> P2=0x0f;</b></p><p&
140、gt; while(P2==0x0f); </p><p> x_key=P2; //讀X鍵值</p><p> while(P2!=0x0f); //是否釋放鍵</p><p> readkey=y_key|x_key; //讀取鍵值特征碼;</p><p><b> }</b>
141、;</p><p> else goto scan; //重新掃描</p><p> for(i=0;i<16;i++)</p><p> if(readkey==check[i]) key=i;</p><p> key=Key[key];</p><p> if(key<16&
142、amp;&key>=0) dat=key;</p><p> else scankey();</p><p> delay(20);</p><p> while(KeyDown);</p><p> return dat;</p><p><b> }</b></p
143、><p> uchar ReadKey(KEY *dat)</p><p><b> {</b></p><p> char temp,buf;</p><p> if(KeyDown) </p><p><b> {</b></p><p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論