文章目录:
- 1、求助:电子密码锁设计与制作
- 2、跪求用EDA Verilog HDL语言编写的8位电子密码锁源程序 (quartus II平台) PS:最好有注释
- 3、求单片机电子密码锁源程序、仿真电路图
- 4、求电子密码锁程序(单片机stc89c52)
- 5、电子密码锁的C语言程序?
求助:电子密码锁设计与制作
一种能防止多次试探密码的基于单片机的密码锁设计方案,根据用户的10条总体要求,给出了该单片机密码锁的硬件电路和软件程序,同时给出了单片机型号的选择、硬件设计、软件流程图、单片机存储单元的分配、汇编语言源程序及详细注释等内容。很多行业的许多地方都需要密码锁,但普通密码锁的密码容易被多次试探而破译。本文给出了一种能防止多次试探密码的密码锁设计方法,从而有效地克服了上述缺点。
硬件电路
图1所示是笔者设计的一种密码锁电路。该密码锁主要 是以下10条特点:
(1)总共可以设置8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声音提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码连续错3次要报警1分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)电磁锁的电磁线圈每次通电5秒,然后恢复初态。
(8)密码键盘上只允许有8个密码按键。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(9)密码设定完毕后要有2秒的提示音。
(10)成本低,硬件和软件都很简洁可靠,易于批量生产。
根据总体要求分析,该密码锁电路所需要的I/O口线少于15个,若设计得当,程序不会超过200条指令,所以可选择质优价廉的AT89C1051/2051或者GMS1051/2051,而且不需要外接程序存储器和数据存储器及其它扩展部件,所以成本很经济。
图1 电磁锁原理图
在图1所示电路中,P1口连接8个密码按键AN1~AN8,开锁 信号由P3.2输出,报警和提示音由P3.7输出。BL是用于报警与声音提示的喇叭,K是继电器控制电磁线圈。
软件设计
图2给出了该单片机密码锁电路的软件流程图。图中�AA1~AA8以及START、SET、SAVE是程序中的标号,是为了理解程序而专门标在流程图的对应位置的,分析程序时可以仔细对照参考。
3.1 存储单元的分配
该密码锁中RAM存储单元的分配方案如下:
31H~38H:依次存放8位设定的密码,首位密码存放在31H单元;
R0:指向密码地址;
R2:已经键入密码的位数;
R3:存放允许的错码次数3与实际错码次数的差值;
R4至R7:延时用;
00H:错码标志位。
对于ROM存储单元的分配,由于程序比较短,而且占用的存储空间比较少,因此,在无特殊要求时,可以从0030H单元(其它地址也可以)开始存放主程序。(程序框图很清晰,简单明了,不过到输入错误次数大于3次后转向?)
图2 电磁锁程序流程图
源程序
下面是该电子密码锁的软件源程序代码:
ORG 0000H
AJMP START
ORG 0030H
START:ACALL BP
MOV R0,#31H
MOV R2,#8
SET: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH,L8
AJMP SET
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
AJMP SET
SAVE: ACALL BP
MOV @R0�A
INC R0
DJNZ R2,SET
MOV R5,#16
D2S: ACALL BP
DJNZ R5,D2S
MOV R0,#31H
MOV R3,#3
AA1: MOV R2,#8
AA2: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH, L9
AJMP AA2
L9� ACALL DELAY
CJNE A,#0FFH,AA3
AJMP AA2
AA3: ACALL BP
CLR C
SUBB A, @R0
INC R0
CJNE A,#00H,AA4
AJMP AA5
AA4: SETB 00H
AA5: DJNZ R2,AA2
JB 00H�AA6
CLR P3.5
L3� MOV R5,#8
ACALL BP
DJNZ R4,L3
MOV R3,#3
SETB P3.5
AJMP AA1
AA6: DJNZ R3,AA7
MOV R5,#24
L5: MOV R4,#200
L4: ACALL BP
DJNZ R4,L4
DJNZ R5,L5
MOV R3,#3
AA7: MOV R5,#40
ACALL BP
DJNZ R5,AA7
AA8: CLR 00H
AJMP AA1
BP: CLR P3.7
MOV R7,#250
L2: MOV R6,#124
L1: DJNZ R6,L1
CPL P3.7
DJNZ R7,L2
SETB P3.7
RET
DELAY�MOV R7,#20
L7: MOV R6,#125
L6: DJNZ R6,L6
DJNZ R7,L7
RET
END
应用说明
若按键AN1~AN7分别代表数码1~7,按键AN0代表数码8。在没有键按下时,P1.0~P1.7全是高电平1,若某个键被按下,相应的口线就变为低电平0。假如设定的密码是61234578,当按键AN6被按下时,P1.6变为低电平,P1端口其余口线为高电平,此时从P1端口读入的数值为10111111,存到31H单元的密码值就是10111111,也就是BFH。依此类推,存到32H至38H单元的密码值分别是FDH、FBH、F7H、EFH、DFH、7FH、FEH。开锁时必须先按AN6,使从P1口读入的第一个密码值与31H单元存储的设定值相同,再顺序按AN1、AN2、AN3、AN4、AN5、AN7、AN0才能开锁。否则不能开锁,同时开始报警。
跪求用EDA Verilog HDL语言编写的8位电子密码锁源程序 (quartus II平台) PS:最好有注释
引言
电子密码锁系统主要由电子锁体、电子密匙等部分组成,一把电子密匙里能存放多组开锁密码,用户在使用过程中能够随时修改开锁密码,更新或配制钥匙里开锁密码。一把电子锁可配制多把钥匙。语音方面的广泛应用,使得具有语音播放的电子密码锁使用起来更加方便。语音密码锁的体积小、保密性能好、使用方便,是用在保险箱、电话或是房门上不可少的部分。
本文介绍的基于FPGA的语音密码锁电路具有显示接口,显示时可以是明文也可以是密文星号。由于FPGA具有ISP功能,当用户需要更改时,如增加口令位数和更改口令权限管理时,只需更改FPGA中的控制和接口电路,利用EDA工具将更新后的设计下载到FPGA中即可,无需更改外部电路,这就大大提高了设计效率。而且采用FPGA设计的电子密码锁与单片机控制的电子密码锁相比结构简单、具有更高的系统保密性和可靠性。这种基于FPGA的电子密码锁可以应用在办公室、仓库、宾馆等人员经常变动的场所。
语音密码锁系统的设计
本设计中的语音密码锁具有如下功能:
①电子密码锁部分功能如下:
密码输入:按下一个数字键,就输入一个数值,并在显示器的最右方显示出该数值,并将先前已经输入的数据依次左移一个数字位置,当超出四位时锁定数字键,不响应其输入值。
密码清除:按下此键可清除前面所有的输入值,清除成为“- – - -”。
数字位退格:按下此键可清除最低的数字位,并使各位向右移。
密码设定:按下此键时会将目前的数字设定成新的密码。
激活电锁:按下此键可将密码锁上锁。
解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁,如果密码错误次数超过三次,系统将进入锁定状态。
万能密码:为了怕使用者忘记密码,系统维护者可考虑设计一个万用密码(8421),不论原先输入的密码是什么,只要输入万用密码即可开锁。
②语音部分功能如下:
录音:能根据所需的内容实现语音录制,为播放准备。
放音:根据系统所处的不同时段以及不同的按键值播放不同的语音提示,以方便使用者操作。
报警:在密码输入错误时,发出报警音。
硬件设计
根据整个系统的技术要求,选择硬件电路的设计方案,整个系统原理如图1所示。
根据整个电路的结构可分为几个功能模块:显示模块、电子锁状态指示灯(LED绿:密码正确开锁,LED红:进入死锁状态,LED黄:密码错误)、键盘模块、语音模块等。下面分别对各个功能模块进行详细的介绍。
显示模块
本设计主要是设计一个四位的语音密码锁,因此选择了四位共阴数码管,对输入数字与系统状态进行显示,其接口如图2所示。
键盘模块如图3所示。以上采用的是4×4矩阵式键盘,可划分为:数字键与功能键。其中,功能键分为:输入、退格、清除、确定、密码设定、上锁。
语音模块如图4所示。
根据所需的内容由柱式话筒MIC实现语音录制,同时也可以由ISD2560芯片的11引脚AUX IN 通过计算机的声卡输出端进行语音录制(效果差不多)。在整个系统中由主芯片对ISD2560芯片进行控制,以实现不同时段以及不同按键值播放不同的语音提示。
软件设计
本设计中,采用自顶向下的层次化结构设计方法,把整个系统划分为几个子模块,最后完成顶层电路的设计。子模块可分为:时钟模块、显示子模块、键盘子模块、语音子模块。当各个功能子模块设计完毕,顶层模块的设计就变得简单了,就是将各个子模块连接起来,其电路模型如图5所示。
结语
本设计中采用了ALTERA公司的 EP1C3T144芯片进行设计,实际测试表明系统的各项设计要求均得到满足并且系统工作良好,该设计采用了SOPC技术和FPGA,几乎将整个系统下载于同一芯片中,实现了所谓的片上系统,可以极大减少其它分立元件或其它芯片的使用,有效地缩小了线路板面积,增加了系统的可靠性,大大缩短了系统开发的周期。克服了传统电子密码锁可靠性差、价格高的缺点,提高了系统的性价比。由于采用VHDL语言进行层次化设计,用软件实现硬件电路,具有良好的可移植性,可随时在线更改逻辑设计及有关参数,充分体现现场可编程器件的优越性。
详细看参考资料
求单片机电子密码锁源程序、仿真电路图
电子密码锁源程序、仿真电路图你可到“谷歌”上搜索一下“基于51单片机的电子密码锁系统设计制作”,这款基于51单片机的电子密码锁系统,单片机用STC89C52RC单片机,电路简单,制作过程中不需要进行调试,支持密码掉电保存功能!密码储存于单片机内部自带的的EEPROM中,不需要外置AT24C01保存密码,是学习电子密码锁比较好的教学试验系统,主要功能如下:
1、1602液晶菜单显示。
2、6位密码,密码可重置,重置密码时,先输入原始密密,正确后输入新密码,再交输入新密码,两次输入的密码一致辞时,密码修改成功。开锁时,密码通过键盘输入,若密码正确,则将锁打开,诺密码不正确时,无法开锁,密码输入错误三次时,蜂鸣器报警并且锁定键盘,10分钟。
3、支持掉电保存密码功能。单片机中的密码是储存于单片内部的EEPROM中,在密码锁系统断电时,储存在密码锁系统中的密码不会丢失。
基于51单片机的电子密码锁系统设计制作,有套件、及组装好的板件,含原理图、源程序、设计说明等。
求电子密码锁程序(单片机stc89c52)
到电驴上搜索:宋老师 单片机,他的视频教程下载链接里边,有一个电子密码锁的C语言程序,可以下载下来参考一下。
电子密码锁的C语言程序?
亲 这程序是我自己当时写的,51单片机1602液晶,可以更改密码。
#includereg52.h
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^6;
sbit lcdrs=P2^4;
sbit lcdrw=P2^5;
bit flag;
bit flag1;
bit flag2;
bit flag3;
bit flag4;
uchar a[6];
uchar b[6];
uchar c[6];
uchar num,key,zhi,num1,num2,i,temp,ss,num3,num4,num5,num6;
uchar code table[]=" input password: ";
uchar code table1[]="right!";
uchar code table2[]="error!";
uchar code table3[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code table4[]="wrong!";
uchar code table5[]="change password:";
uchar code table6[]="password again: ";
uchar code table7[]="new passwordsure";
uchar password[]={'0','0','0','0','0','0'};
void delay(uint z)
{
uint x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num16;num++)
{
write_data(table[num]);
delay(5);
}
//write_com(0x80+0x40);
}
uchar keyscan(void)
{
uchar temp,zhi;
P3=0x7f;
temp=P30x7f;
if(temp!=0x7f)
{
delay(1);
P3=0x7f;
temp=P30x7f;
if(temp!=0x7f)
{
P3=0x7f;
temp=P30x7f;
switch (temp)
{
case 0x7e:zhi=1;break;
case 0x7d:zhi=2;break;
case 0x7b:zhi=3;break;
case 0x77:zhi=4;break;
}
while(temp!=0x7f)
{
P3=0x7f;
temp=P30x7f;
}
return zhi;
}
}
//**********
P3=0xbf;
temp=P30xbf;
if(temp!=0xbf)
{
delay(1);
P3=0xbf;
temp=P30xbf;
if(temp!=0xbf)
{
P3=0xbf;
temp=P30xbf;
switch (temp)
{
case 0xbe:zhi=5;break;
case 0xbd:zhi=6;break;
case 0xbb:zhi=7;break;
case 0xb7:zhi=8;break;
}
while(temp!=0xbf)
{
P3=0xbf;
temp=P30xbf;
}
return zhi;
}
}
//***********
P3=0xdf;
temp=P30xdf;
if(temp!=0xdf)
{
delay(1);
P3=0xdf;
temp=P30xdf;
if(temp!=0xdf)
{
P3=0xdf;
temp=P30xdf;
switch (temp)
{
case 0xde:zhi=9;break;
case 0xdd:zhi=10;break;
case 0xdb:zhi=11;break;
case 0xd7:zhi=12;break;
}
while(temp!=0xdf)
{
P3=0xdf;
temp=P30xdf;
}
return zhi;
}
}
//********
P3=0xef;
temp=P30xef;
if(temp!=0xef)
{
delay(1);
P3=0xef;
temp=P30xef;
if(temp!=0xef)
{
P3=0xef;
temp=P30xef;
switch (temp)
{
case 0xee:zhi=13;break;
case 0xed:zhi=14;break;
case 0xeb:zhi=15;break;
case 0xe7:zhi=16;break;
}
while(temp!=0xef)
{
P3=0xef;
temp=P30xef;
}
return zhi;
}
else
{
zhi=0;
return zhi;
}
}
}
void changepassword()
{
uchar j=0,k=0,m=0;
flag2=0;
flag3=0;
flag4=0;
write_com(0x01);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x80);
for(num4=0;num416;num4++)
{
write_data(table5[num4]);
}
while(!flag2)
{
key=keyscan();
if(key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)
{
b[j]=table3[key-1];
write_data(table3[key-1]);
delay(10);
write_com(0x80+0x40+3+j);
delay(10);
write_data('*');
j++;
if(j==6)
{
j=0;
flag2=1;
flag3=1;
write_com(0x01);
delay(10);
write_com(0x80);
for(num5=0;num516;num5++)
{
write_data(table6[num5]);
}
}
}
}
while(flag3)
{
key=keyscan();
if(key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)
{
c[k]=table3[key-1];
write_data(table3[key-1]);
delay(10);
write_com(0x80+0x40+3+k);
delay(10);
write_data('*');
k++;
if(k==6)
{
flag3=0;
write_com(0x01);
if((b[0]==c[0])(b[1]==c[1])(b[2]==c[2])(b[3]==c[3])(b[4]==c[4])(b[5]==c[5]))
{
flag4=1;
password[0]=b[0];
password[1]=b[1];
password[2]=b[2];
password[3]=b[3];
password[4]=b[4];
password[5]=b[5];
write_com(0x80);
//delay(10);
}
}
}
while(flag4)
{
flag4=0;
write_com(0x80);
for(num6=0;num616;num6++)
{
write_data(table7[num6]);
}
delay(2000);
write_com(0x80);
for(num=0;num16;num++)
{
write_data(table[num]);
delay(5);
}
}
}
}
void main()
{
init();
while(1)
{
key=100;
key=keyscan();
if((!flag)(!flag1))
{
if((key==1||key==2||key==3||key==4||key==5||key==6||key==7||key==8||key==9||key==10)(i6))
{
write_com(0x0f);
write_com(0x06);
a[i]=table3[key-1];
write_data(table3[key-1]);
delay(10);
write_com(0x80+0x40+4+i);
delay(50);
write_data('*');
i++;
}
}
if((!flag)(!flag1))
{
if(key==11)
{
i=0;
if((a[0]==password[0])(a[1]==password[1])(a[2]==password[2])(a[3]==password[3])(a[4]==password[4])(a[5]==password[5]))
{
flag1=1;
write_com(0x01);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x80+4);
for(num1=0;num16;num1++)
{
write_data(table1[num1]);
}
}
else
{
write_com(0x01);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x80+4);
for(num2=0;num26;num2++)
{
write_data(table2[num2]);
}
ss++;
if(ss==3)
{
flag=1;
write_com(0x01);
write_com(0x0c);
write_com(0x80+0x40+4);
for(num3=0;num36;num3++)
{
write_data(table4[num3]);
}
}
}
}
}
if(key==12)
{
changepassword();
}
}
}
p!=0xef){delay(1);P3=0xef;temp=P30xef;if(temp!=0xef){P3=0xef;temp=P30xef;switch (temp){case 0xee:zhi=13;break;case 0xed:zhi=14;break;case 0x