該程序是基于51單片機(jī)設(shè)計(jì)的電子密碼鎖,功能較為簡(jiǎn)單,目前僅有修改密碼和檢測(cè)這一功能,以下是操作過(guò)程 運(yùn)行仿真的初始界面 左邊矩陣按鍵從左邊第一行第一列起為0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 按下按鍵后界面如下,當(dāng)四位數(shù)碼管都顯示后,按下矩陣鍵盤上任意按鍵確認(rèn)密碼 密碼錯(cuò)誤D1紅燈亮起,密碼正確D2綠燈亮起 當(dāng)按下獨(dú)立按鍵時(shí),中斷觸發(fā),進(jìn)入密碼修改,此時(shí)界面如同初始界面,輸入原始密碼,原始密碼正確,綠燈亮起,等待輸入新密碼,此時(shí)界面顯示原始密碼。原始密碼錯(cuò)誤紅燈亮起,退出修改,返回初始狀態(tài)。 新密碼輸入會(huì)將原始密碼覆蓋,輸入完成紅綠燈同時(shí)亮起。 1s后返回初始界面,密碼修改完成。
單片機(jī)源程序如下: - #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}; //數(shù)碼管段選表,共陽(yáng)數(shù)碼管
- uchar password[4]={0xf9,0xf9,0xa4,0x90}; //初始密碼1129
- void delay_ms(uint t); //函數(shù)聲明
- void keys_scan();
- void digdisp();
- void Init();
- void delay_ms(uint t) //延時(shí)函數(shù)
- {
- 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); //松手檢測(cè)
- disp[time]=smgduan[k]; //將鍵值對(duì)應(yīng)的段選碼送入顯示數(shù)組
- time++; //按鍵次數(shù)檢測(cè)
- if((time>4)&&(state!=1)) //檢測(cè)四位密碼是否全部輸入
- {
- time=0;
- for(i=0;i<4;i++)
- {
- if(disp[i]!=password[i]) //逐位檢測(cè)輸入密碼是否正確
- {
- LED_Green=1; //輸入密碼不正確,紅燈點(diǎn)亮
- LED_Red=0;
- break;
- }
- if(i==3) //輸入密碼正確綠燈點(diǎn)亮
- {
- LED_Green=0;
- LED_Red=1;
- }
- }
- delay_ms(1000); //延時(shí)1s
- }
- }
- }
- digdisp(); //調(diào)用顯示函數(shù)
- }
- void digdisp() //數(shù)碼管顯示函數(shù)
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- switch(i) //采用24譯碼器,位選數(shù)碼管
- {
- 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]; //將顯示數(shù)組的段選值送入數(shù)碼管
- delay_ms(2); //延時(shí)
- }
- }
- void main() //主函數(shù)
- {
- uchar i;
- EA=1;
- EX0=1;
- IT0=1; //打開(kāi)外部中斷0,設(shè)置觸發(fā)方式為下降沿觸發(fā)
- while(1)
- {
- if((time==0)&&(state!=1)) //檢測(cè)輸入位數(shù),確定是否要進(jìn)行初始化
- {
- LED_Green=1;
- LED_Red=1; //紅、綠燈熄滅
- for(i=0;i<4;i++)
- {
- disp[i]=0xbf; //初始化段選數(shù)組
- }
- }
- keys_scan(); //調(diào)用按鍵掃描函數(shù)
- }
- }
- void INI0() interrupt 0 //外部中斷0
- {
- uchar i;
- state=1; //設(shè)置狀態(tài)變量state,告訴程序正在執(zhí)行中斷過(guò)程,即設(shè)置密碼過(guò)程
- for(i=0;i<4;i++)
- {
- disp[i]=0xbf;
- }
- digdisp();
- time=0;
- while((time<4)&&(state==1)) //修改密碼前請(qǐng)先輸入原密碼
- {
- keys_scan(); //對(duì)原密碼的按鍵掃描
- }
- for(i=0;i<4;i++)
- {
- if(disp[i]!=password[i]) //檢測(cè)所輸入的原密碼是否正確
- {
- LED_Green=1; //不正確結(jié)束for循環(huán),紅燈點(diǎn)亮
- LED_Red=0;
- delay_ms(1000);
- break;
- }
- if(i==3) //正確,綠燈點(diǎn)亮
- {
- time=0;
- LED_Green=0;
- LED_Red=1;
- delay_ms(1000);
- while(time<4)
- {
- keys_scan(); //進(jìn)行按鍵掃描檢測(cè)輸入的新密碼
- }
- for(i=0;i<4;i++)
- {
- password[i]=disp[i]; //將輸入的新密碼送入密碼數(shù)組
- }
- LED_Green=0;
- LED_Red=0; //密碼修改完成,紅綠燈同時(shí)點(diǎn)亮
- delay_ms(3000);
- }
- }
- state=0; //結(jié)束中斷
- time=0; //按鍵次數(shù)初始化
- }
復(fù)制代碼
所有資料51hei提供下載:
電子密碼鎖.zip
(340.33 KB, 下載次數(shù): 76)
2020-11-26 23:38 上傳
點(diǎn)擊文件名下載附件
包含完整程序和proteus仿真
|