版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 任務(wù)書:</b></p><p> 設(shè)計(jì)一個(gè)電子數(shù)字鐘,顯示時(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> 走時(shí)程序:進(jìn)入走時(shí)程序后,如果沒有設(shè)定鬧鐘,則開定時(shí)器T0,以50ms為基礎(chǔ),循環(huán)20次。時(shí)間進(jìn)行變化,如果秒個(gè)位小于9,則一秒到,秒個(gè)位加1;如果秒個(gè)位等于9,則秒個(gè)位回0,同時(shí)判斷秒十位,如果秒十位小于5,則秒十位加1;如果秒十位等于5,則秒十位回0,同時(shí)判斷分個(gè)位,如果分個(gè)位小于9,則分十位加1;如果分十位等于9,則分十位回0,同時(shí)判斷分十位,如果分十位小于5,則一秒
3、到,分十位加1;如果分個(gè)位等于5,則分十位回0,同時(shí)判斷小時(shí)個(gè)位,如果小時(shí)個(gè)位小于9,則小時(shí)個(gè)位加1,如果小時(shí)十位等于5,則小時(shí)十位回0,按此規(guī)律,時(shí)鐘從00-00-00到23-59-59循環(huán)走時(shí)。</p><p><b> 2.主程序說明</b></p><p> 鬧鐘程序:設(shè)定鬧鐘后,時(shí)間到達(dá)所設(shè)鬧鐘點(diǎn)時(shí),進(jìn)入鬧鐘程序,響鈴并正常走時(shí),一分鐘后響鈴?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)時(shí)),guan(關(guān)閉),ce
5、wen(測溫)標(biāo)志位的不同,在8位LED上顯示時(shí)間,鬧鐘設(shè)置,定時(shí)關(guān)燈設(shè)置和測溫顯示。將共陰極數(shù)碼管所對(duì)應(yīng)的段碼寫入8279的顯示ROM中,可以將所對(duì)應(yīng)的信息顯示在數(shù)碼管上。</p><p> 測溫程序:當(dāng)測溫按鍵按下后,轉(zhuǎn)移到該程序。初始化DS18b20,先將DQ位置1,稍做延時(shí)后DQ置0,延時(shí)480us以上,然后拉高DQ總線,讀取DQ值,若初始化成功則返回presence=0。然后讀取DS18b20中的數(shù)據(jù)
6、并顯示在數(shù)碼管上,在這個(gè)過程中,時(shí)鐘仍然正常工作但不顯示在數(shù)碼管上,顯示溫度1秒鐘,之后再自動(dòng)回到時(shí)間顯示。</p><p> 調(diào)時(shí)間程序:當(dāng)系統(tǒng)檢測到調(diào)時(shí)按鍵按下后,進(jìn)入調(diào)時(shí)模式,關(guān)閉定時(shí)器T0;在待調(diào)的位置上顯示C,此時(shí)按下調(diào)節(jié)使能按鍵,使能數(shù)字鍵,按下數(shù)字鍵之后,可調(diào)節(jié)該位的時(shí)間,之后按下調(diào)節(jié)移位按鍵可以轉(zhuǎn)換到下一位進(jìn)行調(diào)節(jié),當(dāng)調(diào)節(jié)結(jié)束后可以按下走時(shí)鍵,即可走時(shí),在走時(shí)的同時(shí)屏蔽數(shù)字鍵。</p>
7、;<p> 鬧鐘設(shè)置程序:按下鬧鐘設(shè)置按鍵,顯示鬧鐘時(shí)間,按下鬧鐘移位按鍵可以調(diào)節(jié)所要調(diào)整的位置,待調(diào)整位上顯示C,在該位上按下相應(yīng)的數(shù)字鍵可以進(jìn)行調(diào)整,在這個(gè)過程中,時(shí)鐘仍然正常工作但不顯示在數(shù)碼管上,調(diào)節(jié)完畢后可以按下推出鬧鐘設(shè)置按鍵即可顯示時(shí)間。</p><p> 定時(shí)關(guān)燈程序:按下定時(shí)關(guān)燈設(shè)置按鍵,顯示關(guān)燈時(shí)間,繼續(xù)按下該鍵,改變調(diào)節(jié)的位置,待調(diào)位顯示C,按下相應(yīng)的數(shù)字鍵可以調(diào)節(jié)時(shí)間,在
8、這個(gè)過程中,時(shí)鐘仍然正常工作但不顯示在數(shù)碼管上,當(dāng)調(diào)節(jié)結(jié)束后可以按下退出定時(shí)關(guān)燈設(shè)置鍵,當(dāng)時(shí)鐘時(shí)間到達(dá)所設(shè)定的時(shí)間時(shí),定時(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> ?。?)XTAL1和XTAL2:外接晶振電路,頻率為12MHz</p><p> ?。?)RST:接手動(dòng)復(fù)位電路,實(shí)動(dòng)復(fù)位,顯示待命狀態(tài)C.</p><p> ?。?)AD[0…7]:接8279AD0-7,送低八位地址</p><p> ?。?)P2.0(A[8]):接8279A0,選擇數(shù)據(jù)口和狀態(tài)口</p><p&g
10、t; (6)P2.7(A[15]):接8279CS,進(jìn)行8279片選</p><p> ?。?)P3.6/WR:接8279WR,傳遞寫信號(hào)</p><p> ?。?)P3.7/RD:接8279RD,傳遞讀信號(hào)</p><p> ?。?)ALE:接8279CLK,設(shè)置8279掃描頻率</p><p> 2.8279(控制鍵盤和LED顯示)&
11、lt;/p><p> ?。?)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> (6)IRQ:懸空(采用查詢方式判斷是否有鍵按下,故不需接單片機(jī)的外部中斷)</p><p> (7)CLK:接AT89C51ALE</p><p><b> ?。?)RES:懸空</b></p><p> ?。?)RL0-3:接鍵盤電路列值,指示輸入鍵所在的列號(hào)</p&g
13、t;<p> (10)SL0-2:接74LS138,指示輸入鍵所在的行號(hào)</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燈(用來顯示時(shí)-分-秒)</p><
15、;p> ?。?)A-G和DP:接74HC373(1)Q0-Q7</p><p> (2)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 走時(shí)——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 時(shí)鐘移位——13H 鬧鐘移位——1bH</p><p><b> 溫度設(shè)置——20H</b></p><p> 退出溫度設(shè)置——21H</p><p> 定時(shí)關(guān)燈設(shè)置——22H</p><p> 退出關(guān)燈設(shè)置——23H</p><p><b>
18、 6.DS18b20</b></p><p> ?。?)GND管腳直接接地</p><p> (2)VCC接+5v</p><p> ?。?)DQ接單片機(jī)P1.1</p><p><b> 7.定時(shí)關(guān)燈</b></p><p> (1)三極管b極接單片機(jī)P1.2</p&g
19、t;<p> ?。?)三極管c極接繼電器的線圈,同時(shí)</p><p> 繼電器的靜觸點(diǎn)上外接220V燈泡</p><p> ?。?)繼電器線圈接續(xù)流二極管,防止</p><p><b> 三 軟件設(shè)計(jì)</b></p><p> 采用C語言編寫程序,我們的程序可以分為兩大模塊:主程序模塊(按鍵模塊、鬧
20、鐘模塊、定時(shí)關(guān)燈模塊,測溫模塊、調(diào)時(shí)模塊)和中斷程序模塊(走時(shí))。先將主要程序流程圖總結(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í)數(shù)組DisBuf[1]+1</p><p>&
23、lt;b> 是</b></p><p> 時(shí)數(shù)組DisBuf[1]=0</p><p> 時(shí)數(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)時(shí)子
25、程序</b></p><p><b> 4.主程序流程圖</b></p><p><b> 否</b></p><p><b> 四 調(diào)試</b></p><p> 無論是編程,還是畫電路圖,都遇到了很多的問題,尤其是對(duì)8279的了解過程很漫長,開始我對(duì)8
26、279的功能與應(yīng)用很陌生,以至于不知該如何著手,后來我們借了很多的資料,也研讀了課本上的相關(guān)內(nèi)容,花了很多的時(shí)間,才對(duì)其功能有所了解,下面我說一下我們?cè)趯?shí)現(xiàn)每一個(gè)功能的過程中遇到的困難和解決的辦法。</p><p> 1.按鍵與功能對(duì)應(yīng)不齊</p><p> (1)在散轉(zhuǎn)程序中,不同的子程序有各自的地址號(hào),由于考慮了無按鍵時(shí)的空函數(shù),占據(jù)了散轉(zhuǎn)函數(shù)的第一位地址,同時(shí),鍵碼表的數(shù)組是從零
27、開始的,所以返回時(shí),鍵碼表的按鍵返回值應(yīng)為J+1,這樣才能與散轉(zhuǎn)程序中對(duì)應(yīng)的按鍵處理程序所對(duì)應(yīng)</p><p> (2)4*5的鍵盤列線,按照課本通過上拉電阻接高電平,根本無法造成按鍵判斷,調(diào)時(shí)無從談起,按鍵右端會(huì)一直維持高電平,即使所在行有鍵按下,按鍵右邊也不會(huì)變?yōu)榈碗娖絺鞯搅芯€,傳送返回,反而連鍵的左邊也維持到高電平,查看8279FIFORAM,里邊沒有鍵碼傳入,后來我們將上拉電阻和高電平干脆去掉。<
28、/p><p> 在這一功能的實(shí)現(xiàn)過程最為漫長,因?yàn)榘凑諘系膱D連接鍵盤部分,可是一直無法中斷,當(dāng)時(shí)非常痛苦,找不到錯(cuò)誤到底在哪里,但經(jīng)過我們長時(shí)間的仔細(xì)討論和思索,將高電平和上拉電阻去掉,才能使用。 </p><p> 2.測溫函數(shù)無法退出</p><p> (1)開始的時(shí)候我們?yōu)榱税匆幌聹y溫鍵就能馬上反映出溫度的讀數(shù),將測溫子程序中的函數(shù)放在了while(1)中
29、,這樣按下溫度鍵后,LED就能立刻反映出溫度的讀數(shù)。但是,這樣做導(dǎo)致了按下測溫鍵之后,系統(tǒng)無法自主退出測溫子函數(shù),陷入while(1)循環(huán)中,更無法正常顯示時(shí)間,為了解決這個(gè)問題我們將while()中的條件更改為while(cewen),并且在計(jì)時(shí)器中記滿一秒之后,令cewen=0,這樣就可以使while退出循環(huán),正常顯示走時(shí)的時(shí)間。</p><p> ?。?)上述問題解決后,我們?cè)谡{(diào)試的過程中又發(fā)現(xiàn)一個(gè)BUG,
30、按下調(diào)時(shí)鍵進(jìn)行時(shí)間調(diào)整之后,再按下測溫鍵,系統(tǒng)又無法退出溫度顯示,此時(shí)系統(tǒng)出現(xiàn)死機(jī)。經(jīng)過我們對(duì)程序的認(rèn)真梳理,發(fā)現(xiàn)測溫的退出條件依賴于定時(shí)器一秒計(jì)時(shí)到時(shí),cewen=0,而在調(diào)時(shí)時(shí),我們關(guān)閉了計(jì)時(shí)器中斷,這樣,在一秒到之后系統(tǒng)沒有響應(yīng)中斷將cewen置為0,于是系統(tǒng)無法退出測溫顯示,我們又將cewen的while條件改為(cewen&&EA),保證了測溫時(shí)定時(shí)器中斷的打開。這樣,如果EA=0,while循環(huán)會(huì)自動(dòng)退出,而
31、不會(huì)造成死機(jī)。</p><p><b> 。</b></p><p> 3.待調(diào)位顯示C不正常</p><p> 當(dāng)調(diào)時(shí)和調(diào)鬧鐘時(shí),我們的待調(diào)位應(yīng)該顯示C,可是由于顯示C的子程序調(diào)用時(shí),放得位置不對(duì),導(dǎo)致C亂顯示,修改C顯示的位置,在每次按下調(diào)時(shí)或鬧鐘后或修改SEAT后,再顯示C,C就可以在正確的位置顯示了。</p>&l
32、t;p><b> 4.數(shù)字鍵屏蔽</b></p><p> ?。?)在正常走時(shí)時(shí),我們發(fā)現(xiàn)如果誤碰數(shù)字鍵就會(huì)將走時(shí)時(shí)間改變,這樣影響了時(shí)鐘走時(shí)的可靠性,為此,我們?cè)O(shè)置了tiao標(biāo)志位,只有在tiao為1時(shí),數(shù)字鍵才能對(duì)時(shí)鐘進(jìn)行調(diào)表,并且每當(dāng)調(diào)表結(jié)束后,按下走時(shí)鍵,tiao位就會(huì)置0,屏蔽數(shù)字按鍵。</p><p> ?。?)在調(diào)時(shí)時(shí),我們發(fā)現(xiàn)如果不加以限制,每
33、一位的數(shù)字是可以任意更改的,可能造成錯(cuò)誤的時(shí)間組合,比如說26-73-67,這樣完全不合邏輯的時(shí)間組合,為了減少人為造成的上述影響,我們進(jìn)行了數(shù)字鍵鍵位屏蔽,例如,第一位數(shù)字只能為0、1、2,第二位數(shù)字可為0~9,但是一旦第一位數(shù)字為2,第二位只能為0~3,以此類推,所有的數(shù)字鍵都進(jìn)行了鍵位屏蔽,保證時(shí)鐘的準(zhǔn)確性。</p><p> 5.調(diào)時(shí)時(shí)待調(diào)位C無法顯示</p><p> 開始時(shí)
34、,我們以為設(shè)置好tiao標(biāo)志位就可以方便的進(jìn)行調(diào)表了,但是很快又發(fā)現(xiàn),待調(diào)位不能正常的顯示C,原因是因?yàn)槲覀儧]有給定的標(biāo)志位設(shè)定標(biāo)簽,于是,我們?cè)O(shè)定標(biāo)志位SEAT,當(dāng)按下調(diào)時(shí)鍵,給8279顯示RAM的首地址寫入C字型碼,時(shí)鐘十位顯示C,當(dāng)按下時(shí)鐘位移時(shí),SEAT改變,從而使顯示C的位置改變,舉例:按下時(shí)鐘位移鍵,如果SEAT=1,則小時(shí)個(gè)位顯示C,如果SEAT=4,在鬧鐘情況下,小時(shí)的十位顯示C,在調(diào)時(shí)情況下,秒十位顯示C;按下左移鍵,
35、如果SEAT=3,小時(shí)十位顯示C,如果SEAT=1,在鬧鐘情況下,分鐘個(gè)位顯示C,在調(diào)時(shí)情況下,秒個(gè)位顯示C。</p><p> 5.所有都修改成功后的程序說明</p><p> 單片機(jī)上電后,時(shí)鐘從00-00-00開始走時(shí),按下調(diào)試鍵,第一位顯示C,開始對(duì)第一位調(diào)節(jié),以后通過控制移位鍵來修改所調(diào)位,調(diào)好之后,按下走時(shí)鍵,程序開始正常走時(shí);如果正常走時(shí)時(shí),按下鬧鐘鍵,第一位顯示C,開始
36、對(duì)第一位定時(shí),控制移位鍵修改鬧鐘時(shí)間,修改好后按走時(shí)鍵,期間時(shí)鐘正常走時(shí)。同理,可以調(diào)節(jié)定時(shí)關(guān)燈時(shí)間。與此同時(shí),如果按下測溫鍵,屏幕上顯示所測溫度,期間時(shí)間正常走時(shí),1秒鐘后回到時(shí)間顯示。</p><p> 五 新增功能及實(shí)現(xiàn)方法</p><p> 本設(shè)計(jì)有四個(gè)新增功能:</p><p><b> ?。?)定時(shí)關(guān)燈</b></p&g
37、t;<p><b> ?。?)鬧鐘取消按鍵</b></p><p> ?。?)走時(shí)時(shí)按鍵屏蔽。</p><p><b> ?。?)測量溫度</b></p><p><b> 1.定時(shí)關(guān)燈</b></p><p> 在現(xiàn)代家居中,有時(shí)為了解決時(shí)間,需要對(duì)家用電器
38、進(jìn)行定時(shí)操作,為了滿足人們對(duì)于家用電器的定時(shí)操作,我們?cè)O(shè)計(jì)了定時(shí)關(guān)燈環(huán)節(jié),通過單片機(jī)的管腳驅(qū)動(dòng)PNP型三極管實(shí)現(xiàn)繼電器的關(guān)合,從而控制家用電器。</p><p><b> 2.鬧鐘取消按鍵</b></p><p> 鬧鐘響時(shí),按下取消鍵,進(jìn)入取消鍵中斷程序,修改鬧鐘時(shí)間,使其為一個(gè)不可能達(dá)到的值,從而取消鈴聲;如果設(shè)有鬧鐘且時(shí)間未到,按下取消鍵,同樣賦一個(gè)不可能走
39、到的值,從而取消鬧鐘。</p><p><b> 3.屏蔽按鍵功能</b></p><p> 正常走時(shí)時(shí),只有四個(gè)鍵有效:走時(shí)鍵、鬧鐘鍵、調(diào)試鍵和取消鬧鐘鍵,測溫鍵,調(diào)節(jié)定時(shí)關(guān)燈鍵。按下調(diào)時(shí)鍵和調(diào)節(jié)使能鍵之后,數(shù)字鍵取消屏蔽,設(shè)置好時(shí)間之后,按下調(diào)節(jié)使能鍵,再次屏蔽數(shù)字鍵。同時(shí)在設(shè)定時(shí)間時(shí),小時(shí)首位只能在0~2,分鐘和秒的首位只能為0~5,當(dāng)小時(shí)首位為2時(shí),小時(shí)次
40、位只能為0~3。</p><p><b> 4.測溫功能</b></p><p> 在正常工作時(shí),數(shù)碼管顯示時(shí)間,當(dāng)按下測溫鍵后,可以顯示DS18b20中的溫度。顯示的格式為Cdd+溫度+℃,可以顯示兩位或三位溫度數(shù)據(jù),測溫范圍為-55~128℃。</p><p><b> 六 小結(jié)與體會(huì)</b></p&g
41、t;<p> 通過此次課程設(shè)計(jì),我真的收獲很多,包括硬件和軟件。</p><p> 編程的過程中,幾乎使用所用了所有的課本講述基本C語言,所以無疑對(duì)課本單片機(jī)內(nèi)容有了更深的理解和體會(huì),更深地了解了它的原理和應(yīng)用,比如單片機(jī)的晶振電路、復(fù)位電路、低八位地址傳送端P0口、高八位地址傳送端口P2口、外部中斷口INT1及WR和RD寫和讀口等。另外就是對(duì)芯片8279的原理學(xué)習(xí)和應(yīng)用,從很陌生到熟練應(yīng)用,了
42、解它的初始化(包括清零,設(shè)定標(biāo)值等),了解它的OUT_A和OUT_B口(傳遞字型碼)、ALE(設(shè)定掃描頻率)、IQR(傳遞中斷信號(hào))、RL0-3(接鍵盤電路列值,指示輸入鍵所在的列號(hào))、SL0-2(接74HC138A-C,指示輸入鍵所在的行號(hào))等,了解它的LED顯示和鍵盤掃描、它內(nèi)部的顯示RAM和FIFO RAM。</p><p> 對(duì)DS18B20溫度傳感器單總線協(xié)議的學(xué)習(xí),讓我對(duì)單片機(jī)時(shí)序控制的重要性有了更
43、深層次的理解,單總線協(xié)議完全依靠主機(jī)的時(shí)序命令對(duì)從機(jī)進(jìn)行操作,進(jìn)行寫和讀,任何時(shí)序的錯(cuò)誤都可能導(dǎo)致數(shù)據(jù)的出錯(cuò),這告訴我們以后的設(shè)計(jì)應(yīng)該注意器件時(shí)序的配合。</p><p> 對(duì)KEIL和PROTEUS軟件的應(yīng)用很熟練,包括KEIL軟件的建工程、加入ASM文件、連接和編譯以及PROTEUS軟件的畫圖細(xì)節(jié)和調(diào)試運(yùn)行步驟等(尤其是PROTEUS的應(yīng)用,以前使用較少,在使用的過程中遇到了很多的問題,比如裝軟件和源程序顯
44、示,都費(fèi)了很長的時(shí)間進(jìn)行了解和學(xué)習(xí))。</p><p> 通過這次編程,我們犯了很多的錯(cuò)誤,幾乎數(shù)都數(shù)不清,我們編程開始的比較早,但卻很晚才編好,所以我覺得編程序一定得思路已經(jīng)清晰了,再去著手編寫,否則漏洞百出,出現(xiàn)各種各樣的錯(cuò)誤,這無疑增加煩躁情緒,但是我很慶幸我和我的同組同學(xué),克服那么多的困難,成功將程序編好,實(shí)現(xiàn)每一個(gè)功能,并且有附加功能,我很欣慰,這也歸功于我們的堅(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í)間設(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í)函數(shù)*******/</p><p> void delay(unsigned int num)//延時(shí)函數(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); //稍做延時(shí)</p><p> DQ = 0; //單片機(jī)將DQ拉低</p><
73、p> delay(90); //精確延時(shí) 大于 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); //返回信號(hào),0=presence,1= no presence</p><p><b> }</b></p><p> /*************************
75、*********************************/</p><p> unsigned char ReadOneChar()//讀一個(gè)字節(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; // 給脈沖信號(hào)</p><p> dat >>= 1;</p>
77、;<p> DQ = 1; // 給脈沖信號(hào)</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)//寫一個(gè)字節(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); // 跳過讀序號(hào)列號(hào)的操作</p>&
85、lt;p> WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作</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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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í)鐘設(shè)計(jì)
- 基于時(shí)鐘芯片的電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘
- 電子時(shí)鐘
- 電子時(shí)鐘
- 基于vhdl電子時(shí)鐘設(shè)計(jì)
- 基于arm的電子時(shí)鐘設(shè)計(jì)
- 基于verilog的電子時(shí)鐘報(bào)告
- 基于arduino的電子時(shí)鐘設(shè)計(jì)
- 電子畢業(yè)設(shè)計(jì)---多功能電子時(shí)鐘
- 基于fpga的電子時(shí)鐘設(shè)計(jì)
- 多功能電子時(shí)鐘畢業(yè)設(shè)計(jì)
- 電子時(shí)鐘,匯編,++
- 電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘論文
- 電子時(shí)鐘.doc
- 電子時(shí)鐘.doc
- 電子時(shí)鐘課程設(shè)計(jì)--數(shù)字電子時(shí)鐘焊接調(diào)試報(bào)告
- 電子時(shí)鐘課程設(shè)計(jì)--proteus環(huán)境下的電子時(shí)鐘設(shè)計(jì)
- 基于fpga的數(shù)字電子時(shí)鐘設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論