单片机 密码锁 代码
怎样去设计一种基于单片机的四位密码锁呢?其程序代码该怎样去实现呢?
回帖(1)
2022-1-21 15:04:41
#include
/*****************************************************************************/
//变量定义
/*****************************************************************************/
***it wei1=P3^1;
***it wei2=P3^4;
***it wei3=P3^5;
***it wei4=P3^6;
//定义位选
***it led=P3^0;
//定义led灯
//模拟开锁功能
***it buzzer=P3^7;
//定义蜂鸣器
//模拟提示报警功能
unsigned char pwnum=0;
//密码位选
//用来记录此时的键值已经在哪个密码位
bit err=0;
//密码错误标志位
//err=0时
//密码没有错误
//err=1
//进入密码有误状态,接下执行密码错误函数
unsigned char count=0;
//错误次数
//记录输入键值的错误次数
unsigned char key=12;
//键值
//默认12,一直进入数码显示中断
bit restart=0;
//密码重置标志
//restart=0
//普通输入状态
//restart=1
//密码重置状态
unsigned char rsright=0;
//密码修改标志
//rsright=0
//退出密码修改状态
//rsright=1
/*****************************************************************************/
//定义数组
/*****************************************************************************/
unsigned char password[]={0,0,0,0};
//密码数组
//记录密码
unsigned char keynum[]={14,14,14,14} ;
//键值数组
//记录按下的键值,组成一个四位数组
unsigned char key_mod[]={0xd7,0xee,0xde,0xbe,0xed,
0xdd,0xbd,0xeb,0xdb,0xbb,
0xe7,0xb7} ;
//键模
//0~9
//重启键 退出重启键
unsigned char mod1[]={0x3f,0x06,0x1b,0x0f,0x26,
0x2d,0x3d,0x07,0x3f,0x2f,
0x39,0x76,0x3f,0x33,0xc0};
//低八位字模
//0~9
//10:E 11: N 12:O 13:R 14:*
unsigned char mod2[]={0x00,0x00,0x22,0x22,0x22,
0x22,0x22,0x00,0x22,0x22,
0x22,0x04,0x00,0x26,0x3f};
//高八位字模
//0~9
//10:E 11: N 12:O 13:R 14:*
函数包
#include
#include
/*---------------------------------------------------------------------------*/
//ms级delay函数
/*---------------------------------------------------------------------------*/
void delay(int i){
unsigned char k;
while (i--)
for(k=0;k<110;k++) ;
}
/*---------------------------------------------------------------------------*/
//数码管动态显示函数
//动态显示键值数组的值
/*---------------------------------------------------------------------------*/
void led_show(){
if(key==12){
wei1=0;
P0=mod1[keynum[0]];
P2=mod2[keynum[0]];
delay(5);
wei1=1;
//显示第一位的键值数组的值
wei2=0;
P0=mod1[keynum[1]];
P2=mod2[keynum[1]];
delay(5);
wei2=1;
//显示第二位的键值数组的值
wei3=0;
P0=mod1[keynum[2]];
P2=mod2[keynum[2]];
delay(5);
wei3=1;
//显示第三位的键值数组的值
wei4=0;
P0=mod1[keynum[3]];
P2=mod2[keynum[3]];
delay(5);
wei4=1;
//显示第四位的键值数组的值
}
}
/*---------------------------------------------------------------------------*/
//密码输入函数
//通过key将按下键值记录,检测key的值
//如果按下的键等于密码:
//按键提示音
//密码位+1:使下一次的密码位右移
//key置12:即清零键值,为下次中断做准备
//如果按下的键不等于密码:
//err置1,代表此处密码输入存在错误,为密码错误函数的进入做准备
//其它同正确
/*---------------------------------------------------------------------------*/
void pwin(){
if(key<10&&key>=0){
if(password[pwnum]==key){
//检测按键是否对应正确的密码
buzzer=0;
delay(500);
buzzer=1;
//按键提示音
pwnum++;
//密码位右移
key=12;
//重置键值
}else {
unsigned char i ;
for(i=0;i<50;i++) led_show();
err=1;
//输入中存在错误
buzzer=0;
delay(500);
buzzer=1;
//按键提示音
pwnum++;
//密码位右移
key=12;
//重置键值
}
}
}
/*****************************************************************************/
//密码正确函数
//err=0即为密码正确:此次密码无错误
//若处于普通输入状态:
//开锁:led亮
//开锁提示:鸣叫,显示"ON"
//按键数组清零
//密码位清零:为下次中断初始化
//若处于密码重置状态
//进入密码修改状态
//重置密码时,输入密码正确时的提示
//按键数组清零
//密码重置标志位清零:退出密码重置状态
//密码位清零:为下次中断初始化
/*****************************************************************************/
void pwright(){
while(pwnum==4&&err==0) {
if(restart==0){
unsigned char m=10;
led=1;
//灯亮:开锁功能
buzzer=0;
while(m--){
//显示"ON"
wei1=1;
wei2=1;
wei3=0 ;
P0=mod1[12];
P2=mod2[12];
delay(50);
wei3=1;
wei4=0;
P0=mod1[11];
P2=mod2[11];
delay(50);
wei4=1;
}buzzer=1;
delay(100);
led=0;
//开锁提示
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
pwnum=0;
//密码位清零
}else{
rsright=1;
//密码修改状态
buzzer=0;
P0=mod1[14];
P2=mod2[14];
//字模:*
wei1=0;
wei2=0;
wei3=0;
wei4=0;
//位选全开
delay(500);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//重置密码时,输入密码正确时的提示
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
restart=0;
//密码重置标志位清零
pwnum=0;
//密码位清零
}
}
}
/*****************************************************************************/
//密码错误函数
//当密码位等于4时(即密码完整输入一次),且此次输入中存在错误(err=1):
//记录错误次数
//密码错误提示
//按键数组清零,清除密码输入痕迹
//密码位清零:为下次中断初始化
//当错误次数累计到3时
//模拟报警
//错误次数清零
/*****************************************************************************/
void pwerror(){
if(pwnum==4&&err==1){
count++;
//每四位一次,记录密码输入错误次数
buzzer=0;
P0=0x40;
P2=0x15;
wei1=0;
wei2=0;
wei3=0;
wei4=0;
delay(500);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//显示"XXXX"
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
pwnum=0;
//密码位清零
err=0;
//重置"存在错误"
}
while(count==3){
unsigned char n=1000;
buzzer=0;
P0=0x40;
P2=0x15;
//显示X,表示错误
while(n--){
//显示*ERR
wei1=0;
P0=0xc0;
P2=0xff;
delay(10);
wei1=1;
wei2=0;
P0=mod1[10];
P2=mod2[10];
delay(10);
wei2=1;
wei3=0;
P0=mod1[13];
P2=mod2[13];
delay(10);
wei3=1;
wei4=0;
P0=mod1[13];
P2=mod2[13];;
delay(10);
wei4=1;
}
delay(30000);
//设置报警时长
buzzer=1;
//报警装置
count=0;
//错误次数清零
}}
/*****************************************************************************/
//密码重置函数
//当key=10时(密码重置键)
//进入密码重置状态
//提示进入密码重置状态
//key置12:即清零键值,为下次中断做准备
//密码位清零:为下次中断初始化
/*****************************************************************************/
void repw(){
unsigned char cnt=0;
if(
key==10){
restart=1;
//进入密码重置状态
buzzer=0;
P0=mod1[14];
P2=mod2[14];
//字模:*
wei1=0;
wei2=0;
wei3=0;
wei4=0;
//位选全开
delay(2000);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//显示****
key=12;
//key置12:即清零键值,为下次中断做准备
pwnum=0;
//位选重新计数
}
}
/*****************************************************************************/
//退出重置密码状态函数
/*****************************************************************************/
void backre(){
if(key==11)
restart=0;
key=12;
}
3.主函数
#include
#include
/*****************************************************************************/
//取键中断
//高级中断,打断显示中断
//利用key获取按键键值和修改密码
//执行密码的输入和相应的函数
/*****************************************************************************/
void get_key(void) interrupt 0{
char keys[]={0xfe,0xfd,0xfb,0xf7};
unsigned char i,k;
for(i=0;i<4;i++){
delay(10);//led_show();
//消抖
P1=keys;
if((P1&0xf0)!=0xf0){
//判断按键是否按下
for(k=0;k<12;k++){
if(key_mod[k]==P1) {
key=k;
//改变默认值位12的key值
keynum[pwnum]=k;
//记录键值
if(rsright!=0&&rsright<=4){
//重置密码正确时进入密码修改状态
rsright++;
password[pwnum]=key;
//修改密码
}
else {rsright=0;}
//将rsright清零,退出重置密码正确状态
}
}
pwin();
//密码输入函数
repw();
//密码重置函数
pwerror();
//密码错误函数
pwright();
//密码正确函数
backre();
//退出重置密码模式
}
}
}
/*****************************************************************************/
//数码管显示中断
/*****************************************************************************/
void ledshow() interrupt 2
{
led_show();
IE0=1;
//打开取键函数的中断
}
/*****************************************************************************/
//主程序
/*****************************************************************************/
void main(){
led=0;
IT1=1;
IT0=1;
//中断触发方式:下降沿触发
IE1=1;
IE0=1;
//中断请求标志
EX0=1;
EX1=1;
//中断允许
EA=1;
//总中断允许
PX0=1;
PX1=0;
//中断优先级
while(1)IE1=1;
}
#include
/*****************************************************************************/
//变量定义
/*****************************************************************************/
***it wei1=P3^1;
***it wei2=P3^4;
***it wei3=P3^5;
***it wei4=P3^6;
//定义位选
***it led=P3^0;
//定义led灯
//模拟开锁功能
***it buzzer=P3^7;
//定义蜂鸣器
//模拟提示报警功能
unsigned char pwnum=0;
//密码位选
//用来记录此时的键值已经在哪个密码位
bit err=0;
//密码错误标志位
//err=0时
//密码没有错误
//err=1
//进入密码有误状态,接下执行密码错误函数
unsigned char count=0;
//错误次数
//记录输入键值的错误次数
unsigned char key=12;
//键值
//默认12,一直进入数码显示中断
bit restart=0;
//密码重置标志
//restart=0
//普通输入状态
//restart=1
//密码重置状态
unsigned char rsright=0;
//密码修改标志
//rsright=0
//退出密码修改状态
//rsright=1
/*****************************************************************************/
//定义数组
/*****************************************************************************/
unsigned char password[]={0,0,0,0};
//密码数组
//记录密码
unsigned char keynum[]={14,14,14,14} ;
//键值数组
//记录按下的键值,组成一个四位数组
unsigned char key_mod[]={0xd7,0xee,0xde,0xbe,0xed,
0xdd,0xbd,0xeb,0xdb,0xbb,
0xe7,0xb7} ;
//键模
//0~9
//重启键 退出重启键
unsigned char mod1[]={0x3f,0x06,0x1b,0x0f,0x26,
0x2d,0x3d,0x07,0x3f,0x2f,
0x39,0x76,0x3f,0x33,0xc0};
//低八位字模
//0~9
//10:E 11: N 12:O 13:R 14:*
unsigned char mod2[]={0x00,0x00,0x22,0x22,0x22,
0x22,0x22,0x00,0x22,0x22,
0x22,0x04,0x00,0x26,0x3f};
//高八位字模
//0~9
//10:E 11: N 12:O 13:R 14:*
函数包
#include
#include
/*---------------------------------------------------------------------------*/
//ms级delay函数
/*---------------------------------------------------------------------------*/
void delay(int i){
unsigned char k;
while (i--)
for(k=0;k<110;k++) ;
}
/*---------------------------------------------------------------------------*/
//数码管动态显示函数
//动态显示键值数组的值
/*---------------------------------------------------------------------------*/
void led_show(){
if(key==12){
wei1=0;
P0=mod1[keynum[0]];
P2=mod2[keynum[0]];
delay(5);
wei1=1;
//显示第一位的键值数组的值
wei2=0;
P0=mod1[keynum[1]];
P2=mod2[keynum[1]];
delay(5);
wei2=1;
//显示第二位的键值数组的值
wei3=0;
P0=mod1[keynum[2]];
P2=mod2[keynum[2]];
delay(5);
wei3=1;
//显示第三位的键值数组的值
wei4=0;
P0=mod1[keynum[3]];
P2=mod2[keynum[3]];
delay(5);
wei4=1;
//显示第四位的键值数组的值
}
}
/*---------------------------------------------------------------------------*/
//密码输入函数
//通过key将按下键值记录,检测key的值
//如果按下的键等于密码:
//按键提示音
//密码位+1:使下一次的密码位右移
//key置12:即清零键值,为下次中断做准备
//如果按下的键不等于密码:
//err置1,代表此处密码输入存在错误,为密码错误函数的进入做准备
//其它同正确
/*---------------------------------------------------------------------------*/
void pwin(){
if(key<10&&key>=0){
if(password[pwnum]==key){
//检测按键是否对应正确的密码
buzzer=0;
delay(500);
buzzer=1;
//按键提示音
pwnum++;
//密码位右移
key=12;
//重置键值
}else {
unsigned char i ;
for(i=0;i<50;i++) led_show();
err=1;
//输入中存在错误
buzzer=0;
delay(500);
buzzer=1;
//按键提示音
pwnum++;
//密码位右移
key=12;
//重置键值
}
}
}
/*****************************************************************************/
//密码正确函数
//err=0即为密码正确:此次密码无错误
//若处于普通输入状态:
//开锁:led亮
//开锁提示:鸣叫,显示"ON"
//按键数组清零
//密码位清零:为下次中断初始化
//若处于密码重置状态
//进入密码修改状态
//重置密码时,输入密码正确时的提示
//按键数组清零
//密码重置标志位清零:退出密码重置状态
//密码位清零:为下次中断初始化
/*****************************************************************************/
void pwright(){
while(pwnum==4&&err==0) {
if(restart==0){
unsigned char m=10;
led=1;
//灯亮:开锁功能
buzzer=0;
while(m--){
//显示"ON"
wei1=1;
wei2=1;
wei3=0 ;
P0=mod1[12];
P2=mod2[12];
delay(50);
wei3=1;
wei4=0;
P0=mod1[11];
P2=mod2[11];
delay(50);
wei4=1;
}buzzer=1;
delay(100);
led=0;
//开锁提示
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
pwnum=0;
//密码位清零
}else{
rsright=1;
//密码修改状态
buzzer=0;
P0=mod1[14];
P2=mod2[14];
//字模:*
wei1=0;
wei2=0;
wei3=0;
wei4=0;
//位选全开
delay(500);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//重置密码时,输入密码正确时的提示
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
restart=0;
//密码重置标志位清零
pwnum=0;
//密码位清零
}
}
}
/*****************************************************************************/
//密码错误函数
//当密码位等于4时(即密码完整输入一次),且此次输入中存在错误(err=1):
//记录错误次数
//密码错误提示
//按键数组清零,清除密码输入痕迹
//密码位清零:为下次中断初始化
//当错误次数累计到3时
//模拟报警
//错误次数清零
/*****************************************************************************/
void pwerror(){
if(pwnum==4&&err==1){
count++;
//每四位一次,记录密码输入错误次数
buzzer=0;
P0=0x40;
P2=0x15;
wei1=0;
wei2=0;
wei3=0;
wei4=0;
delay(500);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//显示"XXXX"
keynum[0]=14;
keynum[1]=14;
keynum[2]=14;
keynum[3]=14;
//按键数组清零,清除密码输入痕迹
pwnum=0;
//密码位清零
err=0;
//重置"存在错误"
}
while(count==3){
unsigned char n=1000;
buzzer=0;
P0=0x40;
P2=0x15;
//显示X,表示错误
while(n--){
//显示*ERR
wei1=0;
P0=0xc0;
P2=0xff;
delay(10);
wei1=1;
wei2=0;
P0=mod1[10];
P2=mod2[10];
delay(10);
wei2=1;
wei3=0;
P0=mod1[13];
P2=mod2[13];
delay(10);
wei3=1;
wei4=0;
P0=mod1[13];
P2=mod2[13];;
delay(10);
wei4=1;
}
delay(30000);
//设置报警时长
buzzer=1;
//报警装置
count=0;
//错误次数清零
}}
/*****************************************************************************/
//密码重置函数
//当key=10时(密码重置键)
//进入密码重置状态
//提示进入密码重置状态
//key置12:即清零键值,为下次中断做准备
//密码位清零:为下次中断初始化
/*****************************************************************************/
void repw(){
unsigned char cnt=0;
if(
key==10){
restart=1;
//进入密码重置状态
buzzer=0;
P0=mod1[14];
P2=mod2[14];
//字模:*
wei1=0;
wei2=0;
wei3=0;
wei4=0;
//位选全开
delay(2000);
wei1=1;
wei2=1;
wei3=1;
wei4=1;
buzzer=1;
//显示****
key=12;
//key置12:即清零键值,为下次中断做准备
pwnum=0;
//位选重新计数
}
}
/*****************************************************************************/
//退出重置密码状态函数
/*****************************************************************************/
void backre(){
if(key==11)
restart=0;
key=12;
}
3.主函数
#include
#include
/*****************************************************************************/
//取键中断
//高级中断,打断显示中断
//利用key获取按键键值和修改密码
//执行密码的输入和相应的函数
/*****************************************************************************/
void get_key(void) interrupt 0{
char keys[]={0xfe,0xfd,0xfb,0xf7};
unsigned char i,k;
for(i=0;i<4;i++){
delay(10);//led_show();
//消抖
P1=keys;
if((P1&0xf0)!=0xf0){
//判断按键是否按下
for(k=0;k<12;k++){
if(key_mod[k]==P1) {
key=k;
//改变默认值位12的key值
keynum[pwnum]=k;
//记录键值
if(rsright!=0&&rsright<=4){
//重置密码正确时进入密码修改状态
rsright++;
password[pwnum]=key;
//修改密码
}
else {rsright=0;}
//将rsright清零,退出重置密码正确状态
}
}
pwin();
//密码输入函数
repw();
//密码重置函数
pwerror();
//密码错误函数
pwright();
//密码正确函数
backre();
//退出重置密码模式
}
}
}
/*****************************************************************************/
//数码管显示中断
/*****************************************************************************/
void ledshow() interrupt 2
{
led_show();
IE0=1;
//打开取键函数的中断
}
/*****************************************************************************/
//主程序
/*****************************************************************************/
void main(){
led=0;
IT1=1;
IT0=1;
//中断触发方式:下降沿触发
IE1=1;
IE0=1;
//中断请求标志
EX0=1;
EX1=1;
//中断允许
EA=1;
//总中断允许
PX0=1;
PX1=0;
//中断优先级
while(1)IE1=1;
}
举报
更多回帖