版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 任務(wù)書:</b></p><p> 設(shè)計(jì)一個電子數(shù)字鐘,顯示時分秒,且具有鬧鐘功能(如顯示23-46-58)。</p><p> 用8279接口實(shí)現(xiàn)4*5鍵盤及8位LED顯示。</p><p> 一 系統(tǒng)總體設(shè)計(jì)方案規(guī)劃與選定</p><p><b> 1.中斷程序說明&
2、lt;/b></p><p> 走時程序:進(jìn)入走時程序后,如果沒有設(shè)定鬧鐘,則開定時器T0,以50ms為基礎(chǔ),循環(huán)20次。時間進(jìn)行變化,如果秒個位小于9,則一秒到,秒個位加1;如果秒個位等于9,則秒個位回0,同時判斷秒十位,如果秒十位小于5,則秒十位加1;如果秒十位等于5,則秒十位回0,同時判斷分個位,如果分個位小于9,則分十位加1;如果分十位等于9,則分十位回0,同時判斷分十位,如果分十位小于5,則一秒
3、到,分十位加1;如果分個位等于5,則分十位回0,同時判斷小時個位,如果小時個位小于9,則小時個位加1,如果小時十位等于5,則小時十位回0,按此規(guī)律,時鐘從00-00-00到23-59-59循環(huán)走時。</p><p><b> 2.主程序說明</b></p><p> 鬧鐘程序:設(shè)定鬧鐘后,時間到達(dá)所設(shè)鬧鐘點(diǎn)時,進(jìn)入鬧鐘程序,響鈴并正常走時,一分鐘后響鈴?fù)V?;如需?/p>
4、途停止,則按下鬧鐘取消鍵,則鬧鐘停止響鈴。</p><p> 讀鍵值程序:利用查詢功能查詢8279是否有按鍵按下,若有按鍵按下,則進(jìn)入鍵值判斷環(huán)節(jié),根據(jù)事先設(shè)置的鍵值查找按下的按鍵。</p><p> 按鍵散轉(zhuǎn)程序:根據(jù)讀鍵值程序所得到的鍵值轉(zhuǎn)移到相應(yīng)按鍵處理函數(shù)。</p><p> LED顯示程序:根據(jù)nao(鬧鐘),tiao(調(diào)時),guan(關(guān)閉),ce
5、wen(測溫)標(biāo)志位的不同,在8位LED上顯示時間,鬧鐘設(shè)置,定時關(guān)燈設(shè)置和測溫顯示。將共陰極數(shù)碼管所對應(yīng)的段碼寫入8279的顯示ROM中,可以將所對應(yīng)的信息顯示在數(shù)碼管上。</p><p> 測溫程序:當(dāng)測溫按鍵按下后,轉(zhuǎn)移到該程序。初始化DS18b20,先將DQ位置1,稍做延時后DQ置0,延時480us以上,然后拉高DQ總線,讀取DQ值,若初始化成功則返回presence=0。然后讀取DS18b20中的數(shù)據(jù)
6、并顯示在數(shù)碼管上,在這個過程中,時鐘仍然正常工作但不顯示在數(shù)碼管上,顯示溫度1秒鐘,之后再自動回到時間顯示。</p><p> 調(diào)時間程序:當(dāng)系統(tǒng)檢測到調(diào)時按鍵按下后,進(jìn)入調(diào)時模式,關(guān)閉定時器T0;在待調(diào)的位置上顯示C,此時按下調(diào)節(jié)使能按鍵,使能數(shù)字鍵,按下數(shù)字鍵之后,可調(diào)節(jié)該位的時間,之后按下調(diào)節(jié)移位按鍵可以轉(zhuǎn)換到下一位進(jìn)行調(diào)節(jié),當(dāng)調(diào)節(jié)結(jié)束后可以按下走時鍵,即可走時,在走時的同時屏蔽數(shù)字鍵。</p>
7、;<p> 鬧鐘設(shè)置程序:按下鬧鐘設(shè)置按鍵,顯示鬧鐘時間,按下鬧鐘移位按鍵可以調(diào)節(jié)所要調(diào)整的位置,待調(diào)整位上顯示C,在該位上按下相應(yīng)的數(shù)字鍵可以進(jìn)行調(diào)整,在這個過程中,時鐘仍然正常工作但不顯示在數(shù)碼管上,調(diào)節(jié)完畢后可以按下推出鬧鐘設(shè)置按鍵即可顯示時間。</p><p> 定時關(guān)燈程序:按下定時關(guān)燈設(shè)置按鍵,顯示關(guān)燈時間,繼續(xù)按下該鍵,改變調(diào)節(jié)的位置,待調(diào)位顯示C,按下相應(yīng)的數(shù)字鍵可以調(diào)節(jié)時間,在
8、這個過程中,時鐘仍然正常工作但不顯示在數(shù)碼管上,當(dāng)調(diào)節(jié)結(jié)束后可以按下退出定時關(guān)燈設(shè)置鍵,當(dāng)時鐘時間到達(dá)所設(shè)定的時間時,定時關(guān)燈,節(jié)約能源。</p><p><b> 二 硬件設(shè)計(jì)</b></p><p> 1.AT89C51(總線型)</p><p> ?。?)P1.0:通過電阻限流和三極管放大接BUZZER,實(shí)現(xiàn)鬧鐘響鈴</p&g
9、t;<p> (2)XTAL1和XTAL2:外接晶振電路,頻率為12MHz</p><p> (3)RST:接手動復(fù)位電路,實(shí)動復(fù)位,顯示待命狀態(tài)C.</p><p> (4)AD[0…7]:接8279AD0-7,送低八位地址</p><p> ?。?)P2.0(A[8]):接8279A0,選擇數(shù)據(jù)口和狀態(tài)口</p><p&g
10、t; ?。?)P2.7(A[15]):接8279CS,進(jìn)行8279片選</p><p> ?。?)P3.6/WR:接8279WR,傳遞寫信號</p><p> ?。?)P3.7/RD:接8279RD,傳遞讀信號</p><p> (9)ALE:接8279CLK,設(shè)置8279掃描頻率</p><p> 2.8279(控制鍵盤和LED顯示)&
11、lt;/p><p> (1)AD0-7:接AT89C51P0.0-0.7(AD[0…7])</p><p> ?。?)CS:接AT89C51P2.7(A[15])</p><p> ?。?)A0:接AT89C51P2.0(A[8])</p><p> ?。?)RD:接AT89C51RD</p><p> (5)WR:接
12、AT89C51WR</p><p> ?。?)IRQ:懸空(采用查詢方式判斷是否有鍵按下,故不需接單片機(jī)的外部中斷)</p><p> ?。?)CLK:接AT89C51ALE</p><p><b> ?。?)RES:懸空</b></p><p> ?。?)RL0-3:接鍵盤電路列值,指示輸入鍵所在的列號</p&g
13、t;<p> (10)SL0-2:接74LS138,指示輸入鍵所在的行號</p><p> (11)OUT_A0-A3:接數(shù)碼管段選(E、F、G、DP)</p><p> (12)OUT_B0-B3:接數(shù)碼管(A、B、C、D)</p><p><b> 3.74HC138</b></p><p>
14、 A-C:接8279SL0-SL2</p><p> Y0-Y7:接74HC373(2)D0-D7</p><p><b> E1:接VCC</b></p><p><b> E2和E3:接地</b></p><p> 4.八位一體LED燈(用來顯示時-分-秒)</p><
15、;p> ?。?)A-G和DP:接74HC373(1)Q0-Q7</p><p> ?。?)1-8:接74HC373(2)Q0-Q7</p><p><b> 5.四乘五鍵盤</b></p><p><b> 按鍵說明如下:</b></p><p><b> 鍵碼說明:</
16、b></p><p> 0——00H 4——08H 8——10H 走時——18H</p><p> 1——01H 5——09H 9——11H 鬧鐘設(shè)置——19H</p><p> 2——02H 6——0aH 調(diào)節(jié)使能——12H 退出鬧鐘設(shè)置——1aH</p><p> 3
17、——03H 7——0bH 時鐘移位——13H 鬧鐘移位——1bH</p><p><b> 溫度設(shè)置——20H</b></p><p> 退出溫度設(shè)置——21H</p><p> 定時關(guān)燈設(shè)置——22H</p><p> 退出關(guān)燈設(shè)置——23H</p><p><b>
18、 6.DS18b20</b></p><p> (1)GND管腳直接接地</p><p> ?。?)VCC接+5v</p><p> ?。?)DQ接單片機(jī)P1.1</p><p><b> 7.定時關(guān)燈</b></p><p> (1)三極管b極接單片機(jī)P1.2</p&g
19、t;<p> (2)三極管c極接繼電器的線圈,同時</p><p> 繼電器的靜觸點(diǎn)上外接220V燈泡</p><p> (3)繼電器線圈接續(xù)流二極管,防止</p><p><b> 三 軟件設(shè)計(jì)</b></p><p> 采用C語言編寫程序,我們的程序可以分為兩大模塊:主程序模塊(按鍵模塊、鬧
20、鐘模塊、定時關(guān)燈模塊,測溫模塊、調(diào)時模塊)和中斷程序模塊(走時)。先將主要程序流程圖總結(jié)如下。</p><p><b> 1.中斷程序流程圖</b></p><p><b> 是</b></p><p> 秒數(shù)組DisBuf[6]=0</p><p> 分?jǐn)?shù)組DisBuf[4]+1
21、 </p><p> DisBuf[7]=10</p><p><b> 是</b></p><p> 分?jǐn)?shù)組DisBuf[4]=0</p><p> 是 分?jǐn)?shù)組DisBuf[3]+1</p><p> 秒
22、數(shù)組DisBuf[7]=0</p><p> 秒數(shù)組DisBuf[6]+1</p><p> 分?jǐn)?shù)組DisBuf[4]=0</p><p> 分?jǐn)?shù)組DisBuf[3]=0</p><p> 分?jǐn)?shù)組DisBuf[3]=0</p><p> 時數(shù)組DisBuf[1]+1</p><p>&
23、lt;b> 是</b></p><p> 時數(shù)組DisBuf[1]=0</p><p> 時數(shù)組DisBuf[0]+1</p><p> DisBuf[[7]=0</p><p> DisBuf[[6]=6</p><p> 秒數(shù)組DisBuf[7]=0</p><
24、p> 秒數(shù)組DisBuf[6]-0</p><p> DisBuf[[4]=0</p><p> DisBuf[[3]=6</p><p><b> 2.測溫子程序</b></p><p><b> 否</b></p><p><b> 3.調(diào)時子
25、程序</b></p><p><b> 4.主程序流程圖</b></p><p><b> 否</b></p><p><b> 四 調(diào)試</b></p><p> 無論是編程,還是畫電路圖,都遇到了很多的問題,尤其是對8279的了解過程很漫長,開始我對8
26、279的功能與應(yīng)用很陌生,以至于不知該如何著手,后來我們借了很多的資料,也研讀了課本上的相關(guān)內(nèi)容,花了很多的時間,才對其功能有所了解,下面我說一下我們在實(shí)現(xiàn)每一個功能的過程中遇到的困難和解決的辦法。</p><p> 1.按鍵與功能對應(yīng)不齊</p><p> ?。?)在散轉(zhuǎn)程序中,不同的子程序有各自的地址號,由于考慮了無按鍵時的空函數(shù),占據(jù)了散轉(zhuǎn)函數(shù)的第一位地址,同時,鍵碼表的數(shù)組是從零
27、開始的,所以返回時,鍵碼表的按鍵返回值應(yīng)為J+1,這樣才能與散轉(zhuǎn)程序中對應(yīng)的按鍵處理程序所對應(yīng)</p><p> (2)4*5的鍵盤列線,按照課本通過上拉電阻接高電平,根本無法造成按鍵判斷,調(diào)時無從談起,按鍵右端會一直維持高電平,即使所在行有鍵按下,按鍵右邊也不會變?yōu)榈碗娖絺鞯搅芯€,傳送返回,反而連鍵的左邊也維持到高電平,查看8279FIFORAM,里邊沒有鍵碼傳入,后來我們將上拉電阻和高電平干脆去掉。<
28、/p><p> 在這一功能的實(shí)現(xiàn)過程最為漫長,因?yàn)榘凑諘系膱D連接鍵盤部分,可是一直無法中斷,當(dāng)時非常痛苦,找不到錯誤到底在哪里,但經(jīng)過我們長時間的仔細(xì)討論和思索,將高電平和上拉電阻去掉,才能使用。 </p><p> 2.測溫函數(shù)無法退出</p><p> ?。?)開始的時候我們?yōu)榱税匆幌聹y溫鍵就能馬上反映出溫度的讀數(shù),將測溫子程序中的函數(shù)放在了while(1)中
29、,這樣按下溫度鍵后,LED就能立刻反映出溫度的讀數(shù)。但是,這樣做導(dǎo)致了按下測溫鍵之后,系統(tǒng)無法自主退出測溫子函數(shù),陷入while(1)循環(huán)中,更無法正常顯示時間,為了解決這個問題我們將while()中的條件更改為while(cewen),并且在計(jì)時器中記滿一秒之后,令cewen=0,這樣就可以使while退出循環(huán),正常顯示走時的時間。</p><p> ?。?)上述問題解決后,我們在調(diào)試的過程中又發(fā)現(xiàn)一個BUG,
30、按下調(diào)時鍵進(jìn)行時間調(diào)整之后,再按下測溫鍵,系統(tǒng)又無法退出溫度顯示,此時系統(tǒng)出現(xiàn)死機(jī)。經(jīng)過我們對程序的認(rèn)真梳理,發(fā)現(xiàn)測溫的退出條件依賴于定時器一秒計(jì)時到時,cewen=0,而在調(diào)時時,我們關(guān)閉了計(jì)時器中斷,這樣,在一秒到之后系統(tǒng)沒有響應(yīng)中斷將cewen置為0,于是系統(tǒng)無法退出測溫顯示,我們又將cewen的while條件改為(cewen&&EA),保證了測溫時定時器中斷的打開。這樣,如果EA=0,while循環(huán)會自動退出,而
31、不會造成死機(jī)。</p><p><b> 。</b></p><p> 3.待調(diào)位顯示C不正常</p><p> 當(dāng)調(diào)時和調(diào)鬧鐘時,我們的待調(diào)位應(yīng)該顯示C,可是由于顯示C的子程序調(diào)用時,放得位置不對,導(dǎo)致C亂顯示,修改C顯示的位置,在每次按下調(diào)時或鬧鐘后或修改SEAT后,再顯示C,C就可以在正確的位置顯示了。</p>&l
32、t;p><b> 4.數(shù)字鍵屏蔽</b></p><p> ?。?)在正常走時時,我們發(fā)現(xiàn)如果誤碰數(shù)字鍵就會將走時時間改變,這樣影響了時鐘走時的可靠性,為此,我們設(shè)置了tiao標(biāo)志位,只有在tiao為1時,數(shù)字鍵才能對時鐘進(jìn)行調(diào)表,并且每當(dāng)調(diào)表結(jié)束后,按下走時鍵,tiao位就會置0,屏蔽數(shù)字按鍵。</p><p> (2)在調(diào)時時,我們發(fā)現(xiàn)如果不加以限制,每
33、一位的數(shù)字是可以任意更改的,可能造成錯誤的時間組合,比如說26-73-67,這樣完全不合邏輯的時間組合,為了減少人為造成的上述影響,我們進(jìn)行了數(shù)字鍵鍵位屏蔽,例如,第一位數(shù)字只能為0、1、2,第二位數(shù)字可為0~9,但是一旦第一位數(shù)字為2,第二位只能為0~3,以此類推,所有的數(shù)字鍵都進(jìn)行了鍵位屏蔽,保證時鐘的準(zhǔn)確性。</p><p> 5.調(diào)時時待調(diào)位C無法顯示</p><p> 開始時
34、,我們以為設(shè)置好tiao標(biāo)志位就可以方便的進(jìn)行調(diào)表了,但是很快又發(fā)現(xiàn),待調(diào)位不能正常的顯示C,原因是因?yàn)槲覀儧]有給定的標(biāo)志位設(shè)定標(biāo)簽,于是,我們設(shè)定標(biāo)志位SEAT,當(dāng)按下調(diào)時鍵,給8279顯示RAM的首地址寫入C字型碼,時鐘十位顯示C,當(dāng)按下時鐘位移時,SEAT改變,從而使顯示C的位置改變,舉例:按下時鐘位移鍵,如果SEAT=1,則小時個位顯示C,如果SEAT=4,在鬧鐘情況下,小時的十位顯示C,在調(diào)時情況下,秒十位顯示C;按下左移鍵,
35、如果SEAT=3,小時十位顯示C,如果SEAT=1,在鬧鐘情況下,分鐘個位顯示C,在調(diào)時情況下,秒個位顯示C。</p><p> 5.所有都修改成功后的程序說明</p><p> 單片機(jī)上電后,時鐘從00-00-00開始走時,按下調(diào)試鍵,第一位顯示C,開始對第一位調(diào)節(jié),以后通過控制移位鍵來修改所調(diào)位,調(diào)好之后,按下走時鍵,程序開始正常走時;如果正常走時時,按下鬧鐘鍵,第一位顯示C,開始
36、對第一位定時,控制移位鍵修改鬧鐘時間,修改好后按走時鍵,期間時鐘正常走時。同理,可以調(diào)節(jié)定時關(guān)燈時間。與此同時,如果按下測溫鍵,屏幕上顯示所測溫度,期間時間正常走時,1秒鐘后回到時間顯示。</p><p> 五 新增功能及實(shí)現(xiàn)方法</p><p> 本設(shè)計(jì)有四個新增功能:</p><p><b> (1)定時關(guān)燈</b></p&g
37、t;<p><b> ?。?)鬧鐘取消按鍵</b></p><p> ?。?)走時時按鍵屏蔽。</p><p><b> ?。?)測量溫度</b></p><p><b> 1.定時關(guān)燈</b></p><p> 在現(xiàn)代家居中,有時為了解決時間,需要對家用電器
38、進(jìn)行定時操作,為了滿足人們對于家用電器的定時操作,我們設(shè)計(jì)了定時關(guān)燈環(huán)節(jié),通過單片機(jī)的管腳驅(qū)動PNP型三極管實(shí)現(xiàn)繼電器的關(guān)合,從而控制家用電器。</p><p><b> 2.鬧鐘取消按鍵</b></p><p> 鬧鐘響時,按下取消鍵,進(jìn)入取消鍵中斷程序,修改鬧鐘時間,使其為一個不可能達(dá)到的值,從而取消鈴聲;如果設(shè)有鬧鐘且時間未到,按下取消鍵,同樣賦一個不可能走
39、到的值,從而取消鬧鐘。</p><p><b> 3.屏蔽按鍵功能</b></p><p> 正常走時時,只有四個鍵有效:走時鍵、鬧鐘鍵、調(diào)試鍵和取消鬧鐘鍵,測溫鍵,調(diào)節(jié)定時關(guān)燈鍵。按下調(diào)時鍵和調(diào)節(jié)使能鍵之后,數(shù)字鍵取消屏蔽,設(shè)置好時間之后,按下調(diào)節(jié)使能鍵,再次屏蔽數(shù)字鍵。同時在設(shè)定時間時,小時首位只能在0~2,分鐘和秒的首位只能為0~5,當(dāng)小時首位為2時,小時次
40、位只能為0~3。</p><p><b> 4.測溫功能</b></p><p> 在正常工作時,數(shù)碼管顯示時間,當(dāng)按下測溫鍵后,可以顯示DS18b20中的溫度。顯示的格式為Cdd+溫度+℃,可以顯示兩位或三位溫度數(shù)據(jù),測溫范圍為-55~128℃。</p><p><b> 六 小結(jié)與體會</b></p&g
41、t;<p> 通過此次課程設(shè)計(jì),我真的收獲很多,包括硬件和軟件。</p><p> 編程的過程中,幾乎使用所用了所有的課本講述基本C語言,所以無疑對課本單片機(jī)內(nèi)容有了更深的理解和體會,更深地了解了它的原理和應(yīng)用,比如單片機(jī)的晶振電路、復(fù)位電路、低八位地址傳送端P0口、高八位地址傳送端口P2口、外部中斷口INT1及WR和RD寫和讀口等。另外就是對芯片8279的原理學(xué)習(xí)和應(yīng)用,從很陌生到熟練應(yīng)用,了
42、解它的初始化(包括清零,設(shè)定標(biāo)值等),了解它的OUT_A和OUT_B口(傳遞字型碼)、ALE(設(shè)定掃描頻率)、IQR(傳遞中斷信號)、RL0-3(接鍵盤電路列值,指示輸入鍵所在的列號)、SL0-2(接74HC138A-C,指示輸入鍵所在的行號)等,了解它的LED顯示和鍵盤掃描、它內(nèi)部的顯示RAM和FIFO RAM。</p><p> 對DS18B20溫度傳感器單總線協(xié)議的學(xué)習(xí),讓我對單片機(jī)時序控制的重要性有了更
43、深層次的理解,單總線協(xié)議完全依靠主機(jī)的時序命令對從機(jī)進(jìn)行操作,進(jìn)行寫和讀,任何時序的錯誤都可能導(dǎo)致數(shù)據(jù)的出錯,這告訴我們以后的設(shè)計(jì)應(yīng)該注意器件時序的配合。</p><p> 對KEIL和PROTEUS軟件的應(yīng)用很熟練,包括KEIL軟件的建工程、加入ASM文件、連接和編譯以及PROTEUS軟件的畫圖細(xì)節(jié)和調(diào)試運(yùn)行步驟等(尤其是PROTEUS的應(yīng)用,以前使用較少,在使用的過程中遇到了很多的問題,比如裝軟件和源程序顯
44、示,都費(fèi)了很長的時間進(jìn)行了解和學(xué)習(xí))。</p><p> 通過這次編程,我們犯了很多的錯誤,幾乎數(shù)都數(shù)不清,我們編程開始的比較早,但卻很晚才編好,所以我覺得編程序一定得思路已經(jīng)清晰了,再去著手編寫,否則漏洞百出,出現(xiàn)各種各樣的錯誤,這無疑增加煩躁情緒,但是我很慶幸我和我的同組同學(xué),克服那么多的困難,成功將程序編好,實(shí)現(xiàn)每一個功能,并且有附加功能,我很欣慰,這也歸功于我們的堅(jiān)持不懈和傾力付出。</p>
45、<p> 5.最后,特別要感謝的是楊老師一學(xué)期的辛苦教學(xué),讓我在單片機(jī)方面有這么多的了解,才有今天的編程水平和實(shí)現(xiàn)成果,忠心感謝。</p><p><b> 七 參考文獻(xiàn)</b></p><p> 《單片機(jī)原理、接口及應(yīng)用》 肖看 李群芳 編著 清華大學(xué)出版社</p><p> 《單片機(jī)原理與接口技術(shù)》 黃菊生
46、編著 國防工業(yè)出版社</p><p> 《單片機(jī)接口實(shí)用寶典》 謝宜仁 機(jī)械工業(yè)出版社</p><p> 《單片機(jī)原理教程:基于Proteus虛擬仿真》 徐愛鈞編著 電子工業(yè)出版社</p><p> 八 附錄(源程序代碼、電路圖等)</p><p><b> 1.源程序代碼</b>&l
47、t;/p><p> #include <absacc.h></p><p> #include<reg51.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int </p><p> sbit b
48、eep=P1^0;//蜂鳴器</p><p> sbit DQ=P1^1;</p><p> sbit lamp=P1^2;</p><p> bit Dreset=0; //DS18b20復(fù)位標(biāo)記</p><p> bit Dstart=0; //DS18b20運(yùn)行標(biāo)志位</p>&l
49、t;p> unsigned char presence; //讀DS18b20復(fù)位返回值</p><p> unsigned char temp=0;//整理讀取數(shù)據(jù),做進(jìn)一步分析</p><p> bit T0flag=0;//中斷標(biāo)志位</p><p> char data DisBuf[8]={0,0,13,0,0,13,0
50、,0}; //顯示緩沖區(qū)</p><p> char data Disnao[8]={3,0,13,0,0,13,0,0};</p><p> char data disguan[8]={12,0,13,0,0,13,0,0};</p><p> unsigned char data Segtemp[8]={12,14,13,13,
51、13,17,18,12};//時間設(shè)置計(jì)數(shù)</p><p> unsigned char data Temp_data[2];//讀取溫度暫存</p><p> uchar code keyval[]={0x00,0x01,0x02,0x03,0x08,0x09,0x0a,0x0b, //鍵值表 </p><p> 0x10,
52、0x11,0x12,0x13,0x18,0x19,0x1a,0x1b,0x20,0x21,0x22,0x23};</p><p> uchar code SEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //段碼表</p><p> 0x7f,0x6f,0x77,0x7c,0x39,0x40,0x5e,0x79,0x71,0x00,0x63
53、};</p><p> unsigned int seat=0;</p><p> unsigned int s=0;</p><p> unsigned int tiao=0;</p><p> unsigned int time=0;</p><p> unsigned int nao=0;</p&
54、gt;<p> unsigned int cewen=0;</p><p> unsigned int guan=0;</p><p> /******************* 8279初始化函數(shù) ************************/</p><p> void KbDisInit() {</p><
55、;p> XBYTE[0x7fff]=0x00; //設(shè)置8279工作方式</p><p> XBYTE[0x7fff]=0xD1; //清除8279 </p><p> while (XBYTE[0x7fff] & 0x80);//等待清除結(jié)束</p><p> XBYTE[0x7eff]=0x34; //設(shè)
56、置8279分頻系數(shù)</p><p><b> }</b></p><p> /*********************** 讀鍵值函數(shù) ************************/</p><p> uchar ReadKey(){</p><p> uchar i,j;</p><p
57、> if (XBYTE[0x7fff] & 0x07){ //判斷是否有按鍵</p><p> XBYTE[0x7fff]=0x40; //有鍵按下,寫入讀FIFO命令</p><p> i=XBYTE[0x7eff]; //獲取鍵值</p><p><b> j=0;</b></p
58、><p> while (i!=keyval[j]){j++;} //查鍵值表</p><p> return(j+1);</p><p><b> }</b></p><p> return (0); //無鍵按下</p><p><b> }</b&g
59、t;</p><p> /************************* 顯示函數(shù) *************************/</p><p> void Disp() {</p><p><b> uchar i;</b></p><p> XBYTE[0x7fff]=0x90;
60、 //寫顯示RAM命令</p><p> if(!nao&&!cewen&!guan)</p><p> {for (i=0; i<8; i++){</p><p> XBYTE[0x7eff]=SEG[DisBuf[i]];//顯示緩沖區(qū)內(nèi)容</p><p><b> }</b>
61、;</p><p><b> }</b></p><p> if(nao&&!cewen&&!guan)</p><p><b> {</b></p><p> for (i=0; i<8; i++){</p><p> XBY
62、TE[0x7eff]=SEG[Disnao[i]];}</p><p><b> }</b></p><p> if(cewen&&!guan)</p><p><b> {</b></p><p> for (i=0; i<8; i++){</p>&l
63、t;p> XBYTE[0x7eff]=SEG[Segtemp[i]];}</p><p><b> }</b></p><p><b> if(guan)</b></p><p><b> {</b></p><p> for (i=0; i<8; i+
64、+){</p><p> XBYTE[0x7eff]=SEG[disguan[i]];}</p><p><b> }</b></p><p><b> }</b></p><p> /******naozhong*******/</p><p> void nao
65、zhong()</p><p><b> {</b></p><p><b> {</b></p><p> if(Disnao[0]==DisBuf[0]&&Disnao[1]==DisBuf[1]</p><p> &&Disnao[3]==DisBuf[
66、3]&&Disnao[4]==DisBuf[4])</p><p> beep=!beep;</p><p><b> else</b></p><p><b> beep=1;</b></p><p><b> }</b></p><
67、;p><b> }</b></p><p> void guandeng()</p><p><b> {</b></p><p><b> {</b></p><p> if(disguan[0]==DisBuf[0]&&disguan[1]=
68、=DisBuf[1]</p><p> &&disguan[3]==DisBuf[3]&&disguan[4]==DisBuf[4])</p><p><b> {lamp=1;}</b></p><p><b> }</b></p><p><b>
69、 }</b></p><p> /****延時函數(shù)*******/</p><p> void delay(unsigned int num)//延時函數(shù)</p><p><b> {</b></p><p> while( --num );</p><p>
70、;<b> }</b></p><p> void delayms(unsigned int x)</p><p><b> {</b></p><p> for(;x>0;x--) </p><p><b> {
71、</b></p><p><b> int i;</b></p><p> for(i=113;i>0;i--);</p><p><b> }</b></p><p><b> }</b></p><p> unsigned
72、 char Init_DS18B20()//初始化ds1820</p><p><b> {</b></p><p> DQ = 1; //DQ復(fù)位</p><p> delay(8); //稍做延時</p><p> DQ = 0; //單片機(jī)將DQ拉低</p><
73、p> delay(90); //精確延時 大于 480us</p><p> DQ = 1; //拉高總線</p><p><b> delay(8);</b></p><p> presence = DQ; //如果=0則初始化成功 =1則初始化失敗</p><p> delay(
74、100);</p><p><b> DQ = 1; </b></p><p> return(presence); //返回信號,0=presence,1= no presence</p><p><b> }</b></p><p> /*************************
75、*********************************/</p><p> unsigned char ReadOneChar()//讀一個字節(jié)</p><p><b> {</b></p><p> unsigned char s = 0;</p><p> unsigned char dat =
76、0;</p><p> unsigned char i;</p><p> for (i = 8; i > 0; i--)</p><p><b> {</b></p><p> DQ = 0; // 給脈沖信號</p><p> dat >>= 1;</p>
77、;<p> DQ = 1; // 給脈沖信號</p><p><b> delay(4);</b></p><p><b> if(DQ)</b></p><p> dat |= 0x80;</p><p><b> delay(4);</b></
78、p><p><b> }</b></p><p> return (dat);</p><p><b> }</b></p><p> /**********************************************************/</p><p>
79、; void WriteOneChar(unsigned char dat)//寫一個字節(jié)</p><p><b> {</b></p><p> unsigned char i = 0;</p><p> for (i = 8; i > 0; i--)</p><p><b> {</
80、b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p><b> delay(5);</b></p><p><b> DQ = 1;</b></p><p><
81、b> dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*********************************************************/</p><p>
82、 void Read_temperature(void)//讀取溫度</p><p><b> {</b></p><p> Init_DS18B20();</p><p> if(presence==1) </p><p><b> { </b></p>&
83、lt;p><b> Dreset=1;</b></p><p> beep=0; //DS18B20不正常,蜂鳴器報(bào)警</p><p> delayms(100);</p><p><b> beep=1;</b></p><p><b> } &
84、lt;/b></p><p><b> else </b></p><p><b> {</b></p><p><b> Dreset=0;</b></p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p>&
85、lt;p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器</p><p> Temp_data[
86、0] = ReadOneChar(); //溫度低8位</p><p> Temp_data[1] = ReadOneChar(); //溫度高8位 </p><p><b> }</b></p><p><b> }</b></p><p> /******************
87、*** 無按鍵處理函數(shù) ***********************/</p><p> void NoKey() {</p><p><b> ;</b></p><p><b> }</b></p><p> /********************** 0鍵處理函數(shù) *******
88、*****************/</p><p> void k0() {</p><p> if(tiao&&!nao&&!guan)</p><p> {DisBuf[seat]=0x00;}</p><p> if(tiao&&nao&&!guan)</p
89、><p> {Disnao[s]=0x00;}</p><p> if(guan&&tiao)</p><p> {disguan[s]=0x00;}</p><p><b> }</b></p><p> /********************** 1鍵處理函數(shù) ***
90、**********************/</p><p> void k1() {</p><p> if(tiao&&!nao&&!guan)</p><p> {DisBuf[seat]=0x01;}</p><p> if(tiao&&nao&&!guan)&
91、lt;/p><p> {Disnao[s]=0x01;}</p><p> if(tiao&&guan)</p><p> {disguan[s]=0x01;}</p><p><b> }</b></p><p> /********************** 2鍵處理函
92、數(shù) *************************/</p><p> void k2() {</p><p> if(tiao&&!nao&&!guan)</p><p> {DisBuf[seat]=0x02;}</p><p> if(tiao&&nao&&!g
93、uan)</p><p> {Disnao[s]=0x02;}</p><p> if(tiao&&guan)</p><p> {disguan[s]=0x02;}</p><p><b> }</b></p><p> /**********************
94、3鍵處理函數(shù) *************************/</p><p> void k3() {</p><p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p><p> {DisBuf[seat]=0;}</p><p&
95、gt;<b> else</b></p><p> DisBuf[seat]=0x03;</p><p><b> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b&g
96、t;</p><p> {Disnao[s]=0;}</p><p><b> else</b></p><p> Disnao[s]=0x03;</p><p><b> }</b></p><p> if(guan&&tiao)</p>
97、;<p><b> {</b></p><p><b> {if(s==0)</b></p><p> {disguan[s]=0;}</p><p><b> else</b></p><p> disguan[s]=0x03;</p>
98、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /********************** 4鍵處理函數(shù) *************************/</p><p>
99、 void k4() {</p><p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p><p> {DisBuf[seat]=0;}</p><p><b> else</b></p><p> Dis
100、Buf[seat]=0x04;</p><p><b> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b></p><p> {Disnao[s]=0;}</p><
101、;p><b> else</b></p><p> Disnao[s]=0x04;</p><p><b> }</b></p><p> if(guan&&tiao)</p><p><b> {if(s==0)</b></p>
102、<p> {disguan[s]=0;}</p><p><b> else</b></p><p> disguan[s]=0x04;</p><p><b> }</b></p><p><b> }</b></p><p>
103、/********************** 5鍵處理函數(shù) *************************/</p><p> void k5() {</p><p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p><p> {DisBuf[sea
104、t]=0;}</p><p> else if(DisBuf[0]==2&&seat==1)</p><p> {DisBuf[seat]=0;}</p><p><b> else</b></p><p> DisBuf[seat]=0x05;</p><p><b
105、> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b></p><p> {Disnao[s]=0;}</p><p> else if(Disnao[0]==2&&s==
106、1)</p><p> {Disnao[s]=0;}</p><p><b> else</b></p><p> Disnao[s]=0x05;</p><p><b> }</b></p><p> if(tiao&&guan)</p>
107、;<p><b> {if(s==0)</b></p><p> {disguan[s]=0;}</p><p> else if(disguan[0]==2&&s==1)</p><p> {disguan[s]=0;}</p><p><b> else</b&
108、gt;</p><p> disguan[s]=0x05;</p><p><b> }</b></p><p><b> }</b></p><p> void k6(){</p><p> if(tiao&&!nao&&!guan
109、)</p><p> {if(seat==0)</p><p> {DisBuf[seat]=0;}</p><p> else if(DisBuf[0]==2&&seat==1)</p><p> {DisBuf[seat]=0;}</p><p> else if (seat==3)<
110、;/p><p> {DisBuf[seat]=0;}</p><p> else if (seat==6)</p><p> {DisBuf[seat]=0;}</p><p><b> else</b></p><p> DisBuf[seat]=0x06;</p><
111、p><b> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b></p><p> {Disnao[s]=0;}</p><p> else if(Disnao[0]==2&am
112、p;&s==1)</p><p> {Disnao[s]=0;}</p><p> else if (s==3)</p><p> {Disnao[s]=0;}</p><p> else if (s==6)</p><p> {Disnao[s]=0;}</p><p>&l
113、t;b> else</b></p><p> Disnao[s]=0x06;</p><p><b> }</b></p><p> if(tiao&&guan)</p><p><b> {if(s==0)</b></p><p>
114、; {disguan[s]=0;}</p><p> else if(disguan[0]==2&&s==1)</p><p> {disguan[s]=0;}</p><p> else if (s==3)</p><p> {disguan[s]=0;}</p><p> else if
115、 (s==6)</p><p> {disguan[s]=0;}</p><p><b> else</b></p><p> disguan[s]=0x06;</p><p><b> }</b></p><p><b> }</b><
116、/p><p> void k7(){</p><p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p><p> {DisBuf[seat]=0;}</p><p> else if(DisBuf[0]==2&&sea
117、t==1)</p><p> {DisBuf[seat]=0;}</p><p> else if (seat==3)</p><p> {DisBuf[seat]=0;}</p><p> else if (seat==6)</p><p> {DisBuf[seat]=0;}</p><
118、;p><b> else</b></p><p> DisBuf[seat]=0x07;</p><p><b> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</
119、b></p><p> {Disnao[s]=0;}</p><p> else if(Disnao[0]==2&&s==1)</p><p> {Disnao[s]=0;}</p><p> else if (s==3)</p><p> {Disnao[s]=0;}</p>
120、;<p> else if (s==6)</p><p> {Disnao[s]=0;}</p><p><b> else</b></p><p> Disnao[s]=0x07;</p><p><b> }</b></p><p> if(ti
121、ao&&guan)</p><p><b> {if(s==0)</b></p><p> {disguan[s]=0;}</p><p> else if(disguan[0]==2&&s==1)</p><p> {disguan[s]=0;}</p><p
122、> else if (s==3)</p><p> {disguan[s]=0;}</p><p> else if (s==6)</p><p> {disguan[s]=0;}</p><p><b> else</b></p><p> disguan[s]=0x07;&l
123、t;/p><p><b> }</b></p><p><b> }</b></p><p> void k8(){</p><p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p&g
124、t;<p> {DisBuf[seat]=0;}</p><p> else if(DisBuf[0]==2&&seat==1)</p><p> {DisBuf[seat]=0;}</p><p> else if (seat==3)</p><p> {DisBuf[seat]=0;}</p&
125、gt;<p> else if (seat==6)</p><p> {DisBuf[seat]=0;}</p><p><b> else</b></p><p> DisBuf[seat]=0x08;</p><p><b> }</b></p><p
126、> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b></p><p> {Disnao[s]=0;}</p><p> else if(Disnao[0]==2&&s==1)</p><p> {Disnao[s
127、]=0;}</p><p> else if (s==3)</p><p> {Disnao[s]=0;}</p><p> else if (s==6)</p><p> {Disnao[s]=0;}</p><p><b> else</b></p><p>
128、 Disnao[s]=0x08;</p><p><b> }</b></p><p> if(tiao&&guan)</p><p><b> {if(s==0)</b></p><p> {disguan[s]=0;}</p><p> els
129、e if(disguan[0]==2&&s==1)</p><p> {disguan[s]=0;}</p><p> else if (s==3)</p><p> {disguan[s]=0;}</p><p> else if (s==6)</p><p> {disguan[s]=0;
130、}</p><p><b> else</b></p><p> disguan[s]=0x08;</p><p><b> }</b></p><p><b> }</b></p><p> void k9(){</p><
131、;p> if(tiao&&!nao&&!guan)</p><p> {if(seat==0)</p><p> {DisBuf[seat]=0;}</p><p> else if(DisBuf[0]==2&&s==1)</p><p> {DisBuf[seat]=0;}&l
132、t;/p><p> else if (seat==3)</p><p> {DisBuf[seat]=0;}</p><p> else if (seat==6)</p><p> {DisBuf[seat]=0;}</p><p><b> else</b></p><
133、p> DisBuf[seat]=0x09;</p><p><b> }</b></p><p> if(tiao&&nao&&!guan)</p><p><b> {if(s==0)</b></p><p> {Disnao[s]=0;}</
134、p><p> else if(Disnao[0]==2&&s==1)</p><p> {Disnao[s]=0;}</p><p> else if (s==3)</p><p> {Disnao[s]=0;}</p><p> else if (s==6)</p><p&g
135、t; {Disnao[s]=0;}</p><p><b> else</b></p><p> Disnao[s]=0x09;</p><p><b> }</b></p><p> if(tiao&&guan)</p><p><b>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 多功能電子時鐘設(shè)計(jì)
- 基于時鐘芯片的電子時鐘設(shè)計(jì)
- 電子時鐘
- 電子時鐘
- 電子時鐘
- 基于vhdl電子時鐘設(shè)計(jì)
- 基于arm的電子時鐘設(shè)計(jì)
- 基于verilog的電子時鐘報(bào)告
- 基于arduino的電子時鐘設(shè)計(jì)
- 電子畢業(yè)設(shè)計(jì)---多功能電子時鐘
- 基于fpga的電子時鐘設(shè)計(jì)
- 多功能電子時鐘畢業(yè)設(shè)計(jì)
- 電子時鐘,匯編,++
- 電子時鐘設(shè)計(jì)
- 電子時鐘論文
- 電子時鐘.doc
- 電子時鐘.doc
- 電子時鐘課程設(shè)計(jì)--數(shù)字電子時鐘焊接調(diào)試報(bào)告
- 電子時鐘課程設(shè)計(jì)--proteus環(huán)境下的電子時鐘設(shè)計(jì)
- 基于fpga的數(shù)字電子時鐘設(shè)計(jì)
評論
0/150
提交評論