单片机学习小组
直播中

刘勇

7年用户 1292经验值
私信 关注

怎样去设计一种基于单片机的四位密码锁呢

怎样去设计一种基于单片机的四位密码锁呢?其程序代码该怎样去实现呢?

回帖(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;          
}
举报

更多回帖

×
20
完善资料,
赚取积分