單片機(jī)開發(fā)工程案例分析與解析_第1頁
單片機(jī)開發(fā)工程案例分析與解析_第2頁
單片機(jī)開發(fā)工程案例分析與解析_第3頁
單片機(jī)開發(fā)工程案例分析與解析_第4頁
單片機(jī)開發(fā)工程案例分析與解析_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、電子行業(yè)網(wǎng)址大全您工作和學(xué)習(xí)的好幫手3 單片機(jī)開發(fā)工程案例分析與解析3.1 定時報警器設(shè)計一個單片機(jī)控制的簡易定時報警器。要求根據(jù)設(shè)定的初始值(1-59秒)進(jìn)行倒計時,當(dāng)計時到0時數(shù)碼管閃爍“00”(以1Hz閃爍),按鍵功能如下:(1)設(shè)定鍵:在倒計時模式時,按下此鍵后停止倒計時,進(jìn)入設(shè)置狀態(tài);如果已經(jīng)處于設(shè)置狀態(tài)則此鍵無效。(2)增一鍵:在設(shè)置狀態(tài)時,每按一次遞增鍵,初始值的數(shù)字增1。(3)遞一鍵:在設(shè)置狀態(tài)時,每按一次遞減鍵,初始值的數(shù)字減1。(4)確認(rèn)鍵:在設(shè)置狀態(tài)時,按下此鍵后,單片機(jī)按照新的初始值進(jìn)行倒計時及顯示倒計時的數(shù)字。如果已經(jīng)處于計時狀態(tài)則此鍵無效。3.1.2 模塊1:系統(tǒng)設(shè)

2、計(1)任務(wù)分析與整體設(shè)計思路根據(jù)題目的要求,需要實現(xiàn)如下幾個方面的功能。計時功能:要實現(xiàn)計時功能則需要使用定時器來計時,通過設(shè)置定時器的初始值來控制溢出中斷的時間間隔,再利用一個變量記錄定時器溢出的次數(shù),達(dá)到定時1秒中的功能。然后,當(dāng)計時每到1秒鐘后,倒計時的計數(shù)器減1。當(dāng)?shù)褂嫊r計數(shù)器到0時,觸發(fā)另一個標(biāo)志變量,進(jìn)入閃爍狀態(tài)。顯示功能:顯示倒計時的數(shù)字要采用動態(tài)掃描的方式將數(shù)字拆成“十位”和“個位”動態(tài)掃描顯示。如果處于閃爍狀態(tài),則可以不需要動態(tài)掃描顯示,只需要控制共陰極數(shù)碼管的位控線,實現(xiàn)數(shù)碼管的滅和亮。鍵盤掃描和運行模式的切換:主程序在初始化一些變量和寄存器之后,需要不斷循環(huán)地讀取鍵盤的

3、狀態(tài)和動態(tài)掃描數(shù)碼管顯示相應(yīng)的數(shù)字。根據(jù)鍵盤的按鍵值實現(xiàn)設(shè)置狀態(tài)、計時狀態(tài)的切換。 (2)單片機(jī)型號及所需外圍器件型號,單片機(jī)硬件電路原理圖選用MCS-51系列AT89S51單片機(jī)作為微控制器,選擇兩個四聯(lián)的共陰極數(shù)碼管組成8位顯示模塊,由于AT89S51單片機(jī)驅(qū)動能力有限,采用兩片74HC244實現(xiàn)總線的驅(qū)動,一個74HC244完成位控線的控制和驅(qū)動,另一個74HC244完成數(shù)碼管的7段碼輸出,在輸出口上各串聯(lián)一個100歐姆的電阻對7段數(shù)碼管限流。由于鍵盤數(shù)量不多,選擇獨立式按鍵與P1口連接作為四個按鍵輸入。沒有鍵按下時P1.0-P1.3為高電平,當(dāng)有鍵按下時,P1.0-P1.3相應(yīng)管腳為低

4、電平。電路原理圖如圖3-1所示。 圖3-1 定時報警器電路原理圖(3)程序設(shè)計思路,單片機(jī)資源分配以及程序流程 單片機(jī)資源分配采用單片機(jī)的P3口作為按鍵的輸入,使用獨立式按鍵與P3.0-P3.3連接,構(gòu)成四個功能按鍵。在計時功能中,需要三個變量分別暫存定時器溢出的次數(shù)(T1_cnt)、倒計時的初始值(init_val)以及當(dāng)前倒計時的秒數(shù)(cnt_val)。按鍵掃描功能中,需要兩個變量,一個變量(key_val_new)用來存儲當(dāng)前掃描的鍵值(若無按鍵按下則為255),另一個變量(key_val_old)用來存儲上一次掃描的鍵值。只有這兩個變量值不一樣時,才能說明是一次新的按鍵按下或彈起了,同

5、時將新的鍵值賦給key_val_old變量。在顯示功能中,需要定義一組數(shù)組(code類型),值為0-9數(shù)字對應(yīng)的數(shù)碼管7段碼。還需要定義一個變量(show_val)暫存要顯示的數(shù)據(jù),用于動態(tài)掃描顯示中。在整個程序中,定義了一個狀態(tài)變量(state_val)用來存儲當(dāng)前單片機(jī)工作在哪種狀態(tài)。程序設(shè)計思路鑒于題目要求,存在三種工作模式:初始值設(shè)置模式、倒計時模式、計時到0時的閃爍模式。變量state_val為0時,處于倒計時模式。變量state_val為1時,處于初始值設(shè)置模式。變量state_val為2時,處于閃爍模式。這些狀態(tài)的切換取決于按下哪一個鍵以及是否計時到0。狀態(tài)的切換圖如圖3-2 圖

6、3-2 狀態(tài)的切換單片機(jī)復(fù)位之后,默認(rèn)處于倒計時模式,啟動定時器,定時器每隔250us溢出一次,根據(jù)定時器溢出次數(shù)來計時,到1秒時將時間的計數(shù)器減1。當(dāng)“設(shè)置鍵”按下時,變量state_val由0變?yōu)?,切換到設(shè)置模式。可以使用“遞增鍵”“遞減鍵”對計時初始值進(jìn)行修改。按下“確認(rèn)鍵”時,回到計時模式開始以新的初始值進(jìn)行倒計時。當(dāng)?shù)褂嫊r到0時,變量state_val由1變?yōu)?,處于閃爍狀態(tài),在這種狀態(tài)下,根據(jù)按鍵的情況分別又切換到計時和設(shè)置狀態(tài)。程序流程主程序首先需要初始化定時器的參數(shù)和一些變量,然后進(jìn)入一個循環(huán)結(jié)構(gòu),在循環(huán)中始終只做兩件事,一是鍵盤的掃描,二是數(shù)碼管的動態(tài)掃描。在掃描鍵盤后,根

7、據(jù)前一次按鍵的結(jié)果是否與本次鍵值相同。如果不同,表示有鍵按下或彈起,同時用本次按鍵值更新上一次的按鍵值。這樣設(shè)計旨在避免一個按鍵長時間按下時被重復(fù)判為有新鍵按下,使得當(dāng)前按下的鍵只有松開后,下一次按下時才算為一次新的按鍵。根據(jù)按鍵的值分別改變變量(state_val)的值或者在設(shè)置狀態(tài)時的倒計時初始值。完整的主程序圖如圖3-3所示。 圖3-3 主程序的流程圖 在定時器的參數(shù)中,選擇定時器T1的8位自動裝載模式,每250us產(chǎn)生一次溢出中斷,中斷服務(wù)程序如圖3-4所示。 圖3-4中斷服務(wù)程序流程圖(4)軟硬件調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在“文件新建文件”中,新建C語言源程序文件,編寫相應(yīng)

8、的程序。在“文件新建項目”的菜單中,新建項目并將C語言源程序文件包括在項目文件中。 在 “項目編譯”菜單中將C源文件編譯,檢查語法錯誤及邏輯錯誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。硬件調(diào)試方案:在設(shè)計平臺中,將單片機(jī)的P3.0-P3.3分別與獨立式鍵盤的相應(yīng)位通過插線連接起來。在偉福中將程序文件編譯成目標(biāo)文件后,運行MCU下載程序,選擇相應(yīng)的flash 數(shù)據(jù)文件,點擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。然后,上電重新啟動單片機(jī),檢查所編寫的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。3.1.3 程序設(shè)計(僅供參考的C語言源程序)/晶

9、振:11.0592M T1-250微秒 按鍵P10 P11 P12 P13/*變量的定義: show_val: 顯示的值0-59 init_val: 初始值 state_val: 狀態(tài)值 0-計數(shù)狀態(tài);1-設(shè)置狀態(tài);2-閃爍狀態(tài) shan_val: key_val1: 四個按鍵的值 255-無鍵;1-設(shè)置鍵 2-增一鍵 3-減一鍵 4-確定鍵 T1_cnt: 定時器計數(shù)溢出數(shù) cnt_val: 倒計時的數(shù)值 led_seg_code:數(shù)碼管7段碼*/#include "reg51.h" /包含文件sbit P1_0=P10; /設(shè)置鍵sbit P1_1=P11; /增一鍵s

10、bit P1_2=P12; /減一鍵sbit P1_3=P13; /確定鍵unsigned char data shan_val; /閃爍時LED的開/關(guān)狀態(tài)unsigned char data cnt_val; /保存倒計數(shù)的當(dāng)前值unsigned int data T1_cnt; /保存定時器溢出次數(shù)unsigned char data key_val_new,key_val_old;/存放當(dāng)前掃描的鍵和前一次按下的鍵值unsigned char data state_val; /狀態(tài)值unsigned char data show_val; /存放需要在數(shù)碼管顯示的數(shù)字unsigned

11、char data init_val; /暫存倒計數(shù)的初始值char code led_seg_code10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/-延時-void delay(unsigned int i) /大約延時i*2個微秒 while(-i);/-按鍵掃描-unsigned char scan_key() unsigned char i; i=P1&0x0f; delay(100); /延時,去抖動 if (i=(P1&0x0f) if (P1_0=0) i=1; else if (P1_1=0) i

12、=2; else if (P1_2=0) i=3; else if (P1_3=0) i=4; else i=255; return i;/-數(shù)碼管顯示-void led_show(unsigned int v) unsigned char i; if (state_val!=2) /動態(tài)掃描 i=v%10; /取要顯示的數(shù)的個位 P0=led_seg_codei; /轉(zhuǎn)換為7段碼 P2=0xfe; /顯示個位 delay(15); /延時 i=v%100/10; /取十位 P0=led_seg_codei; /轉(zhuǎn)換為7段碼 P2=0xfd; /顯示十位 delay(5); /延時 else

13、P0=led_seg_code0; /處于閃爍狀態(tài) if (shan_val) P2=0xff; /將數(shù)碼管的關(guān)閉 else P2=0xfc; /將數(shù)碼管的打開 /-定時器T1中斷服務(wù)程序-void timer1() interrupt 3 /T1中斷,250us中斷一次 T1_cnt+; switch (state_val) case 0: if(T1_cnt>3999) /如果計數(shù)>3999, 計時1s T1_cnt=0; if(cnt_val!=0) cnt_val-; else state_val=2; /定時計數(shù)到0時,切換狀態(tài) show_val=cnt_val; bre

14、ak; case 2: if(T1_cnt>1999) /如果計數(shù)>1999, 計時0.5s T1_cnt=0; shan_val=!shan_val; /閃爍狀態(tài) break; /-主程序-main()init_val=59; /初始化各變量 cnt_val=init_val; show_val=cnt_val; state_val=0; key_val_old=255; T1_cnt=0; shan_val=0; /初始化51的寄存器TMOD=0x20; /用T1計時 8位自動裝載定時模式 TH1=0x19; /250微秒溢出一次; 250=(256-x)*12/11.0592

15、 -> x= 230.4 TL1=0x19; EA=1; /打開總中斷允許 ET1=1; /開中斷允許 TR1=1; /開定時器T1while(1) key_val_new=scan_key(); / 255表示無鍵按下 if (key_val_new!=key_val_old) / 只有當(dāng)前掃描的鍵值與上次掃描的不同,才判斷是有鍵按下 key_val_old=key_val_new; switch (key_val_new) case 1: /設(shè)置鍵 state_val=1; /處于設(shè)置狀態(tài) TR1=1; /停止計時 show_val=init_val; /顯示原來的倒計數(shù)初始值 br

16、eak; case 2: if(state_val=1) /只有在設(shè)置狀態(tài),增1鍵才有用 if (init_val>0) /更改原來的倒計數(shù)初始值 init_val-; else init_val=59; show_val=init_val;/顯示更改后的倒計數(shù)初始值 break; case 3: if(state_val=1) /只有在設(shè)置狀態(tài),減1鍵才有用 if (init_val<59) /更改原來的倒計數(shù)初始值 init_val+; else init_val=0; show_val=init_val; /顯示更改后的計數(shù)初始值 break; case 4: if(stat

17、e_val!=0) /如果已處于計數(shù)模式,確認(rèn)鍵不起作用 cnt_val=init_val; /將初始值賦給計數(shù)變量 show_val=cnt_val; /將計數(shù)變量的數(shù)字顯示 TR1=1; /啟動定時器T1 state_val=0; /將狀態(tài)切換為計數(shù)模式 break; led_show(show_val); /動態(tài)掃描3.2 交通燈設(shè)計一個基于單片機(jī)的交通燈信號控制器。已知東、西、南、北四個方向各有紅黃綠色三個燈,在東西方向有兩個數(shù)碼管,在南北方向也有兩個數(shù)碼管。要求交通燈按照表1進(jìn)行顯示和定時切換,并要求在數(shù)碼管上分別倒計時顯示東西、南北方向各狀態(tài)的剩余時間。表1 交通燈的狀態(tài)切換表南北

18、方向東西方向序號狀態(tài)序號狀態(tài)1綠燈亮25秒,紅、黃燈滅1紅燈亮30秒,綠、黃燈滅2黃燈亮5秒,紅、綠燈滅3紅燈亮30秒,綠、黃燈滅2綠燈亮25秒,紅、黃燈滅3黃燈亮25秒,紅、綠燈滅回到狀態(tài)1回到狀態(tài)1模塊1:系統(tǒng)設(shè)計(1)任務(wù)分析與整體設(shè)計思路試題要求實現(xiàn)的功能主要包括計時功能、動態(tài)掃描以及狀態(tài)的切換等幾部分。計時功能:要實現(xiàn)計時功能則需要使用定時器來計時,通過設(shè)置定時器的初始值來控制溢出中斷的時間間隔,再利用一個變量記錄定時器溢出的次數(shù),達(dá)到定時1秒中的功能。當(dāng)計時每到1秒鐘后,東西、南北信號燈各狀態(tài)的暫存剩余時間的變量減1。當(dāng)暫存剩余時間的變量減到0時,切換到下一個狀態(tài),同時將下一個狀態(tài)

19、的初始的倒計時值裝載到計時變量中。開始下一個狀態(tài),如此循環(huán)重復(fù)執(zhí)行。動態(tài)掃描:需要使用4個數(shù)碼管分別顯示東西、南北的倒計時數(shù)字,將暫存各狀態(tài)剩余時間的數(shù)字從變量中提取出“十位”和“個位”,用動態(tài)掃描的方式在數(shù)碼管中顯示。整個程序依據(jù)定時器的溢出數(shù)來計時,每計時1S則相應(yīng)狀態(tài)的剩余時間減1,一直減到0時觸發(fā)下一個狀態(tài)的開始。 (2)單片機(jī)型號及所需外圍器件型號,單片機(jī)硬件電路原理圖 圖3-5 交通燈硬件電路原理圖選用MCS51系列AT89S51單片機(jī)作為微控制器,選擇兩個四聯(lián)的共陰極數(shù)碼管組成8位顯示模塊,由于AT89S51單片機(jī)驅(qū)動能力有限,采用兩片74HC244實現(xiàn)總線的驅(qū)動,一個74HC2

20、44完成共陰極數(shù)碼管位控線的控制和驅(qū)動,另一個74HC244完成數(shù)碼管的7段碼輸出,在7段碼輸出口上各串聯(lián)一個100歐姆的電阻對7段數(shù)碼管限流。用P3口的P3.0-P3.5完成發(fā)光二極管的控制,實現(xiàn)交通燈信號的顯示,每個發(fā)光二極管串聯(lián)500歐姆電阻起限流作用。硬件電路原理圖如圖3-5所示。(3)程序設(shè)計思路,單片機(jī)資源分配以及程序流程單片機(jī)資源分配單片機(jī)P3口的P3.0-P3.1引腳用作輸出,控制發(fā)光二極管的顯示。在計時模塊中,需要定義兩個數(shù)組變量(init_sn3,init_ew3)來存儲東西、南北兩個方向在不同狀態(tài)中倒計時的初始值,題目中每個方向的交通燈共有3種顯示狀態(tài),因此數(shù)組元素個數(shù)為

21、3。還需要定義兩個變量( cnt_ sn, cnt_ ew)暫存東西、南北兩個方向的倒計時剩余時間。 在狀態(tài)的切換中,為了明確當(dāng)前處于哪種狀態(tài),東西、南北方向各設(shè)置一個狀態(tài)變量(state_val_sn, state_val_ew),當(dāng)?shù)褂嫊r的剩余時間到零時,狀態(tài)變量增1,表示啟動下一個狀態(tài),當(dāng)該變量增到3時變?yōu)?,回到序號為1的狀態(tài)。 程序設(shè)計思路在設(shè)計中,由于沒有鍵盤功能,因此只涉及定時計數(shù)和動態(tài)掃描功能。主程序?qū)⒆兞砍跏蓟?,設(shè)置單片機(jī)定時器和中斷特殊功能寄存器的初始值,將定時器T1的工作方式設(shè)置為8位自動裝載模式,定時器每隔250us產(chǎn)生一次溢出。在初始化變量與寄存器后,主程序進(jìn)入一

22、個循環(huán)結(jié)構(gòu),在循環(huán)中只做動態(tài)掃描的工作,根據(jù)東西、南北兩向的剩余時時間進(jìn)行動態(tài)掃描顯示。 計時以及狀態(tài)的切換通過定時器的中斷服務(wù)程序來實現(xiàn),在中斷服務(wù)程序中,每計時到一秒時,則各方向當(dāng)前狀態(tài)的剩余時間減1,一直減到0時觸發(fā)下一個狀態(tài)的開始,改變交通燈的指示。 程序流程 圖3-7 交通燈主程序流程圖 圖3-8 中斷服務(wù)程序流程圖(4)軟硬件調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在“文件新建文件”中,新建C語言源程序文件,編寫相應(yīng)的程序。在“文件新建項目”的菜單中,新建項目并將C語言源程序文件包括在項目文件中。 在 “項目編譯”菜單中將C源文件編譯,檢查語法錯誤及邏輯錯誤。在編譯成功后,產(chǎn)生以 “*

23、.hex”和“*.bin” 后綴的目標(biāo)文件。硬件調(diào)試方案:在設(shè)計平臺中,將單片機(jī)的P3.0-P3.5分別與獨立式鍵盤的相應(yīng)位通過插線連接起來。在偉福中將程序文件編譯成目標(biāo)文件后,運行“MCU下載程序”,選擇相應(yīng)的flash 數(shù)據(jù)文件,點擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。然后,上電重新啟動單片機(jī),檢查所編寫的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。 程序設(shè)計(僅供參考的C語言源程序)/晶振:11.0592M T1-250微秒溢出一次/*變量的定義: show_val_sn,show_val_ew: 顯示的值0-59 state_val_sn,state_val_

24、ew: 狀態(tài)值 南北方向0-綠燈亮;1-黃燈亮;2-紅燈亮 T1_cnt: 定時器計數(shù)溢出數(shù) cnt_sn,cnt_ew: 倒計時的數(shù)值 init_sn3,init_ew3 倒計時 led_seg_code:數(shù)碼管7段碼*/#include "reg51.h"sbit SN_green=P32 ;/南北方向綠燈sbit SN_yellow=P31 ;/南北方向黃燈sbit SN_red=P30 ;/南北方向紅燈sbit EW_green=P35 ;/東西方向綠燈sbit EW_yellow=P34 ;/東西方向黃燈sbit EW_red=P33 ;/東西方向紅燈unsign

25、ed char data cnt_sn,cnt_ew;unsigned int data T1_cnt;unsigned char data state_val_sn,state_val_ew;char code led_seg_code10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;char code init_sn3=24,4,29;char code init_ew3=29,24,4;/-void delay(unsigned int i)/延時 while(-i); /-void led_show(unsigned int

26、u,unsigned int v) unsigned char i; i=u%10; /暫存?zhèn)€位 P0=led_seg_codei; P2=0xbf; delay(100); /延時 i=u%100/10; /暫存十位 P0=led_seg_codei; P2=0x7f; delay(100); /延時 i=v%10; /暫存?zhèn)€位 P0=led_seg_codei; P2=0xfe; delay(100); /延時 i=v%100/10; /暫存十位 P0=led_seg_codei; P2=0xfd; delay(100); /延時/-void timer1() interrupt 3 /T

27、1中斷 T1_cnt+; if(T1_cnt>3999) /如果計數(shù)>3999, 計時1s T1_cnt=0; if (cnt_sn!=0) /南北方向計時 cnt_sn-; else state_val_sn+; if (state_val_sn>2) state_val_sn=0; cnt_sn=init_snstate_val_sn; switch (state_val_sn) /根據(jù)狀態(tài)值,刷新各信號燈的狀態(tài) case 0: SN_green=0 ;/南北方向綠燈 SN_yellow=1 ;/南北方向黃燈 SN_red=1 ;/南北方向紅燈 break; case 1

28、: SN_green=1 ;/南北方向綠燈 SN_yellow=0 ;/南北方向黃燈 SN_red=1 ;/南北方向紅燈 break; case 2:SN_green=1 ;/南北方向綠燈 SN_yellow=1 ;/南北方向黃燈 SN_red=0 ;/南北方向紅燈 break; if (cnt_ew!=0) /東西方向計時 cnt_ew-; else state_val_ew+; if (state_val_ew>2) state_val_ew=0; cnt_ew=init_ewstate_val_ew; switch (state_val_ew) /根據(jù)狀態(tài)值,刷新各信號燈的狀態(tài) c

29、ase 0: EW_green=1 ;/東西方向綠燈 EW_yellow=1;/東西方向黃燈 EW_red=0 ;/東西方向紅燈 break; case 1: EW_green=0 ;/東西方向綠燈 EW_yellow=1 ;/東西方向黃燈 EW_red=1 ;/東西方向紅燈 break; case 2: EW_green=1 ;/東西方向綠燈 EW_yellow=0 ;/東西方向黃燈 EW_red=1 ;/東西方向紅燈 break; /-main()/初始化各變量 cnt_sn=init_sn0; cnt_ew=init_ew0; T1_cnt=0; state_val_sn=0; /啟動后

30、,默認(rèn)工作在序號為1的狀態(tài) state_val_ew=0;/初始化各燈的狀態(tài) SN_green=0 ;/南北方向綠燈亮 SN_yellow=1 ;/南北方向黃燈滅 SN_red=1 ;/南北方向紅燈滅 EW_green=1 ;/東西方向綠燈滅 EW_yellow=1;/東西方向黃燈滅 EW_red=0 ;/東西方向紅燈亮/初始化51的寄存器 TMOD=0x20;/用T1計時 8位自動裝載定時模式 TH1=0x19;/0x4b; /500微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4 TL1=0x19; EA=1; /開中斷 ET1=1; TR1=1;

31、 /開定時器T1while(1) led_show(cnt_sn,cnt_ew);/主程序結(jié)束3.3.3 密碼鎖單片機(jī)控制的密碼鎖設(shè)計。AT89S52單片機(jī)P1引腳外接獨立式按鍵S1-S8,分別代表數(shù)字鍵0-5、確定鍵、取消鍵。單片機(jī)從P3.0-P3.3輸出4個信號,分別為1個電磁開鎖驅(qū)動信號和密碼錯誤指示、報警輸出、已開鎖指示信號,分別用發(fā)光二極管L1-L4指示。P3.4接一有源蜂鳴器,用于實現(xiàn)提示音。基本要求:(1)初始密碼為123450,輸完后按確定鍵開鎖,取消鍵清除所有輸入,每次按鍵有短“滴”聲按鍵提示音。(2)密碼輸入正確后,輸出一個電磁鎖開鎖信號與已開鎖信號,并發(fā)出兩聲短“滴”聲提

32、示。4秒后開鎖信號與已開鎖指示清零。(3)密碼輸入錯誤時,發(fā)出一聲長“滴”聲錯誤指示提示音,并密碼錯誤指示燈亮,三次密碼錯誤時,發(fā)出長鳴聲報警,并密碼錯誤指示燈亮,報警指示燈亮,此后15秒內(nèi)無法再次輸入密碼,15秒過后,清除所有報警和指示。(4)5秒內(nèi)無任何操作后,清除所有輸入內(nèi)容,等待下次輸入。模塊1 系統(tǒng)設(shè)計(1)分析任務(wù)要求。寫出系統(tǒng)整體設(shè)計思路根據(jù)題目的要求,需要考慮如下幾個任務(wù):按鍵的輸入,密碼的判斷,密碼輸入正確或錯誤的計時、輸出信號的控制等。 鍵盤的輸入:由于需要輸入6個數(shù)字作為密碼,先要判斷按鍵時數(shù)字鍵還是功能鍵,若判斷為數(shù)字鍵按下,則需要將每次鍵盤的輸入內(nèi)容依次暫存在一個數(shù)組

33、中。在每次按鍵輸入時,需要啟動定時器實現(xiàn)待機(jī)計時(5秒)。若5秒內(nèi)沒有輸入內(nèi)容則清除已輸入的內(nèi)容。密碼的判斷和計時:在按下確認(rèn)鍵之后,要將輸入的內(nèi)容與初始密碼核對,如果密碼正確,輸出相應(yīng)的指示,同時還要啟動定時器實現(xiàn)4s的計時。如果密碼錯誤,錯誤計數(shù)變量增1,同時輸出密碼指示信號,若錯誤次數(shù)超過3s,則輸出報警等信號,同時啟動定時器實現(xiàn)15秒的計時。 輸出信號的控制主要根據(jù)按鍵輸入與密碼的核對情況來決定。 整體程序設(shè)計思想:程序分為主程序和中斷服務(wù)程序兩個主要部分,主程序完成變量和單片機(jī)特殊功能寄存器的初始化后,進(jìn)入一個循環(huán)結(jié)構(gòu)。在循環(huán)中,首先判斷有無按鍵按下,若有按鍵則判斷是否數(shù)字鍵還是功能

34、鍵,根據(jù)按鍵的情況執(zhí)行相應(yīng)的功能。然后根據(jù)密碼是否正確的判斷情況,執(zhí)行相應(yīng)的操作。循環(huán)中最后將需要顯示的內(nèi)容通過動態(tài)掃描在數(shù)碼管上顯示。 中斷服務(wù)程序只要實現(xiàn)三個狀態(tài)的計時,待機(jī)時需要計時5秒,密碼正確需要計時5s,密碼3次輸入錯誤需要計時15秒。當(dāng)前處于何種計時,由主程序根據(jù)密碼判斷結(jié)果來決定。(2)選擇單片機(jī)型號和所需外圍器件型號,設(shè)計單片機(jī)硬件電路原理圖 采用MCS51系列單片機(jī)At89S51作為主控制器,外圍電路器件包括數(shù)碼管驅(qū)動、蜂鳴器的輸出驅(qū)動、獨立式鍵盤以及發(fā)光二極管的輸出等。數(shù)碼管驅(qū)動采用2個四聯(lián)共陰極數(shù)碼管顯示,由于單片機(jī)驅(qū)動能力有限,采用74HC244作為數(shù)碼管的驅(qū)動。在7

35、4HC244的7段碼輸出線上串聯(lián)100歐姆電阻起限流作用。蜂鳴器的驅(qū)動采用PNP三極管8550來驅(qū)動,低電平有效。獨立式按鍵使用上提拉電路連接,在沒有鍵按下時,輸出高電平。發(fā)光二極管串聯(lián)500歐姆電阻再接到電源上,當(dāng)輸入為低電平時,發(fā)光二極管導(dǎo)通發(fā)光。硬件電路原理圖如圖3-9所示。 圖3-9 密碼鎖電路原理圖(3)分析軟件任務(wù)要求,寫出程序設(shè)計思路,分配單片機(jī)內(nèi)部資源,畫出程序流程圖 軟件任務(wù)要求主要包括按鍵掃描、密碼判斷、動態(tài)掃描輸入的內(nèi)容、計時、指示信號輸出以及蜂鳴器提示音的輸出等。主程序主要完成變量與寄存器的初始化、按鍵的掃描與判斷、密碼的判斷以及數(shù)碼管動態(tài)掃描顯示等。主程序流程圖如圖3

36、-10所示。 圖3-10 密碼鎖的主程序流程圖中斷服務(wù)程序主要完成三種定時的計時工作,包括按鍵之后啟動的待機(jī)計時,當(dāng)待機(jī)超過5s則清除已輸入的內(nèi)容。密碼輸入正確之后的計時,4s之后清除開鎖驅(qū)動信號與已開鎖指示信號。 密碼輸入錯誤3次的計時,計時15s,在則15s內(nèi)無法再次輸入密碼,15秒過后清除所有報警與指示。中斷服務(wù)程序流程圖如圖3-11所示。 圖3-11 密碼鎖中斷服務(wù)程序流程圖 單片機(jī)資源的分配與變量的定義: 密碼的輸入與判斷需要定義4個變量。原始密碼存儲在數(shù)組init_val6中。鍵盤輸入的密碼存儲在數(shù)據(jù)show_val6中,變量 key_index的值表示當(dāng)前按鍵是六位密碼中的哪一位

37、,每輸入一個密碼數(shù)字該變量增一。密碼輸入錯誤的次數(shù)暫存在變量error_num中。 計時功能需要5個變量。模式變量cnt_state存儲計時屬于什么狀態(tài),0表示待機(jī)計時,1表示密碼正確的計時,2表示密碼錯誤3次的計時。三個變量(cnt_val_15s,cnt_val_5s, cnt_val_4s)分別實現(xiàn)待機(jī)、密碼正確和密碼錯誤3次后的計時工作。定時器T1每250ms產(chǎn)生一次中斷,變量T1_cnt記錄定時器溢出中斷的次數(shù),當(dāng)記錄到4000時表示計時1秒。(4)設(shè)計系統(tǒng)軟件調(diào)試方案、硬件調(diào)試方案及軟硬件聯(lián)合調(diào)試方案 軟件調(diào)試方案:偉福軟件中,在“文件新建文件”中,新建C語言源程序文件,編寫相應(yīng)的

38、程序。在“文件新建項目”的菜單中,新建項目并將C語言源程序文件包括在項目文件中。 在 “項目編譯”菜單中將C源文件編譯,檢查語法錯誤及邏輯錯誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。硬件調(diào)試方案:在設(shè)計平臺中,將單片機(jī)的P1.0-P1.7分別與8個獨立式鍵盤通過插線連接起來,將P3.0-P3.3分別與4個發(fā)光二極管連接起來,P3.4與蜂鳴器的輸入連接起來。在偉福中將程序文件編譯成目標(biāo)文件后,將下載線安裝在實驗平臺的下載線接口上,運行“MCU下載程序”,選擇相應(yīng)的flash 數(shù)據(jù)文件,點擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。然后,上電重新啟動單片機(jī)

39、,檢查所編寫的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。 程序設(shè)計/晶振11.0592MHz,T1每250微秒中斷,按鍵P1.0-P1.7,發(fā)光二極管接P3.0-P3.3,p3.4/*變量的定義: show_val6: 顯示的值 init_val6: 密碼初始值 key_val: 返回按鍵的值 255-表示無按鍵按下 key_index: 當(dāng)前按鍵是哪一位密碼 T1_cnt: 定時器計數(shù)溢出數(shù) cnt_val_15s: 報警計時的數(shù)值 cnt_val_5s: 待機(jī)時間計時 cnt_val_4s: 輸入正確,等待4秒清除開鎖信號 cnt_state: 計時狀態(tài) error_num:

40、錯誤次數(shù) led_seg_code:數(shù)碼管7段碼*/#include "reg51.h"/*說明key0=P10; key1=P11;key2=P12; key3=P13;key4=P14;key5=P15;enter=P16;esc=P17;*/sbit relay_open=P30; /電磁鎖開鎖驅(qū)動sbit pw_error=P31; /密碼錯誤信號sbit alarm_out=P32; /報警輸出sbit open_lock=P33; /已開鎖指示信號sbit audio_out=P34; /有源蜂鳴器unsigned char data cnt_val_15s,c

41、nt_val_5s,cnt_val_4s,cnt_state;unsigned int data T1_cnt;unsigned char data key_val,key_index,key_val_old;unsigned char data state_val,error_num;unsigned char data show_val6;char code init_val6=1,2,3,4,5,0;char code led_seg_code11=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;/led_seg_code

42、0-9代表0-9 led_seg_code10=0x00數(shù)碼管不顯示任何內(nèi)容/-延時程序-void delay(unsigned int i)/延時 while(-i); /-清除輸入內(nèi)容-void init_variant()unsigned char i; for(i=0;i<6;i+) show_vali=10; /led_seg_code10=0x00表示數(shù)碼管不顯示任何內(nèi)容 key_index=0; /沒有任何輸入或清除所有輸入時,保存當(dāng)前鍵的位置/-按鍵掃描-unsigned char scan_key() unsigned char i,k; i=P1; if (i=0xf

43、f && cnt_state!=2) k=255; /無鍵按下 else /有鍵按下 delay(500); /延時去抖動 if(i!=P1) k=255; else TR1=1; /有鍵按下則開定時器,啟動待機(jī)計時 cnt_val_5s=0; switch (i) case 0xfe: k=0; break; case 0xfd: k=1; break; case 0xfb: k=2; break; case 0xf7: k=3; break; case 0xef: k=4; break; case 0xdf: k=5; break; case 0xbf: k=6; brea

44、k; case 0x7f: k=7; break; return k;/-數(shù)碼管顯示-void led_show()P0=led_seg_codeshow_val0; P2=0xdf; delay(500); P0=led_seg_codeshow_val1; P2=0xef; delay(500); P0=led_seg_codeshow_val2; P2=0xf7; delay(500); P0=led_seg_codeshow_val3; P2=0xfb; delay(500); P0=led_seg_codeshow_val4; P2=0xfd; delay(500); P0=led_

45、seg_codeshow_val5; P2=0xfe; delay(500);/-定時器T1中斷服務(wù)程序-void timer1() interrupt 3 /T1中斷 T1_cnt+; if(T1_cnt>3999) /如果計數(shù)>3999, 計時1s T1_cnt=0; switch (cnt_state) case 0: /待機(jī),需要計時5s if(cnt_val_5s<5) cnt_val_5s+; else cnt_val_5s=0; init_variant();/待機(jī)計時到5秒時,清除輸入的內(nèi)容 TR1=0; /停止計時 break; case 1:/密碼輸入正確,需要計時4s if(cnt_val_4s<4) cnt_val_4s+; else c

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論