版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 基于52單片機(jī)——</b></p><p><b> 數(shù)字電子鐘課程設(shè)計(jì)</b></p><p> 題 目: 數(shù)字電子鐘 </p><p> 院 (系): 電氣與控制工程學(xué)院 </p><p> 專 業(yè):
2、 自動(dòng)化 </p><p> 學(xué)生姓名: </p><p> 指導(dǎo)教師: </p><p><b> 摘 要</b></p><p> 單片機(jī)自20世紀(jì)70年代問(wèn)世以來(lái),以其極高的性能價(jià)格比,受
3、到人們的重視和關(guān)注,應(yīng)用很廣、發(fā)展很快。單片機(jī)體積小、重量輕、抗干擾能力強(qiáng)、環(huán)境要求不高、價(jià)格低廉、可靠性高、靈活性好、開(kāi)發(fā)較為容易。由于具有上述優(yōu)點(diǎn),在我國(guó),單片機(jī)已廣泛地應(yīng)用在工業(yè)自動(dòng)化控制、自動(dòng)檢測(cè)、智能儀器儀表、家用電器、電力電子、機(jī)電一體化設(shè)備等各個(gè)方面。本設(shè)計(jì)采用LCD液晶屏幕顯示系統(tǒng),以AT89C52單片機(jī)為核心,由鍵盤、溫度采集、定時(shí)鬧鈴、日期提醒等功能模塊組成?;陬}目基本要求,本系統(tǒng)對(duì)時(shí)間顯示、鬧鈴方式進(jìn)和溫度采集系
4、統(tǒng)行了重點(diǎn)設(shè)計(jì)。本系統(tǒng)大部分功能由軟件來(lái)實(shí)現(xiàn),吸收了硬件軟件化的思想,大部分功能通過(guò)軟件來(lái)實(shí)現(xiàn),使電路簡(jiǎn)單明了,系統(tǒng)穩(wěn)定性大大提高。本系統(tǒng)不僅成功的實(shí)現(xiàn)了要求的基本功能,多數(shù)發(fā)揮部分也得到了實(shí)現(xiàn),而且還具有一定的創(chuàng)新功能。</p><p> 關(guān)鍵字:?jiǎn)纹瑱C(jī)、 LCD液晶顯示;溫度采集;定時(shí)鬧鈴</p><p><b> 目 錄</b></p>
5、<p><b> 摘 要2</b></p><p><b> 前 言3</b></p><p><b> 1設(shè)計(jì)方案4</b></p><p> 1.1 顯示模塊4</p><p> 1.2 溫度模塊4</p><p
6、> 1.3 鍵盤模塊4</p><p> 1.4 時(shí)鐘模塊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單片機(jī)最小系統(tǒng):6</p><p> 3.2溫度測(cè)量模塊:7</p><p> 3.3 LCD液晶顯示模塊:7</p><p> 3.4整體電路圖8</p><p> 4系統(tǒng)軟件設(shè)計(jì)流程9</p><p> 4.1主程序流程8</p><p> 4.2 溫度測(cè)量流
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 心得體會(huì)14<
9、;/b></p><p><b> 附程序15</b></p><p><b> 參考文獻(xiàn)30</b></p><p><b> 前言</b></p><p> 時(shí)鐘,自從它發(fā)明的那天起,就成為人類的朋友,但隨著時(shí)間的推移,科學(xué)技術(shù)的不斷發(fā)展,人們對(duì)時(shí)間計(jì)量的
10、精度要求越來(lái)越高,應(yīng)用越來(lái)越廣。怎樣讓時(shí)鐘更好的為人民服務(wù),怎樣讓我們的老朋友煥發(fā)青春呢?這就要求人們不斷設(shè)計(jì)出新型時(shí)鐘。</p><p> 現(xiàn)今,高精度的計(jì)時(shí)工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技術(shù),因此走時(shí)精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)校,數(shù)字式電子鐘用集成電路計(jì)時(shí)時(shí),譯碼代替機(jī)械式傳動(dòng),用LED顯示器代替顯示器代替指針顯示進(jìn)而顯示時(shí)間,減小了計(jì)時(shí)誤差,這種表具
11、有時(shí),分,秒顯示時(shí)間的功能,還可以進(jìn)行時(shí)和分的校對(duì),片選的靈活性好。</p><p> 時(shí)鐘電路在計(jì)算機(jī)系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個(gè)單片機(jī)應(yīng)用系統(tǒng)中,時(shí)鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準(zhǔn)振蕩定時(shí)信號(hào),主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機(jī)系統(tǒng)工作的快慢;二是指系統(tǒng)的標(biāo)準(zhǔn)定時(shí)時(shí)鐘,即定時(shí)時(shí)間,它通常有兩種實(shí)現(xiàn)方法:一是用軟件實(shí)現(xiàn),即用單片機(jī)內(nèi)部的可編程定時(shí)
12、/計(jì)數(shù)器來(lái)實(shí)現(xiàn),但誤差很大,主要用在對(duì)時(shí)間精度要求不高的場(chǎng)合;二是用專門的時(shí)鐘芯片實(shí)現(xiàn),在對(duì)時(shí)間精度要求很高的情況下,通常采用這種方法,典型的時(shí)鐘芯片有:DS1302,DS12887,X1203等都可以滿足高精度的要求。</p><p> 本文主要介紹用單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器來(lái)實(shí)現(xiàn)電子時(shí)鐘的方法,本設(shè)計(jì)由單片機(jī)AT89S51芯片和LED數(shù)碼管為核心,輔以必要的電路,構(gòu)成了一個(gè)單片機(jī)電子時(shí)鐘。</p>
13、;<p><b> 1設(shè)計(jì)方案</b></p><p><b> 1.1 顯示模塊</b></p><p> 顯示模塊采用Lcd1602。Lcd1602液晶顯示具有豐富多樣性、靈活性、電路簡(jiǎn)單、易于控制而且功耗小等優(yōu)點(diǎn),對(duì)于信息量多的系統(tǒng),是比較適合的。1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的
14、點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來(lái),我們就能看到字母“A”。</p><p> 因?yàn)?602識(shí)別的是ASCII碼,試驗(yàn)可以用ASCII碼直接賦值,在單片機(jī)編程中還可以用字符型常量或變量賦值,如'A’。 </p>
15、;<p><b> 1.2 溫度模塊</b></p><p> 溫度模塊采用DS18B20,其獨(dú)特的一線接口,只需要一條口線通信多點(diǎn)能力,簡(jiǎn)化了分布式溫度傳感應(yīng)用 無(wú)需外部元件 可用數(shù)據(jù)總線供電,電壓范圍為3.0 V至5.5 V 無(wú)需備用電源 測(cè)量溫度范圍為-55 ° C至+125 ℃ 。華氏相當(dāng)于是-67 ° F到257華氏度 -10 ° C
16、至+85 ° C范圍內(nèi)精度為±0.5 ° 。</p><p> 溫度傳感器可編程的分辨率為9~12位 溫度轉(zhuǎn)換為12位數(shù)字格式最大值為750毫秒,用戶可定義的非易失性溫度報(bào)警設(shè)置。應(yīng)用范圍包括恒溫控制,工業(yè)系統(tǒng),消費(fèi)電子產(chǎn)品溫度計(jì),或任何熱敏感系統(tǒng)。</p><p> DS18B20的數(shù)字溫度計(jì)提供9至12位(可編程設(shè)備溫度讀數(shù)。信息被發(fā)送到/從DS18B
17、20 通過(guò)1線接口,所以中央微處理器與DS18B20只有一個(gè)一條口線連接。為讀寫以及溫度轉(zhuǎn)換可以從數(shù)據(jù)線本身獲得能量,不需要外接電源。 因?yàn)槊恳粋€(gè)DS18B20的包含一個(gè)獨(dú)特的序號(hào),多個(gè)DS18B20可以同時(shí)存在于一條總線。這使得溫度傳感器放置在許多不同的地方。它的用途很多,包括空調(diào)環(huán)境控制,感測(cè)建筑物內(nèi)溫設(shè)備或機(jī)器,并進(jìn)行過(guò)程監(jiān)測(cè)和控制。</p><p><b> 1.3 鍵盤模塊</b&g
18、t;</p><p> 鍵盤模塊采用4×4矩陣鍵盤。在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P2口)就可以構(gòu)成4×4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(
19、9鍵)。由此可見(jiàn),在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤是合理的。</p><p><b> 1.4時(shí)鐘模塊</b></p><p> 時(shí)鐘模塊采用定時(shí)器0提供時(shí)鐘源。定時(shí)/計(jì)數(shù)器0可以工作在4種工作方式中。工作方式0是13位的計(jì)數(shù)器;工作方式1是16位的計(jì)數(shù)器;工作方式2帶有數(shù)據(jù)自動(dòng)重裝的功能,因此,定時(shí)更精確。經(jīng)常用于波特率發(fā)生器。;工作方式3是將它當(dāng)做兩個(gè)
20、8位的定時(shí)器來(lái)用。主要與另一個(gè)定時(shí)器工作于方式2時(shí)配套使用。為了方便處理和提高精度采用方式2。但要提供秒信號(hào)還需要一個(gè)計(jì)數(shù)器來(lái)記錄中斷的次數(shù)以產(chǎn)生秒信號(hào)。</p><p><b> 1.5其他模塊</b></p><p> 程序提供校時(shí)功能,通過(guò)4×4矩陣鍵盤校時(shí),鍵盤功能鍵(即鍵值大于9的6個(gè)鍵)和鍵盤的數(shù)字鍵(即鍵值為0~9的9個(gè)鍵)來(lái)校時(shí)。<
21、/p><p> 程序可以通過(guò)設(shè)定的時(shí)間計(jì)算出當(dāng)天是星期幾。并在Lcd1602的左上角顯示出來(lái)。程序日期模塊的年份區(qū)間為2000年到2099年一百年的時(shí)間。</p><p><b> 2總體框架</b></p><p><b> 圖1總體框架</b></p><p><b> 3硬件電路
22、</b></p><p> 3.1單片機(jī)最小系統(tǒng):</p><p> 最小系統(tǒng)包括晶體振蕩電路、復(fù)位開(kāi)關(guān)和電源部分。圖2為AT89C52單片機(jī)的最小系統(tǒng)。MCS-51是標(biāo)準(zhǔn)的40引腳雙列直插式集成電路芯片,引腳分布請(qǐng)參照----單片機(jī)引腳圖:</p><p> l P0.0~P0.7 P0口8位雙向口線(在引腳的39~32號(hào)端子)。 </p&
23、gt;<p> l P1.0~P1.7 P1口8位雙向口線(在引腳的1~8號(hào)端子)。</p><p> l P2.0~P2.7 P2口8位雙向口線(在引腳的21~28號(hào)端子)。 </p><p> l P3.0~P3.7 P3口8位雙向口線(在引腳的10~17號(hào)端子)。</p><p> P0做一般的I/O使用,但內(nèi)部無(wú)上拉電阻,作為輸入或
24、輸出時(shí)應(yīng)在外部接上拉電阻。 P1口只做I/O口使用:其內(nèi)部有上拉電阻。P3 除了作為I/O使用外(其內(nèi)部有上拉電阻),還有一些特殊功能,由特殊寄存器來(lái)設(shè)置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構(gòu)成的兩排十針下載口,板圖上有一個(gè)小方框,為1號(hào)引角;下載線的凸口為正方向,凸口的右側(cè)邊的第一個(gè)插孔為1號(hào)引角。</p><p> 3.2溫度測(cè)量模塊:</p><p> 溫度測(cè)量傳感器采用DALLAS公司DS18B20的單總線數(shù)字化溫度傳感器,測(cè)溫范圍為-55℃~125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測(cè)溫分辨率達(dá)到0.06
26、25℃,采用寄生電源工作方式,CPU只需一根口線便能與DS18B20通信,占用CPU口線少,可節(jié)省大量引線和邏輯電路。接口電路如圖3所示。</p><p> 圖3 DS18B20測(cè)量電路</p><p> 3.3. LCD液晶顯示模塊:</p><p> LCD液晶顯示模塊采用LCD1602型號(hào),具有很低的功耗,正常工作時(shí)電流僅2.0mA/5.0V。通過(guò)編
27、程實(shí)現(xiàn)自動(dòng)關(guān)閉屏幕能夠更有效的降低功耗。LCD1602分兩行顯示,每行可顯示多達(dá)16個(gè)字符。LCD1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,通過(guò)內(nèi)部指令可實(shí)現(xiàn)對(duì)其顯示多樣的控制,并且還能利用空余的空間自定義字符。</p><p> 3.4. 整體電路圖</p><p><b> 4系統(tǒng)軟件設(shè)計(jì)流程</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. 溫度測(cè)量流程圖如圖11所示:</p><
29、p> 圖11 溫度測(cè)量程序流程圖</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 溫度測(cè)量流程圖</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 心得體會(huì)</b></p><p> 王慧 自動(dòng)化1002班 1006050203</p><p> 這次課程設(shè)計(jì)里我學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí)。以前在上課的時(shí)候,老師經(jīng)常強(qiáng)調(diào)在寫一個(gè)程序的時(shí)候,一定要事先把程序原理方框圖化出來(lái),但是我開(kāi)始總覺(jué)得這樣做沒(méi)必要,很浪費(fèi)時(shí)間。但是,這次課程設(shè)計(jì)完全改變了我以前的那種錯(cuò)誤的認(rèn)識(shí),以前我接觸的那些程序
48、都是很短、很基礎(chǔ)的,但是在課程設(shè)計(jì)中碰到的那些需要很多代碼才能完成的任務(wù),畫(huà)程序方框圖是很有必要的。因?yàn)橥ㄟ^(guò)程序方框圖,在做設(shè)計(jì)的過(guò)程中,我們每一步要做什么,每一步要完成什么任務(wù)都有一個(gè)很清楚的思路,而且在程序測(cè)試的過(guò)程中也有利于查錯(cuò)。</p><p> 其次,以前對(duì)于編程工具的使用還處于一知半解的狀態(tài)上,但是經(jīng)過(guò)一段上機(jī)的實(shí)踐,對(duì)于怎么去排錯(cuò)、查錯(cuò),怎么去看每一步的運(yùn)行結(jié)果,怎么去了解每個(gè)寄存器的內(nèi)容以確保程
49、序的正確性上都有了很大程度的提高。</p><p> 通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,這畢竟第一次做的,難免會(huì)遇到過(guò)各種各樣的問(wèn)題,同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深
50、刻,掌握得不夠牢固。</p><p> 邵云杰 自動(dòng)化1002班 1006050208</p><p> 回顧起此課程設(shè)計(jì),至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說(shuō)得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不
51、夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。,課程設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,但可喜的是最終都得到了解決。實(shí)驗(yàn)過(guò)程中,也對(duì)團(tuán)隊(duì)精神的進(jìn)行了考察,讓我們?cè)诤献髌饋?lái)更加默契,在成功后一起體會(huì)喜悅的心情。果然是團(tuán)結(jié)就是力量,只有互相之間默契融洽的配合才能換來(lái)最終完美的結(jié)果。</p><p> 此次設(shè)計(jì)也讓我明白了思路即出路
52、,有什么不懂不明白的地方要及時(shí)請(qǐng)教或上網(wǎng)查詢,只要認(rèn)真鉆研,動(dòng)腦思考,動(dòng)手實(shí)踐,就沒(méi)有弄不懂的知識(shí),收獲頗豐。</p><p> 徐銑蔚 自動(dòng)化1001班 1006050102</p><p> 兩周的課程設(shè)計(jì)結(jié)束了,在這次的課程設(shè)計(jì)中不僅檢驗(yàn)了我所學(xué)習(xí)的知識(shí),也培養(yǎng)了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在設(shè)計(jì)過(guò)程中,與同學(xué)分工設(shè)計(jì),和同學(xué)們相
53、互探討,相互學(xué)習(xí),相互監(jiān)督。學(xué)會(huì)了合作,學(xué)會(huì)了運(yùn)籌帷幄,學(xué)會(huì)了寬容,學(xué)會(huì)了理解,也學(xué)會(huì)了做人與處世。 課程設(shè)計(jì)是我們專業(yè)課程知識(shí)綜合應(yīng)用的實(shí)踐訓(xùn)練,著是我們邁向社會(huì),從事職業(yè)工作前一個(gè)必不少的過(guò)程.”千里之行始于足下”,通過(guò)這次課程設(shè)計(jì),我深深體會(huì)到這句千古名言的真正含義.我今天認(rèn)真的進(jìn)行課程設(shè)計(jì),學(xué)會(huì)腳踏實(shí)地邁開(kāi)這一步,就是為明天能穩(wěn)健地在社會(huì)大潮中奔跑打下堅(jiān)實(shí)的基礎(chǔ)。 通過(guò)這次單片機(jī)數(shù)字電子鐘設(shè)計(jì),我在多方面都有所提
54、高,綜合運(yùn)用本專業(yè)所學(xué)課程的理論和生產(chǎn)實(shí)際知識(shí)進(jìn)行一次數(shù)字電子鐘的設(shè)計(jì)設(shè)計(jì)工作的實(shí)際訓(xùn)練從而培養(yǎng)和提高獨(dú)立工作能力,鞏固與擴(kuò)充了課程所學(xué)的內(nèi)容,掌握設(shè)計(jì)的方法和步驟,掌握設(shè)計(jì)的基本的技能,同時(shí)各科相關(guān)的課程都有了全面的復(fù)習(xí),獨(dú)立思考的能力也有了提高。在這次設(shè)計(jì)過(guò)程中,體現(xiàn)出設(shè)計(jì)電路的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出勞動(dòng)成果的喜悅心情,從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)</p><p> 1、時(shí)間
55、日期的設(shè)置初始化</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() //時(shí)間和日期的初始化</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() //時(shí)間模塊</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顯示時(shí)間 </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、溫度傳感器的復(fù)位延時(shí)</p><p> #include "Feiyun.h" </p><p> uint temp=270; </p><p> void delay_us(uint t) ////延時(shí)函數(shù)</p><p><
117、;b> {</b></p><p> for(;t>0;t--);</p><p><b> } </b></p><p> void reset(void) ////DS18B20復(fù)位函數(shù) </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)//寫一個(gè)字節(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) ///////讀一個(gè)字節(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; //合并高低位數(shù)值</p><p> if(t>
131、;0xfff) //判斷溫度是為正還是為負(fù)</p><p> t=~t+1; //負(fù)值換算</p><p> t=t*(0.625); //溫度擴(kuò)大10倍,精確到1位小數(shù)</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() ///溫度讀取函數(shù)</p><p><b> { </b></p><p> char buf[4];</p><p> gettemp();<
133、;/p><p> buf[0]=temp%1000/100+0x30; //十位數(shù)</p><p> buf[1]=temp%100/10+0x30; //個(gè)位數(shù)</p><p> buf[2]='.';</p><p> buf[3]=temp%10+0x30; //小數(shù)位</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、掃描函數(shù)&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) //掃描函數(shù)</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) //確認(rèn)有鍵按下</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子鐘課程設(shè)計(jì)----數(shù)字電子鐘的設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)---數(shù)字電子鐘
- 數(shù)字電子鐘課程設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)
- 單片機(jī)電子鐘課程設(shè)計(jì)---數(shù)字電子鐘
- 數(shù)字電子鐘課程設(shè)計(jì) (2)
- 數(shù)字電子鐘課程設(shè)計(jì) (3)
- 數(shù)字電子鐘課程設(shè)計(jì)--電子數(shù)字時(shí)鐘
- 數(shù)字電子鐘課程設(shè)計(jì)論文
- 數(shù)字電子鐘課程設(shè)計(jì)報(bào)告
- eda課程設(shè)計(jì)--數(shù)字電子鐘課程設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)--數(shù)字電子鐘邏輯電路設(shè)計(jì)
- 數(shù)字電子鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子鐘課程設(shè)計(jì)報(bào)告
- 數(shù)字電子鐘課程設(shè)計(jì) (3)
- 《單片機(jī)技術(shù)》電子鐘課程設(shè)計(jì)---數(shù)字電子鐘
評(píng)論
0/150
提交評(píng)論