


下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、建筑工程管理單片機開 發工程案例分析與解析3單片機開發工程案例分析與解析3.1定時報警器設計一個單片機控制的簡易定時報警器。要求根據設定的初始值1-59秒進行倒計 時,當計時到0時數碼管閃爍“ 00 以1Hz閃爍,按鍵功能如下:1 設定鍵:在倒計時模式時,按下此鍵后停止倒計時,進入設置狀態;如果已 經處于設置狀態那么此鍵無效。2增一鍵:在設置狀態時,每按一次遞增鍵,初始值的數字增1。3 遞一鍵:在設置狀態時,每按一次遞減鍵,初始值的數字減1。4 確認鍵:在設置狀態時,按下此鍵后,單片機按照新的初始值進行倒計時及 顯示 倒計時的數字。如果已經處于計時狀態那么此鍵無效。模塊1:系統設計1 任務分析
2、與整體設計思路 根據題目的要求,需要實現如下幾個方面的功能。計時功能:要實現計時功能那么需要使用定時器來計時,通過設置定時器的初始值來 控制 溢出中斷的時間間隔,再利用一個變量記錄定時器溢出的次數,到達定時1秒中的功能。然后,當計時每到1秒鐘后,倒計時的計數器減1。當倒計時計數器到0時, 觸發另一個標志變量,進入閃爍狀態。顯示功能:顯示倒計時的數字要采用動態掃描的方式將數字拆成“十位"和“個位" 動 態掃描顯示。如果處于閃爍狀態,那么可以不需要動態掃描顯示,只需要控制共陰極 數碼管的 位控線,實現數碼管的滅和亮。鍵盤掃描和運行模式的切換:主程序在初始化一些變量和存放器之后,
3、需要不斷循 環地 讀取鍵盤的狀態和動態掃描數碼管顯示相應的數字。根據鍵盤的按鍵值實現設置 狀態、計時狀態的切換。2單片機型號及所需外圍器件型號,單片機硬件電路原理圖選用 MCS-51 系列 AT89S51 單片機作為微控制器,選擇兩個四聯的共陰極數碼管組8 位顯示模塊, 由于 AT89S51 單片機驅動能力有限, 采用兩片 74HC244 實現總線的驅動, 一個 74HC244 完成位控線的控制和驅動,另一個 74HC244 完成數碼管的 7 段碼輸出, 在 輸出口上各串聯一個 100 歐姆的電阻對 7 段數碼管限流。由于鍵盤數量不多,選擇獨立式按鍵與 P1 口連接作為四個按鍵輸入。沒有鍵按下
4、 時 P1.0-P1.3 為高電平,當有鍵按下時, P1.0-P1.3 相應管腳為低電平。電路原理圖如圖 3-1 所示。圖 3-1 定時報警器電路原理圖( 3)程序設計思路,單片機資源分配以及程序流程 單片機資源分配采用單片機的 P3 口作為按鍵的輸入,使用獨立式按鍵與 P3.0-P3.3 連接,構成四個 功 能按鍵。在計時功能中,需要三個變量分別暫存定時器溢出的次數 ( T1_cnt ) 、倒計時的初始 值 ( init_val ) 以及當前倒計時的秒數 ( cnt_val ) 。按鍵掃描功能中,需要兩個變量,一個變量 ( key_val_new ) 用來存儲當前掃描的鍵 值 ( 假設無按鍵
5、按下那么為 255 ) ,另一個變量 ( key_val_old )用來存儲上一次掃描的鍵值。 只有 這兩個變量值不一樣時,才能說明是一次新的按鍵按下或彈起了,同時將新的鍵 值賦給 key_val_old 變量。在顯示功能中,需要定義一組數組 ( code 類型) ,值為 0-9 數字對應的數碼管 7 段 碼。 還需要定義一個變量 (show_val) 暫存要顯示的數據,用于動態掃描顯示中。在整個程序中, 定義了一個狀態變量 ( state_val ) 用來存儲當前單片機工作在哪種狀態0時的 程序設計思路 鑒于題目要求,存在三種工作模式:初始值設置模式、倒計時模式、計時到閃爍模式。變量stat
6、e_val為0時,處于倒計時模式。變量state_val為1時,處于初始值設置模 式。變量state_val為2時,處于閃爍模式。這些狀態的切換取決于按下哪一個鍵以及是否下“確認鍵時,回遞 到計時State_val=0計數圖3-2狀態的切換按置鍵倒計時模式,啟動定時器,單片機復位之后,默認定時器每隔按下確認鍵據定時器溢由0變為模Za 式 M以使用“遞增1,切換到設:t置置250us溢出一次,根1。當“設置鍵按下時,變量state_val"八_爍減va鍵匸2 對計時初始值進 行修改。按式開始以新的初按始下值進行倒計時。當倒計時到0時,變量-state_val 設置鍵計時到0。狀態的切換
7、圖如圖3-2由1變為2,處于閃爍狀態,在這種狀態下,根據按鍵的情況分別又切換到計時和 設置狀態。 程序流程按下主程序首先需要初始化定時器的參數和一些變量,然后進入一個循環結構,在循環 中始終只做兩件事遞增鍵是鍵盤的掃描,二是數計碼管的動態掃描。減到在掃描鍵盤后,根據前一次按鍵的結果是否與本次鍵值相同。如果不同,表示有鍵 按下 或彈起,同時用本次按鍵值更新上一次的按鍵值。這樣設計旨在防止一個按鍵長 時間按下時 被重復判為有新鍵按下,使得當前按下的鍵只有松開后,下一次按下時才算為一次新的按鍵。根據按鍵的值分別改變變量(state_val )的值或者在設置狀態時的倒計時初始值。完 整 的主程序圖如圖
8、3-3所示。圖3-3主程序的流程圖 在定時器的參數中,選擇定時器T1的8位自動裝載模式,每250us 產生一次溢出中斷,中 斷效勞程序如圖3-4所示。圖3-4中斷效勞程序流程圖(4 )軟硬件調試方案軟件調試方案:偉福軟件中,在“文件新建文件中,新建C語言源程序文件,編寫 相應的程序。在“文件 新建工程的菜單中,新建工程并將 C 語言源程序文件包括 在工程文件中。在“工程編譯菜單中將 C 源文件編譯,檢查語法錯誤及邏輯錯誤。在編譯成功 后,產生以“ *.hex 和“ *.bin 后綴的目標文件。硬件調試方案:在設計平臺中,將單片機的 P3.0-P3.3 分別與獨立式鍵盤的相應位 通過插線連接起來
9、。在偉福中將程序文件編譯成目標文件后, 運行 MCU 下載程序,選擇相應的 flash 數 據文件,點擊“編程按鈕,將程序文件下載到單片機的 Flash 中。然后,上電重新啟動單片機,檢查所編寫的程序是否到達題目的要求,是否全面 完整地完成試題的內容。3.1.3 程序設計僅供參考的 C 語言源程序/ 晶振: 11.0592MT1-250 微秒按鍵 P10P11P12P13/* 變量的定義 :show_val: 顯示的值 0-59init_val: 初始值state_val: 狀態值 0- 計數狀態 ;1- 設置狀態 ;2- 閃爍狀態shan_val: key_val1: 四個按鍵的值 255-
10、 無鍵;1-設置鍵 2-增一鍵 3-減一鍵 4- 確定鍵T1_cnt: 定時器計數溢出數cnt_val: 倒計時的數值led_seg_code :數碼管 7 段碼*/#include"reg51.h"/ 包含文件sbitP1_0=PM0; 設置鍵sbitP1_ 仁 P1A1;/ 增一鍵sbitP1_2=P1八2;/ 減一鍵sbitP1_3=P1八3;/ 確定鍵unsignedchardatashan_val;/ 閃爍時 LED 的開 / 關狀態 unsignedchardatacnt_val;/ 保存倒計數 的當前值 unsignedintdataT1_cnt;/ 保存定時
11、器溢出次數 unsignedchardatakey_val_new,key_val_old;/ 存放當前掃描的鍵和前一次按下的鍵值 unsignedchardatastate_val;/ 狀態值unsignedchardatashow_val;/ 存放需要在數碼管顯示的數字 unsignedchardatainit_val;/ 暫存倒 計數的初始值 charcodeled_seg_code10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 延時 - voiddelay(unsignedinti)/ 大約延時 i*2 個微秒while
12、(-i); unsignedcharscan_key()unsignedchari;i=P1&0x0f;delay(100);/ 延時,去抖動if(i=(P1&0x0f)if(P1_0=0)i=1;elseif(P1_1=0)i=2;elseif(P1_2=0)i=3;elseif(P1_3=0)i=4;elsei=255;returni;voidled_show(unsignedintv)unsignedchari;if(state_val!=2)/ 動態掃描i=v%10;/ 取要顯示的數的個位P0=led_seg_codei;/ 轉換為 7 段碼P2=0xfe;/ 顯示個位
13、delay(15);/ 延時i=v%100/10;/ 取十位P0=led_seg_codei;/ 轉換為 7 段碼P2=0xfd;/ 顯示十位delay(5);/ 延時elseP0=led_seg_code0;/ 處于閃爍狀態if(shan_val)P2=0xff;/ 將數碼管的關閉elseP2=0xfc;/ 將數碼管的翻開voidtimer1()interrupt3/T1中斷, 250us 中斷一次T1_cnt+;switch(state_val)case0:if(T1_cnt>3999)/ 如果計數 >3999, 計時 1sT1_cnt=0;if(cnt_val!=0)cnt_
14、val-;elsestate_val=2;/ 定時計數到 0 時,切換狀態show_val=cnt_val;break;case2:if(T1_cnt>1999)/ 如果計數 >1999, 計時 0.5sT1_cnt=0;shan_val=!shan_val;/ 閃爍狀態 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 位自
15、動裝載定時模式TH1=0x19;/250 微秒溢出一次 ;250=(256-x)*12/11.0592->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)/ 只有當前掃描的鍵值與上次掃描的不同, 才判斷是有鍵按下 key_val_old=key_val_new;switch(key_val_new)case1:/ 設置鍵state_val=1;/ 處于設置狀態TR1=1;/ 停止
16、計時show_val=init_val;/ 顯示原來的倒計數初始值 break;case2:if(state_val=1)/ 只有在設置狀態,增 1 鍵才有用if(init_val>0)/ 更改原來的倒計數初始值init_val-;elseinit_val=59;show_val=init_val;/ 顯示更改后的倒計數初始值break;case3:if(state_val=1)/ 只有在設置狀態,減 1 鍵才有用if(init_val<59)/ 更改原來的倒計數初始值init_val+;elseinit_val=0;show_val=init_val;/ 顯示更改后的計數初始值b
17、reak;case4:if(state_val!=0)/ 如果已處于計數模式,確認鍵不起作用cnt_val=init_val;/ 將初始值賦給計數變量show_val=cnt_val;/ 將計數變量的數字顯示TR1=1;/ 啟動定時器 T1state_val=0;/ 將狀態切換為計數模式break;led_show(show_val); 動態掃扌苗3.2交通燈設計一個基于單片機的交通燈信號控制器。東、西、南、北四個方向各有紅黃 綠色 三個燈,在東西方向有兩個數碼管,在南北方向也有兩個數碼管。要求交通燈按照表1進 行 顯示和定時切換,并要求在數碼管上分別倒計時顯示東西、南北方向各狀態的剩余時間表
18、1交通燈的狀態切換表南北方向東西方向序號狀態序號狀態1綠燈亮25秒,紅、黃燈火1紅燈亮30秒,綠、黃燈火2黃燈亮5秒,紅、綠燈火3紅燈亮30秒,綠、黃燈火2綠燈亮25秒,紅、黃燈火3黃燈亮25秒,紅、綠燈火回到狀態1回到狀態1模塊1:系統設計(1)任務分析與整體設計思路試題要求實現的功能主要包括計時功能、動態掃描以及狀態的切換等幾局部 計時功能:要實現計時功能那么需要使用定時器來計時,通過設置定時器的初始值來 控制溢出中斷的時間間隔,再利用一個變量記錄定時器溢出的次數,到達1秒中的功能。定時 計時每到1秒鐘后,東西、南北信號燈各狀態的暫存剩余時間的變量減1。當暫存剩余時間 的變量減到0時,切換
19、到下一個狀態,同時將下一個狀態的初始的倒計時 值裝載到計時變量 中。開始下一個狀態,如此循環重復執行。動態掃描:需要使用4個數碼管分別顯示東西、南北的倒計時數字,將暫存各狀態剩余時間的數字從變量中提取出“十位和“個位,用動態掃描的方式在數碼管中顯示。整個程序依據定時器的溢出數來計時,每計時1S那么相應狀態的剩余時間減1,一直減15P33P321132WR132 LEDHC244U4選12用15P11/TP0138 LED BLED B 4LED C 61A21Y2P12P13P02P0336 LEDLED D 81A31A41Y31Y435 LED圖3-5,6交PP通1145燈硬件電LEDP1
20、6P06LED路原理P17P07LED_E 11LED_F13LED_G 15LED H 172A12A22Y12Y22A32Y32A42Y4選擇兩個四聯的P35P34INT1inMt0CS51P23VCCT0P24P2531位顯示1918 模塊26 LED J527 LED_J6制器/VPX1X2RST 9由于AT8 pp229S52,67le單D_J7片1 L_COM 871 匚COM8RESETRXD10 P30E兩12A2167 4HC 80C32PSEN30P30P0000電阻起限流作用。硬件B1A1U5R2LED A1HCOM116LED B 1LED H1G14LED C1LED
21、 LEDFCOM212LED D1LED LEDELED LEDE1DC OM 3R7 100LED E1LEDCR8 100LED F1C1BCOM4R9 100LED G1AR10 100LED H1極數碼1A11Y11Y216 L COM 2LED_H1101AA1Y31Y42Y12Y22Y312 L COM 49 LCOM 57 LCOM 6LED E1LED_D1LED C1驅動L_COM 1L_COM 2L_COM 3L_COM 4L_COM 5L_COM 6另 2A3 .一一個2Y41G的HC2電44阻對VCCC31211L_COM 7COM3LED4SCH7段數碼管限流。用P3
22、 口的的控制,實現交通燈信號的顯示00r14每個? 00 00理圖如到0時觸發下一個狀態的開始。25 LED JJ400裟光二極管串 二聯RST JAL一IRE500歐姆3程序設計思路,單片機資源分配以及0程序流程R6R310單片機資源分配R412單片機P3 口的引腳用作輸出,控制發光二極管的顯示在計時模塊中,P20系列需要定義兩個數組變量U624 LED J3init_sn3,init_ew3LED來存儲東西、南北兩個方向在不同狀態中LED J1 4機驅動能倒計時的初始值,題目中每個方向的交通燈共有J4 113種顯示狀態,因此數組元素個數為3。J3 8LEDJ5 13還需要 定義兩個變量 (
23、cnt_sn,cnt_ew) 暫存東西、南北兩個方向的倒計時剩余時間在狀態的切換中,為了明確當前處于哪種狀態,東西、南北方向各設置一個狀態變量(state_val_s n, state_val_ew),當倒計時的剩余時間到零時,狀態變量增1,表示啟動下一個狀態,當該變量增到3時變為0,回到序號為1的狀態。程序設計思路在設計中,由于沒有鍵盤功能,因此只涉及定時計數和動態掃描功能。主程序將變量初始化之后,設置單片機定時器和中斷特殊功能存放器的初始值,將定時器T1的工作方式設置為8位自動 裝載模式,定時器每隔250us產生一次溢出。 在初始化變量與存放器后,主程序進入一 個循環結構,在循環中只做動態
24、掃描的工作, 根據東西、南北兩向的剩余時時間進行動 態掃描顯示。計時以及狀態的切換通過定時器的中斷效勞程序來實現,在中斷效勞程序中,每計時到一秒 時,那么各方向當前狀態的剩余時間減 1,一直減到0時觸發下一個狀態的開始,改變交通燈的指示程序流程中斷圖3-7交通燈主程序流程T圖1溢出計數T1_cnt+1T1 cnt<4000圖3-8中斷效勞程序流程圖Y T1_cnt=0產生以*.hex(4)軟硬件調試方案軟件調cnt_sn=cnt_sn-1南北方向倒計時cnt_sn=0 ?和“ *bin南北狀態state val sn+后綴的目標文件試方案:偉福軟件中,在的文件程序。在“文件新建工程 中。
25、在“工程編譯菜單中菜單中,新建工程并將y state_val_sn=1? N 南 C 北交語通言燈按源序程序文件包Y括在工程stal_sn=2 ?文te_件val號1的狀南北交通燈按序號2的狀態顯示在編譯成功南北交通燈按序 號3的狀態顯示Nent ew=c nt ew-1C源文諭喝鑑檢血陪:東西狀態state val ew+Nstate val ew=0? NNstate_val_ew=1 ?Y state_val_ew=2 ?東西交通燈按序 號1的狀態顯示東西交通燈按序 號2的狀態顯示東西交通燈 按序號3的硬件調試方案:在設計平臺中,將單片機的 P3.0-P3.5 分別與獨立式鍵盤的相應位通
26、過插線連接起來。在偉福中將程序文件編譯成目標文件后,運行“ MCU 下載程序,選擇相應的 flash 數據文件,點擊“編程按鈕,將程序文件下載到單片機的 Flash 中。然后,上電重新啟動單片機,檢查所編寫的程序是否到達題目的要求,是否全面完 整地完成試題的內容。3.2.2 程序設計僅供參考的 C 語言源程序/ 晶振: 11.0592MT1-250 微秒溢出一次/* 變量的定義 :show_val_sn,show_val_ew: 顯示的值 0-59state_val_sn,state_val_ew: 狀態值南北方向 0- 綠燈亮 ;1-黃燈亮 ;2- 紅燈亮T1_cnt: 定時器計數溢出數cn
27、t_sn,cnt_ew: 倒計時的數值init_sn3,init_ew3 倒計時led_seg_code :數碼管 7 段碼*/#include"reg51.h"sbitSN_gree n=P3八2;/ 南北方向綠燈sbitSN_yellow=P3M; 南北方向黃燈sbitEW_gree n=P3八5;/ 東西方向綠燈sbitEW_red=P3八3;/東西方向紅燈unsignedchardatacnt_sn,cnt_ew;unsignedintdataT1_cnt;unsignedchardatastate_val_sn,state_val_ew;charcodeled_s
28、eg_code10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;charcodeinit_sn3=24,4,29;charcodeinit_ew3=29,24,4;/ voiddelay(unsignedinti)/ 延時while(-i);/ voidled_show(unsignedintu,unsignedintv)unsignedchari;i=u%10;/ 暫存個位P0=led_seg_codei;P2=0xbf;delay(100);/ 延時i=u%100/10;/ 暫存十位P0=led_seg_codei;P2=0x7f
29、;i=v%10;/ 暫存個位P0=led_seg_codei;P2=0xfe;delay(100);/ 延時i=v%100/10;/ 暫存十位P0=led_seg_codei;P2=0xfd;delay(100);/ 延時/ voidtimer1()interrupt3/T1 中斷T1_cnt+;if(T1_cnt>3999)/ 如果計數 >3999, 計時 1sT1_cnt=0;if(cnt_sn!=0)/ 南北方向計時cnt_sn-;elsestate_val_sn+;if(state_val_sn>2)state_val_sn=0;cnt_sn=init_snstate
30、_val_sn;switch(state_val_sn)/ 根據狀態值,刷新各信號燈的狀態case0:SN_green=0;/ 南北方向綠燈SN_yellow=1;/ 南北方向黃燈SN_red=1;/ 南北方向紅燈break;case1:SN_green=1;/ 南北方向綠燈SN_yellow=0;/ 南北方向黃燈SN_red=1;/ 南北方向紅燈break;case2:SN_green=1;/ 南北方向綠燈SN_yellow=1;/ 南北方向黃燈SN_red=0;/ 南北方向紅燈break;if(cnt_ew!=0)/ 東西方向計時cnt_ew-;elsestate_val_ew+;if(s
31、tate_val_ew>2)state_val_ew=0;cnt_ew=init_ewstate_val_ew;switch(state_val_ew)/ 根據狀態值,刷新各信號燈的狀態 case0:EW_green=1;/ 東西方向綠EW_red=0;/ 東西方向紅燈break;case1:EW_green=0;/ 東西方向綠燈EW_yellow=1;/ 東西方向黃燈EW_red=1;/ 東西方向紅燈break;case2:EW_green=1;/ 東西方向綠燈EW_yellow=0;/ 東西方向黃燈EW_red=1;/ 東西方向紅燈break;/ main()/ 初始化各變量 cnt
32、_sn=init_sn0;cnt_ew=init_ew0;T1_cnt=0;state_val_ew=0;/ 初始化各燈的狀態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.4TL1=0x19;EA=1
33、;/ 開中斷ET1=1;TR1=1;/ 開定時器 T1while(1)led_show(cnt_sn,cnt_ew);/ 主程序結束3.3.3 密碼鎖分別1 個電L1-L4單片機控制的密碼鎖設計。 AT89S52 單片機 P1 引腳外接獨立式按鍵 S1-S8 , 代表 數字鍵 0-5 、確定鍵、取消鍵。單片機從 P3.0-P3.3 輸出 4 個信號,分別為 磁開鎖驅 動信號和密碼錯誤指示、 報警輸出、 已開鎖指示信號, 分別用發光二極管 指示。 P3.4 接一有源蜂鳴器,用于實現提示音。根本要求:1初始密碼為 123450 ,輸完后按確定鍵開鎖,取消鍵去除所有輸入,每次按鍵有短 “滴聲按鍵提示
34、音。 2 密碼輸入正確后, 輸出一個電磁鎖開鎖信號與已開鎖信號, 并發出兩聲短“滴 聲 提示。 4 秒后開鎖信號與已開鎖指示清零。 3 密碼輸入錯誤時, 發出一聲長“滴聲錯誤指示提示音, 并密碼錯誤指示燈亮, 三 次密碼錯誤時,發出長鳴聲報警,并密碼錯誤指示燈亮,報警指示燈亮,此后 15 秒 內無法 再次輸入密碼, 15 秒過后,去除所有報警和指示。 4 5 秒內無任何操作后,去除所有輸入內容,等待下次輸入。3.3.1 模塊 1 系統設計1分析任務要求。寫出系統整體設計思路 根據題目的要求,需要考慮如下幾個任 務:按鍵的輸入,密碼的判斷,密碼輸入正確或 錯誤的計時、輸出信號的控制等。鍵盤的輸入
35、:由于需要輸入 6 個數字作為密碼,先要判斷按鍵時數字鍵還是功能鍵, 假設 判斷為數字鍵按下,那么需要將每次鍵盤的輸入內容依次暫存在一個數組中。在每次按 鍵輸入 時,需要啟動定時器實現待機計時 5 秒。假設 5 秒內沒有輸入內容那么去除已 輸入的內容。密碼的判斷和計時:在按下確認鍵之后,要將輸入的內容與初始密碼核對,如果密 碼正 確,輸出相應的指示,同時還要啟動定時器實現 4s 的計時。如果密碼錯誤,錯誤 計數變量 增 1,同時輸出密碼指示信號,假設錯誤次數超過 3s ,那么輸出報警等信號,同 時啟動定時器實 現 15 秒的計時。輸出信號的控制主要根據按鍵輸入與密碼的核對情況來決定。整體程序設
36、計思想:程序分為主程序和中斷效勞程序兩個主要局部,主程序完成變量和單片機特殊功能存放器的初始化后,進入一個循環結構。在循環中,首先判斷有無按鍵按下,假設有按鍵 那么判斷是 否數字鍵還是功能鍵,根據按鍵的情況執行相應的功能。然后根據密碼是否正確的判斷情況,執行相應的操作。循環中最后將需要顯示的內容通過動態掃描在數碼 管上顯示。中斷效勞程序只要實現三個狀態的計時,待機時需要計時5秒,密碼正確需要計時5s,密碼3次輸入錯誤需要計時15秒。當前處于何種計時,由主程序根據密碼判斷結果來 決定。2 選擇單片機型號和所需外圍器件型號,設計單片機硬件電路原理圖采用MCS51系列單片機At89S51作為主控制器
37、,外圍電路器件包括數碼管驅動、蜂 鳴 器的輸出驅動、獨立式鍵盤以及發光二極管的輸出等。數碼管驅動采用2個四聯共陰極數碼管顯示,由于單片機驅動能力有限,采用74HC244作為數碼管的驅動。在 74HC244的7段碼輸出線上串聯100歐姆電阻起限流作用。蜂鳴器的驅動采用PNP三極管8550來驅動,低電平有效。獨立式按鍵使用上提拉電路連接,在沒有鍵按下時,輸出高電平。發光二極管串聯500 歐姆電阻再接到電源上,當輸入為低電平時,發光二極管導通發光。硬件電路原理圖如圖3-9所示。圖3-9密碼鎖電路原理圖3 分析軟件任務要求,寫出程序設計思路,分配單片機內部資源,畫出程序流程 圖軟件任務要求主要包括按鍵
38、掃描、密碼判斷、動態掃描輸入的內容、計時、指示信號 輸出以及蜂鳴器提示音的輸出等。主程序主要完成變量與存放器的初始化、按鍵的掃描與判斷、密碼的判斷以及數碼管動態掃描顯示等。主程序流程圖如圖3-10所示。主程序開始初始化變量設置定時器與中斷 圖3-10密碼鎖的主程序流程圖掃描鍵盤,假設有按鍵,那么開 定時器,啟動待機計時YKey_val=key_val_old?Nkey val old=Key val中斷效勞程序主要完成三種定時的計時工作,包括按鍵之后啟動的待機計時,當待機 超過5s那么去除已輸入的內容。密碼輸入正確之后的計時,4s之后去除開鎖驅動信號與已開鎖指示信號。 密碼輸入錯誤 3 次的計
39、時,計時 15s, 在那么 15s 內無法再次 輸入密碼, 15 秒過后去除所有報警與指示。中斷效勞程序流程圖如圖 3-11 所示。圖 3-11 密碼鎖中斷效勞程序流程圖單片機資源的分配與變量的定義:密碼的輸入與判斷需要定義 4 個變量。原始密碼存儲在數組 init_val6 中。鍵盤輸入的密碼存儲在數據 show_val6 中,變量 key_index 的值表示當前按鍵是六位密碼中的哪 一位,每輸入一個密碼數字該變量增一。密碼輸入錯誤的次數暫存在變量 error_num 中。計時功能需要 5 個變量。模式變量 cnt_state 存儲計時屬于什么狀態, 0 表示待機計時,1 表示密碼正確的計
40、時, 2 表示密碼錯誤 3 次的計時。三個變量( cnt_val_15s,cnt_val_5s,cnt_val_4s )分別實現待機、密碼正確和密碼錯誤 3 次后的計時工作。定時器 T1 每 250ms 產生一次中斷,變量 T1_cnt 記錄定時器溢出中斷的次數,當記 錄到 4000 時表示計時 1 秒。(4) 設計系統軟件調試方案、硬件調試方案及軟硬件聯合調試方案 軟件調試方案:偉福軟件中,在“文件 新建文件中,新建 C 語言源程序文件,編寫相應 的程序。在“文件新建工程的菜單中,新建工程并將 C 語言源程序文件包括在工程文件 中。在“工程編譯菜單中將 C 源文件編譯,檢查語法錯誤及邏輯錯誤
41、。在編譯成功后,產生以“ *.hex 和“ *.bin 后綴的目標文件。硬件調試方案:在設計平臺中,將單片機的 P1.0-P1.7 分別與 8 個獨立式鍵盤通過插線連接起來,將 P3.0-P3.3 分別與 4 個發光二極管連接起來, P3.4 與蜂鳴器的輸入 連接起來。在偉福中將程序文件編譯成目標文件后, 將下載線安裝在實驗平臺的下載線接口上,運行“ MCU 下載程序,選擇相應的 flash 數據文件,點擊“編程按鈕,將程序文件 下載到單片機的 Flash 中然后,上電重新啟動單片機,檢查所編寫的程序是否到達題目的要求,是否全面完整 地完成試題的內容。3.3.2 程序設計P3.0-P3.3 ,
42、/ 晶振 11.0592MHz ,T1 每 250 微秒中斷, 按鍵 P1.0-P1.7 ,發光二極管接p3.4/* 變量的定義 :show_val6: 顯示的值init_val6: 密碼初始值key_val: 返回按鍵的值 255- 表示無按鍵按下key_index: 當前按鍵是哪一位密碼T1_cnt: 定時器計數溢出數cnt_val_15s: 報警計時的數值cnt_val_5s: 待機時間計時cnt_val_4s: 輸入正確,等待 4 秒去除開鎖信號cnt_state: 計時狀態error_num: 錯誤次數led_seg_code :數碼管 7 段碼*/#i nclude"re
43、g51.h"key0=P1A0;key1=P1A1;key2=P1A2;key3=P1A3;key4=P1A4;key5=P1A5;e nter二PM6;esc二PM7;*/sbitrelay_ope n=P3A0;電磁鎖開鎖驅動sbitpw_error=P3A1;密碼錯誤信號sbitalarm_out=P3A2;/報警輸出sbitopenock=P3A3;已開鎖指示信號sbitaudio_out=P3A4;/有源蜂鳴器un sig nedchardatac nt_val_15s,c nt_val_5s,c nt_val_4s,c nt_state;un sig nedin tdat
44、aT1_c nt;un sig nedchardatakey_val,key_i ndex,key_val_old;un sig nedchardatastate_val,error_ num;un sig nedchardatashow_val6;charcodei ni t_val6=1,2,3,4,5,0;charcodeled_seg_code11=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;led_seg_code0-9代表 0-9led_seg_code10=0x00數碼管不顯示任何內容/ 延時程序 voidde
45、lay (un sig nedin ti)/延時while(-i);/-去除輸入內容 -voidi ni t_varia nt()un sig nedchari;for(i=0;i<6;i+)show_vali=10;/led_seg_code10=0x00表示數碼管不顯示任何內容key_index=0;/ 沒有任何輸入或去除所有輸入時,保存當前鍵的位置/ 按鍵掃描 - unsignedcharscan_key() unsignedchari,k;i=P1;if(i=0xff&&cnt_state!=2)k=255;/ 無鍵按下else/ 有鍵按下delay(500);/
46、 延時去抖動if(i!=P1)k=255;elseTR1=1;/ 有鍵按下那么開定時器,啟動待機計時cnt_val_5s=0;switch(i)case0xfe:k=0;break;case0xfd:k=1;break;case0xfb:k=2;break;case0xf7:k=3;break;case0xef:k=4;break;case0xdf:k=5;break;case0xbf:k=6;break;case0x7f:k=7;break;returnk;/ 數碼管顯示 - voidled_show()P0=led_seg_codeshow_val0;P2=0xdf;delay(500);
47、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_seg_codeshow_val5;P2=0xfe;delay(500);/ 定時器 T1 中斷效勞程序 voidtimer1()interrupt3/T1 中斷T1_cnt+;if(T1_cnt>3999)/ 如果計數 >
48、;3999, 計時 1sT1_cnt=0;switch(cnt_state)case0:/ 待機,需要計時 5sif(cnt_val_5s<5)cnt_val_5s+;elsecnt_val_5s=0;init_variant();/ 待機計時到 5 秒時,去除輸入的內容TR1=0;/ 停止計時break;case1:/ 密碼輸入正確,需要計時 4sif(cnt_val_4s<4)cnt_val_4s+;elsecnt_val_4s=0;init_variant();/ 密碼輸入正確,計時到 4 秒時,去除輸入的內容open_lock=1;/ 已開鎖信號清零relay_open=1
49、;/ 開鎖信號清零cnt_state=0;TR1=0;/ 停止計時break;case2:/ 密碼輸入錯誤 3 次,計時 15sif(cnt_val_15s<15)cnt_val_15s+;elsecnt_val_15s=0;init_variant();/ 三次密碼錯誤時,計時 15 秒,去除輸入的內容open_lock=1;/ 去除所有指示和報警relay_open=1;alarm_out=1;pw_error=1;cnt_state=0;TR1=0;/ 停止計時break;/ 判斷鍵盤輸入內容與密碼是否一致unsignedcharcheck_input_pw()unsignedch
50、ari,k;k=1;for(i=0;i<6;i+)k=k&&(show_vali=init_vali);returnk;/ 主程序 main()/ 初始化各變量audio_out=1;P3=0xff;cnt_val_15s=0;cnt_val_5s=0;cnt_val_4s=0;cnt_state=0;/0- 待機計時 5s 狀態 ;1- 密碼正確, 計時 4s 狀態 ;2- 三次密碼錯誤, 處于計時 15 秒狀態。T1_cnt=0;error_num=0;key_val_old=255;init_variant();/ 初始化 51 的存放器TMOD=0x20;/ 用
51、T1 計時 8 位自動裝載定時模式TH1=0x19;/500 微秒溢出一次 ;250=(256-x)*12/11.0592->x=19TL1=0x19;EA=1;/ 開中斷ET1=1;TR1=0;/ 開定時器 T1while(1)key_val=scan_key();/ 按鍵輸入,有鍵按下 key_val 為 0-7 ,無鍵按下 key_val 為 255 if(key_val!=key_val_old)key_val_old=key_val;if(key_val!=255&&cnt_state!=2) audio_out=0;delay(100);/ 延時去抖動audi
52、o_out=1;switch(key_val)case0:case1:case2:case3:case4:case5:if(key_index<6)/ 密碼為 6 位,超過 6 位視為輸入無效 show_valkey_index=key_val; key_index+;break;case6:/ 確認鍵 if(check_input_pw()/ 密碼正確error_num=0;/ 密碼輸入錯誤次數清零/ pw_error=1;/ 密碼錯誤指示燈滅relay_open=0;/ 開鎖驅動信號燈亮open_lock=0;/ 已開鎖信號燈亮audio_out=0;delay(50000);audio_out=1;delay(50000);audio_out
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國數顯量具產銷需求分析及投資發展前景預測研究報告
- 湖北省襄陽三中2025年高考英語二模試卷含解析
- 職業技術學院2024級計算機網絡技術專業人才培養方案
- 廣東省廣州市2025屆高三下學期綜合測試(二)(二模)數學試題 含解析
- 上海市金山區2024-2025學年八年級下學期中化學試題(原卷版+解析版)
- 生態環境監測中的遙感與GIS技術考核試卷
- 電氣安裝石油與開采設備考核試卷
- 管道配件生產的自動化技術考核試卷
- 船舶改裝施工過程中的質量安全管理協同考核試卷
- 納米材料在海水淡化處理中的應用考核試卷
- 遠動設備故障處理措施
- 藥浴嬰幼兒計劃書
- 靜態熱機械分析及動態熱機械分析
- 《真空熱處理爐》課件
- 醫院檢驗科實驗室生物安全管理手冊
- 幼兒園《村居》教案
- 社會主義發展史智慧樹知到課后章節答案2023年下齊魯師范學院
- 地鐵保護區范圍施工及開挖施工保護方案
- 精準屈光性白內障手術課件
- 2023煤炭礦區地質勘查成果總結報告編寫規范
- 職業病危害與防治培訓PPT模板(含完整內容)13
評論
0/150
提交評論