該程序是基于51單片機設計的電子密碼鎖,功能較為簡單,目前僅有修改密碼和檢測這一功能,以下是操作過程 運行仿真的初始界面 左邊矩陣按鍵從左邊第一行第一列起為0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 按下按鍵后界面如下,當四位數碼管都顯示后,按下矩陣鍵盤上任意按鍵確認密碼 密碼錯誤D1紅燈亮起,密碼正確D2綠燈亮起 當按下獨立按鍵時,中斷觸發,進入密碼修改,此時界面如同初始界面,輸入原始密碼,原始密碼正確,綠燈亮起,等待輸入新密碼,此時界面顯示原始密碼。原始密碼錯誤紅燈亮起,退出修改,返回初始狀態。 新密碼輸入會將原始密碼覆蓋,輸入完成紅綠燈同時亮起。 1s后返回初始界面,密碼修改完成。
單片機源程序如下: - #include "reg51.h" //包含頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define DIG P0
- #define keys P1
- sbit LSA=P2^1;
- sbit LSB=P2^2;
- sbit LED_Green=P2^3;
- sbit LED_Red=P2^4;
- uchar time=0,state;
- uchar disp[4]={0xbf,0xbf,0xbf,0xbf};
- uchar smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //數碼管段選表,共陽數碼管
- uchar password[4]={0xf9,0xf9,0xa4,0x90}; //初始密碼1129
- void delay_ms(uint t); //函數聲明
- void keys_scan();
- void digdisp();
- void Init();
- void delay_ms(uint t) //延時函數
- {
- uchar i;
- for(;t>0;t--)
- {
- for(i=0;i<125;i++);
- }
- }
- void keys_scan() //矩陣按鍵掃描
- {
- uchar i,k;
- keys=0xf0;
- if(keys!=0xf0)
- {
- delay_ms(2);
- if(keys!=0xf0)
- {
- switch(keys) //確定行
- {
- case(0x70):
- k=0;break;
- case(0xb0):
- k=4;break;
- case(0xd0):
- k=8;break;
- case(0xe0):
- k=12;break;
- }
- keys=0x0f;
- if(keys!=0x0f)
- {
- switch(keys) //確定列
- {
- case(0x07):
- ;break;
- case(0x0b):
- k=k+1;break;
- case(0x0d):
- k=k+2;break;
- case(0x0e):
- k=k+3;break;
- }
- }
- while(keys!=0x0f); //松手檢測
- disp[time]=smgduan[k]; //將鍵值對應的段選碼送入顯示數組
- time++; //按鍵次數檢測
- if((time>4)&&(state!=1)) //檢測四位密碼是否全部輸入
- {
- time=0;
- for(i=0;i<4;i++)
- {
- if(disp[i]!=password[i]) //逐位檢測輸入密碼是否正確
- {
- LED_Green=1; //輸入密碼不正確,紅燈點亮
- LED_Red=0;
- break;
- }
- if(i==3) //輸入密碼正確綠燈點亮
- {
- LED_Green=0;
- LED_Red=1;
- }
- }
- delay_ms(1000); //延時1s
- }
- }
- }
- digdisp(); //調用顯示函數
- }
- void digdisp() //數碼管顯示函數
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- switch(i) //采用24譯碼器,位選數碼管
- {
- case(0):
- LSA=0;LSB=0;break;
- case(1):
- LSA=1;LSB=0;break;
- case(2):
- LSA=0;LSB=1;break;
- case(3):
- LSA=1;LSB=1;break;
- }
- DIG=disp[i]; //將顯示數組的段選值送入數碼管
- delay_ms(2); //延時
- }
- }
- void main() //主函數
- {
- uchar i;
- EA=1;
- EX0=1;
- IT0=1; //打開外部中斷0,設置觸發方式為下降沿觸發
- while(1)
- {
- if((time==0)&&(state!=1)) //檢測輸入位數,確定是否要進行初始化
- {
- LED_Green=1;
- LED_Red=1; //紅、綠燈熄滅
- for(i=0;i<4;i++)
- {
- disp[i]=0xbf; //初始化段選數組
- }
- }
- keys_scan(); //調用按鍵掃描函數
- }
- }
- void INI0() interrupt 0 //外部中斷0
- {
- uchar i;
- state=1; //設置狀態變量state,告訴程序正在執行中斷過程,即設置密碼過程
- for(i=0;i<4;i++)
- {
- disp[i]=0xbf;
- }
- digdisp();
- time=0;
- while((time<4)&&(state==1)) //修改密碼前請先輸入原密碼
- {
- keys_scan(); //對原密碼的按鍵掃描
- }
- for(i=0;i<4;i++)
- {
- if(disp[i]!=password[i]) //檢測所輸入的原密碼是否正確
- {
- LED_Green=1; //不正確結束for循環,紅燈點亮
- LED_Red=0;
- delay_ms(1000);
- break;
- }
- if(i==3) //正確,綠燈點亮
- {
- time=0;
- LED_Green=0;
- LED_Red=1;
- delay_ms(1000);
- while(time<4)
- {
- keys_scan(); //進行按鍵掃描檢測輸入的新密碼
- }
- for(i=0;i<4;i++)
- {
- password[i]=disp[i]; //將輸入的新密碼送入密碼數組
- }
- LED_Green=0;
- LED_Red=0; //密碼修改完成,紅綠燈同時點亮
- delay_ms(3000);
- }
- }
- state=0; //結束中斷
- time=0; //按鍵次數初始化
- }
復制代碼
51hei.png (2.75 KB, 下載次數: 53)
下載附件
2020-11-27 00:08 上傳
所有資料51hei提供下載:
電子密碼鎖.zip
(340.33 KB, 下載次數: 76)
2020-11-26 23:38 上傳
點擊文件名下載附件
包含完整程序和proteus仿真 下載積分: 黑幣 -5
|