该程序是基于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提供下载: |