2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩60頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論