Ⅰ 基于单片机电子密码锁设计~
以前我在网上找到过密码锁的源代码,你可以找找。给你一个思路吧,先用7个端口做成3*4矩阵键盘,0~9 * #共12个键,另外用4个端口做红灯输出、绿灯输出、报警输出、开锁输出。*键为取消键,#键为确认键,密码可存入单片机的ROM中(不能改密码)或存入24CXX串行E2PROM(可改密码)。键盘处理方法可以用两种,一种是在主程序里不停扫描端口检测按键消抖动后处理按键。另一种方法是键盘通过与门接到外部中断,当有键按下时会引起中断,然后在中断程序中消抖动后处理按键。经过键盘处理程序后就可以知道按下什么键,是数字就存入你自己指定的密码缓存寄存器,是取消就清除密码缓存寄存器,是确认就读出密码与密码缓存寄存器的值比较。密码的存放(不加密8位数):设ABCD,4个字节存放密码,A中高4位与低4位各存入一位数,其它的跟A一样。再就是用一个字节的寄存器存放错误次数,错一次加1,达到3次报警端口输出信号,如果密码正确就清零这个寄存器。
Ⅱ 基于单片机课程设计密码锁
采用数字密码锁电路的好处就是设计简单。用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。
电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。
密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。
Ⅲ 单片机智能密码锁论文
近年来,随着改革开放的深入发展,电子电器的飞速发展。人民的生活水平有了很大提高。各种高档家电产品和贵重物品为许多家庭所拥有。然而不法分子也是越来越多,原因在于大部分人防盗意识还不够强,造成偷盗现象屡见不鲜。越来越多的居民家庭对财产安全问题十分担忧。因此,出于安全方便等方面的需求,电子密码锁相继问世。
本设计是以单片机AT89S51为主控芯片,并结合外围液晶显示LCD1602、存储芯片AT24C02、红外遥控HS0038,以及键盘输入、复位、电源等电路组合而成。系统能够完成开锁、报警、修改密码等基本功能,还能够通过红外来控制单片机的开锁,以及掉电储存密码的功能。整个设计在Keil开发环境下,用C语言编写主控芯片的控制程序来实现具有多功能的电子密码锁。
Ⅳ 用单片机C语言控制6位密码锁。要求有一个清除键和确认键,密码输错了会有报警音。请高手帮助了
我找到了一个,来自《51单片机C语言应用技术开发大全》
SCH图正在绘制中。。。
#include <REGX51.H>//51单片机的头文件
typedef unsigned char uchar; //类型定义,定义uchar类型
typedef unsigned int uint; //类型定义,定义uint 类型
//键盘子程序相关说明。
#define BLANKCHAR 10 //定义空白常量
#define PCHAR 11 //定义字符P常量
#define OPENCHAR 12 //定义开锁字符常量
#define ALARMCHAR 13 //定义字符A常量
#define LINECHAR 14 //定义字符-常量
#define BACKKEY 0X0D //定义退格键常量
#define ENTERKEY 0X0F //定义确认键常量
#define LOCKKEY 0X0E //定义闭锁键常量
#define NO_KEY 20 //定义无按键返回值
#define KEYPORT P2 //定义键盘端扮盯口
//Delay1Ms
void Delay1Ms()
{
uint i;
for (i=0;i<1000;i++);
}
//定义按键扫描码表 按键扫描时,4位列线和4位行线组成字节数据表
uchar code KEYCODE[]=
{0XEE,0XED,0XEB,0XE7,
0XDE,0XDD,0XDB,0XD7,
0XBE,0XBD,0XBB,0XB7,
0X7E,0X7D,0X7B,0X77};
uchar KeyPre; //保存上次扫描按键的键值
uchar KeyUp;
//用于控制按键去抖动操作。1:扫描时去抖动 2:等待释放 3:释放时去抖动。
#define LEDPORT P0 //定义显示器段码输出端口
#define LEDCON P1 //定义显示器位控制端口
uchar code SEGCODE[]=
{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,// 0~9的共阳极代码
0xff,//不显示的共阳极段码侍缺慎
0X8C,//字符P的共阳极段码
0X8F,//┝的共阳极段码
0X88,//字符A的共阳极段码
0XBF,//字符-的共阳极段码
};
//定义LED位码控制码
uchar code BITCODE[]={0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f};
uchar DispBuf[6]; //保存显示的字符
bit DispNormal; //控制显示时,是正常显示还是闪烁显示。
uchar DispCnt; /老敬/控制闪烁显示时的频率。
#define SHORT_TIME 10 //蜂鸣器响200ms
#define LONG_TIME 100 //蜂鸣器响2s
#define LONGER_TIME 9000 //蜂鸣器响3 minutes
sbit ALARMCON=P3^4; //定义报警控制引脚
bit AlarmEnable; //是否报警或声音提示
uint AlarmTime; //控制报警时间长度
sbit LOCKCON=P3^3; //定义电子锁控制引脚
uchar code PassWord[]={1,2,3,4,5}; //定义初时密码表
uchar PassInBuf[6]; //保存输入的密码字符
uchar PassPosi; //用户输入密码字符存放在PassInBuf[]的位置。
bit TimerBit; //20ms定时时间到
uchar SysMode; //系统所处模式 0:输入密码模式 1:报警模式 2:开锁模式
uchar ErrorCnt; //用户连续输入密码出错次数。
/*
入口参数:
FillChar:写入缓冲区的字符
出口参数:无
*/
void Fill_Buf(uchar FillChar)
{
uchar i;
for(i=0;i<6;i++)
{
DispBuf[i]=FillChar;//用字符FillChar填充DispBuf[i]
PassInBuf[i]=FillChar; //用字符FillChar填充PassInBuf [i]
}
}
void Fill_Buf_P()
{
Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '
DispBuf[0]=PCHAR;// DispBuf[0]='P'
}
void Fill_Buf_O()
{
Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '
DispBuf[0]=OPENCHAR; // DispBuf[0]='┝'
}
void Fill_Buf_A()
{
Fill_Buf(LINECHAR); // DispBuf[1..5]= ' -----'
DispBuf[0]=ALARMCHAR; // DispBuf[0]='A'
}
/*
入口参数:
DispPosi:要显示数据的LED号。
DispChar:要显示的内容。
出口参数:无
*/
void Disp_Led_Sin(uchar DispChar,uchar DispPosi)
{
LEDPORT=SEGCODE[DispChar];//输出显示段码
LEDCON&=BITCODE[DispPosi];//输出显示位码
Delay1Ms(); //延时1MS
LEDCON|=0X3F;//关闭显示器
}
/*(2)关闭显示函数Disp_Led_OFF。
函数Disp_Led_OFF在显示器上显示空白字符,主要用在闪烁显示。函数通过6次调用Disp_Led_Sin实现所需功能。代码如下:*/
void Disp_Led_OFF()
{
uchar i;
LEDCON|=0X3F;// 关闭显示器
for(i=0;i<6;i++)
{
Disp_Led_Sin(BLANKCHAR,i);//逐个显示空白字符
}
}
void Disp_Led_All()
{
uchar i;
LEDCON|=0X3F; // 关闭显示器
for(i=0;i<6;i++)
{
Disp_Led_Sin(DispBuf[i],i); //显示DispBuf[]中的数值
}
}
void Disp_LED()
{
DispCnt++;
DispCnt%=10;
if(DispCnt==0)
{
DispNormal=~DispNormal;//200ms将闪烁显示控制位取反
}
if(SysMode==1)
{//报警模式,闪烁显示
if(!DispNormal)
{
Disp_Led_OFF();//显示空白字符
return;
}
}
Disp_Led_All();//显示DispBuf[]中的数值
}
/*
入口参数:
stime:蜂鸣器鸣叫时间。
出口参数:无
*/
void Sys_Speaker(uint stime)
{
AlarmEnable=1;//允许报警
AlarmTime=stime;//报警时间长短
}
void Sys_Alarm()
{
if(AlarmEnable==1)
{//允许报警
ALARMCON=0;//报警
AlarmTime--;
if(AlarmTime==0)
{//停止报警时间到
AlarmEnable=0;
ALARMCON=1;//禁止报警
if(SysMode==1)
{//报警发生在模式1时,要返回模式0
SysMode=0;
Fill_Buf_P();//显示P
}
}
}
}
/*
入口参数:无
出口参数:按键值或无按键
*/
uchar Find_Key()
{
uchar KeyTemp,i;
KEYPORT=0xf0;//行线输出0,列线输出全1
KeyTemp=KEYPORT;//读按键端口值
if(KeyTemp==0xf0)
return NO_KEY;//无键按下,返回
KEYPORT=KeyTemp|0x0f;//列线输出,行线输入
KeyTemp=KEYPORT;//读取按键端口值
for(i=0;i<16;i++)
{
if(KeyTemp==KEYCODE[i])//根据按键端口扫描值,查找按键值
return i;//返回按键值
}
return NO_KEY;
}
/*
入口参数:无
出口参数:按键值或无按键
*/
uchar Scan_Key()
{
uchar KeyTemp;
KeyTemp=Find_Key();//扫描键盘,获得按键值
if(KeyTemp==NO_KEY)
{
if(KeyUp<2)
{//无按键按下,返回
KeyUp=0;
return NO_KEY;
}
if(KeyUp==2)
{//按键要释放,延时去抖动
KeyUp=3;
return NO_KEY;
}
if(KeyUp==3)
{//按键释放,返回键值
KeyUp=0;
return KeyPre;
}
}
else
{
if(KeyUp==0)
{//有键按下,保存键值
KeyUp=1;
KeyPre=KeyTemp;
}
else if(KeyUp==1)
{//去抖动后,再次测到有按键按下
if( KeyPre==KeyTemp)
KeyUp=2;
else
KeyPre=KeyTemp;
} else if(KeyUp==3)
{//等待按键释放
KeyUp=2;
}
}
return NO_KEY;
}
/*
入口参数:
Key:按键值
出口参数:无
*/
void Key_Process(uchar Key)
{
uchar i;
if(Key==NO_KEY)
return ;//无按键,不处理
switch(SysMode)
{
case 0://输入密码
switch(Key)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
DispBuf[PassPosi]=LINECHAR;//显示'-'
PassInBuf[PassPosi]=Key;//保存用户输入的密码
if(PassPosi<5)
PassPosi++;//调整密码输入位置
Sys_Speaker(SHORT_TIME);//发按键提示音
break;
case BACKKEY://退格键
DispBuf[PassPosi]=BLANKCHAR;//显示' '
PassInBuf[PassPosi]=BLANKCHAR;//清除当前位置的密码
if(PassPosi>1)
PassPosi--;//调整显示位置
Sys_Speaker(SHORT_TIME);//发按键提示音
break;
case ENTERKEY://确定按键
for(i=0;i<5;i++)
{//比较用户输入密码与系统预设密码是否一致
if(PassInBuf[i+1]!=PassWord[i])
break;
}
if(i>=5)
{//输入密码正确
Fill_Buf_O();//显示开锁状态
PassPosi=1;
LOCKCON=1;//开锁
ErrorCnt=0;
Sys_Speaker(LONG_TIME);//发长提示音
SysMode=2;//转模式2
}
else
{
ErrorCnt++;//出错次数加一
if(ErrorCnt>2)
{//次数超过3次
ErrorCnt=0;
Fill_Buf_A();//显示报警状态
PassPosi=1;
Sys_Speaker(LONGER_TIME);//发报警音
SysMode=1;
}
else
{//出错次数少于3次,用户重新输入
Fill_Buf_P();
PassPosi=1;
Sys_Speaker(LONG_TIME);
}
}
break;
case LOCKKEY://闭锁键
Fill_Buf_P();//显示P
PassPosi=1;
Sys_Speaker(SHORT_TIME);
break;
}
break;
case 2://开锁状态
if(Key==LOCKKEY)
{//用户按动闭锁按键
Fill_Buf_P();
SysMode=0;
LOCKCON=0;//闭锁
Sys_Speaker(SHORT_TIME);
}
break;
}
}
void Ini_Timer0()
{
TMOD&=0XF0;
TMOD|=0X01;// 初始化T0,模式1
TR0=0;
TH0=(65536-20000)/256;//T0 赋计数初值
TL0=(65536-20000)%256;
TR0=1;//启动T0
ET0=1;//允许T0中断
}
void Timer0() interrupt 1
{
TR0=0;
TH0=(65536-20000)/256; //T0 赋计数初值
TL0=(65536-20000)%256;
TR0=1;
TimerBit=1;//定时时间到
}
void Ini_System()
{
PassPosi=1;
LOCKCON=0;//闭锁
Ini_Timer0();//初始化T0
Fill_Buf_P();
EA=1;//允许系统中断
}
void main()
{
uchar KeyTemp;
Ini_System();
while(1)
{
if (TimerBit==1)
{//定时时间到
Disp_LED();//刷新显示器
Sys_Alarm();//报警处理
KeyTemp=Scan_Key();//扫描按键
Key_Process(KeyTemp);//按键处理
TimerBit=0;
}
}
}
Ⅳ 51单片机关于密码锁的毕业设计,论文
程序设计内容
(1). 密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。
(2). 密码的输入问题:由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。
(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。
C语言源程序
#includeunsignedcharcodeps[]={1,2,3,4,5};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsignedcharpslen=9;unsignedchartemplen;
unsignedchardigit;unsignedcharfuncount;
unsignedchardigitcount;
unsignedcharpsbuf[9];
bitcmpflag;
bithibitflag;
biterrorflag;
bitrightflag;
unsignedintsecond3;
unsignedintaa;
unsignedintbb;
bitalarmflag;
bitexchangeflag;
unsignedintcc;
unsignedintdd;
bitokflag;
unsignedcharoka;
unsignedcharokb;
voidmain(void)
{
unsignedchari,j;
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%6;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(cmpflag==0)
{
if(P3_6==0)//functionkey
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_6==0)
{
if(hibitflag==0)
{
funcount++;
if(funcount==pslen+2)
{
funcount=0;
cmpflag=1;
}
P1=dispcode[funcount];
}
else
{
second3=0;
}
while(P3_6==0);
}
}
if(P3_7==0)//digitkey
{
for(i=10;i>0;i--)
for(j=248;j>0;j--);
if(P3_7==0)
{
if(hibitflag==0)
{
digitcount++;
if(digitcount==10)
{
digitcount=0;
}
P2=dispcode[digitcount];
if(funcount==1)
{
pslen=digitcount;
templen=pslen;
}
elseif(funcount>1)
{
psbuf[funcount-2]=digitcount;
}
}
else
{
second3=0;
}
while(P3_7==0);
}
}
}
else
{
cmpflag=0;
for(i=0;i
{
if(ps[i]!=psbuf[i])
{
hibitflag=1;
i=pslen;
errorflag=1;
rightflag=0;
cmpflag=0;
second3=0;
gotoa;
}
}
cc=0;
errorflag=0;
rightflag=1;
hibitflag=0;
a: cmpflag=0;
}
}
}
voidt0(void)
interrupt1using0{ TH0=(65536-500)/256;
TL0=(65536-500)%6;
if((errorflag==1)&&(rightflag==0))
{
bb++;
if(bb==800)
{
bb=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)
{
P0_0=~P0_0;
}
aa++;
if(aa==800)
{
aa=0;
P0_1=~P0_1;
}
second3++;
if(second3==6400)
{
second3=0;
hibitflag=0;
errorflag=0;
rightflag=0;
cmpflag=0;
P0_1=1;
alarmflag=0;
bb=0;
aa=0;
}
}
if((errorflag==0)&&(rightflag==1))
{
P0_1=0;
cc++;
if(cc<1000)
{
okflag=1;
}
elseif(cc<2000)
{
okflag=0;
}
else
{
errorflag=0;
rightflag=0;
hibitflag=0;
cmpflag=0;
P0_1=1;
cc=0;
oka=0;
okb=0;
okflag=0;
P0_0=1;
}
if(okflag==1)
{
oka++;
if(oka==2)
{
oka=0;
P0_0=~P0_0;
}
}
else
{
okb++;
if(okb==3)
{
okb=0;
P0_0=~P0_0;
}
}
}
}