新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于单片机控制的密码锁设计(含电路图及源程序)

基于单片机控制的密码锁设计(含电路图及源程序)

作者:时间:2012-09-14来源:网络收藏

key_val: 返回按键的值 255-表示无按键按下
key_index: 当前按键是哪一位密码
T1_cnt: 定时器计数溢出数
cnt_val_15s: 报警计时的数值
cnt_val_5s: 待机时间计时
cnt_val_4s: 输入正确,等待4秒清除开锁信号
cnt_state: 计时状态
error_num: 错误次数
led_seg_code:数码管7段码
*/
#include reg51.h
/*说明key0=P1^0; key1=P1^1;key2=P1^2; key3=P1^3;key4=P1^4;key5=P1^5;enter=P1^6;esc=P1^7;*/
sbit relay_open=P3^0; //电磁锁开锁驱动
sbit pw_error=P3^1; //密码错误信号
sbit alarm_out=P3^2; //报警输出
sbit open_lock=P3^3; //已开锁指示信号
sbit audio_out=P3^4; //有源蜂鸣器
unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state;
unsigned int data T1_cnt;
unsigned char data key_val,key_index,key_val_old;
unsigned char data state_val,error_num;
unsigned char data show_val[6];
char code init_val[6]={1,2,3,4,5,0};
char code led_seg_code[11]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//led_seg_code[0-9]代表0-9 led_seg_code[10]=0x00数码管不显示任何内容
//--------延时程序----------------
void delay(unsigned int i)//延时
{ while(--i); }
//--------清除输入内容----------
void init_variant()
{unsigned char i;
for(i=0;i6;i++)
show_val[i]=10; //led_seg_code[10]=0x00表示数码管不显示任何内容
key_index=0; //没有任何输入或清除所有输入时,保存当前键的位置
}
//---------按键扫描---------------
unsigned char scan_key()
{ unsigned char i,k;
i=P1;
if (i==0xff cnt_state!=2)
{ k=255; } //无键按下
else //有键按下
{ delay(500); //延时去抖动
if(i!=P1)
{k=255;}
else
{ TR1=1; //有键按下则开定时器,启动待机计时
cnt_val_5s=0;
switch (i)
{ case 0xfe: k=0; break;
case 0xfd: k=1; break;
case 0xfb: k=2; break;
case 0xf7: k=3; break;
case 0xef: k=4; break;
case 0xdf: k=5; break;
case 0xbf: k=6; break;
case 0x7f: k=7; break;
}
}
}
return k;
}
//---------数码管显示---------------
void led_show()
{P0=led_seg_code[show_val[0]];
P2=0xdf;
delay(500);
P0=led_seg_code[show_val[1]];
P2=0xef;
delay(500);
P0=led_seg_code[show_val[2]];
P2=0xf7;
delay(500);
P0=led_seg_code[show_val[3]];
P2=0xfb;
delay(500);
P0=led_seg_code[show_val[4]];
P2=0xfd;
delay(500);
P0=led_seg_code[show_val[5]];
P2=0xfe;
delay(500);
}
//--------定时器T1中断服务程序-----------------
void timer1() interrupt 3 //T1中断
{ T1_cnt++;
if(T1_cnt>3999) //如果计数>3999, 计时1s
{ T1_cnt=0;
switch (cnt_state)
{ case 0: //待机,需要计时5s
if(cnt_val_5s5)
{ cnt_val_5s++;}
else
{ cnt_val_5s=0;
init_variant();//待机计时到5秒时,清除输入的内容
TR1=0; //停止计时
}
break;
case 1://密码输入正确,需要计时4s
if(cnt_val_4s4)
{ cnt_val_4s++;}
else
{ cnt_val_4s=0;
init_variant();//密码输入正确,计时到4秒时,清除输入的内容
open_lock=1; //已开锁信号清零
relay_open=1; //开锁信号清零
cnt_state=0;
TR1=0; //停止计时
}
break;
case 2: //密码输入错误3次,计时15s
if(cnt_val_15s15)
{ cnt_val_15s++;}
else
{ cnt_val_15s=0;
init_variant();//三次密码错误时,计时15秒,清除输入的内容
open_lock=1; // 清除所有指示和报警
relay_open=1;
alarm_out=1;
pw_error=1;
cnt_state=0;
TR1=0; //停止计时
}
break;
}
}
}
//--------判断键盘输入内容与密码是否一致------
unsigned char check_input_pw()
{ unsigned char i,k;
k=1;
for(i=0;i6;i++)
{ k=k (show_val[i]==init_val[i]); }
return k;
}
//---------主程序----------------
main()
{ //初始化各变量
audio_out=1;
P3=0xff;
cnt_val_15s=0;
cnt_val_5s=0;
cnt_val_4s=0;
cnt_state=0;
//0-待机计时5s状态;1-密码正确,计时4s状态 ;2-三次密码错误,处于计时15秒状态。
T1_cnt=0;
error_num=0;
key_val_old=255;
init_variant();

电路图文章专题:电路图符号大全


电路图符号相关文章:电路图符号大全




评论


相关推荐

技术专区

关闭