基于8279的電子時鐘附加四個功能_第1頁
已閱讀1頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論