11 电子密码锁概述
随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。而锁自古以来就是把守门的铁将军,人们对它要求甚高,即要求可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。传统的门锁既要备有大量的钥匙,又要担心钥匙丢失后的麻烦。另外,如:宾馆、办公大楼、仓库、保险柜等,由于装修施工等人住时也要把原有的锁胆更换,况且钥匙随身携带也诸多便。随着单片机的问世,出现了带微处理器的密码锁,它除具有电子密码锁的功能外,还引入了智能化、科技化等功能。从而使密码锁具有很高的安全性、可靠性。目前西方发达国家已经大量应用智能门禁系统,可以通过多种的更加安全更加方便可靠的方法来实现大门的管理。但电子密码锁在我国的应用还不广泛,成本还很高,希望通过不断地努力使电子密码锁能够在我国及居民日常生活中得到广泛应用,这也是一个国家生活水平的体现。
很多行业的许多地方都要用到密码锁,随着人们生活水平的提高,如何实现家庭或公司的防盗这一问题也变的尤其突出,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,再者,普通密码锁的密码容易被多次试探而破译,所以,考虑到单片机的优越性,一种基于单片机的电子密码锁应运而生。电子密码锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲睐。
设计本课题时构思的方案:采用以AT89C2051为核心的单片机控制方案;能防止多次试探而不被破译,从而有效地克服了现实生活中存在的许多缺点。
12 本设计主要任务
(1)共8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声、光提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码错3次要报警10分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)密码键盘上只允许有8个密码按键和1个发光管。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(8)密码设定完毕后要有2秒的提示音。
以上是初步设定的电子密码锁的主要功能。
13 系统主要功能
本系统主要由单片机系统、键盘、报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用。
第1节 电子密码锁硬件设计
21 系统的硬件构成及功能
根据总体要求分析,该密码锁电路所需要的I/O口线少于15个,所以可选择质优价廉的AT89C2051,而且不需要外接程序存储器和数据存储器及其它扩展部件。
电子密码锁由电路和机械两部分组成,此次设计的电子密码锁可以完成密码的修改、设定及非法入侵报警、驱动外围电路等功能。从硬件上看,它由六部分组成,分别是:LED显示器,显示亮度均匀,显示管各段不随显示数据的变化而变化,且价格低廉,它用于显示键盘输入的相应信息;无须再加外部EPROM存储器,且外围扩展器件较少的AT89C52单片机是整个电路的核心部分;振荡电路为CPU产生赖以工作的时序;显示灯是通过CPU输出的一个高电平,通过三极管放大,驱动继电器吸合,使外加电压与发光二极管导通,从而使发光二极管发光,电机工作。现在来进行修改密码 *** 作。修改密码实质就是输入的新密码去取代原来的旧密码。密码的存储用来存储一位地址加1,密码位数减1,当八个地址均存入一位密码,即密码位数减为零时,密码输入完毕,此时按下确认键,新密码产生,跳出子程序。为防止非管理员任意的进行密码修改,必须输入正确密码后,按修改密码键,才能重新设置密码。密码输入值的比较主要有两部分,密码位数与内容任何一个条件不满足,都将会产生出错信息。当连续三次输入密码出错时,就会出现报警信息,LED显示出错信息,蜂鸣器鸣叫,提醒人注意。
在电路中,P1口连接8个密码按键AN1~AN8,开锁脉冲由P35输出,报警和提示音由P37输出。BL是用于报警与声音提示的喇叭,发光管D1用于报警和提示,L是电磁锁的电磁线圈。
图1 电子密码锁硬件电路图
221AT89C2051单片机及其引脚说明
AT89C2051单片机是51系列单片机的一个成员,是8051单片机的简化版与Intel MCS-51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,节省了成本,提高了系统的性价比。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,
AT89C2051是一个有20个引脚的芯片,引脚配置如图2所示。与8051相比,AT89C2051减少了两个对外端口(即P0、P2口),使它最大可能地减少了对外引脚下,因而芯片尺寸有所减小。
图2 AT89C2051引脚配置
AT89C2051芯片的20个引脚功能为:
VCC 电源电压。
GND 接地。
RST 复位输入。当RST变为高电平并保持2个机器周期时,所有I/O引脚复
至“1”。
XTAL1 反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2 来自反向振荡放大器的输出。
P1口 8位双向I/O口。引脚P12~P17提供内部上拉,当作为输入并被外部下拉为低电平时,它们将输出电流,这是因内部上拉的缘故。P10和P11需要外部上拉,可用作片内精确模拟比较器的正向输入(AIN0)和反向输入(AIN1),P1口输出缓冲器能接收20mA电流,并能直接驱动LED显示器;P1口引脚写入“1” 后,可用作输入。在闪速编程与编程校验期间,P1口也可接收编码数据。
P3口 引脚P30~P35与P37为7个带内部上拉的双向I/0引脚。P36在内部已与片内比较器输出相连,不能作为通用I/O引脚访问。P3口的输出缓冲器能接收20mA的灌电流;P3口写入“1”后,内部上拉,可用输入。P3口也可用作特殊功能口,功P3口同时也可为闪速存储器编程和编程校验接收控制信号。
P3口特殊功能
P3口引脚 特殊功能
P30 RXD(串行输入口)
P31 TXD(串行输出口)
P32 INT0(外部中断0)
P33 INT1(外部中断1)
P34 T0(定时器0外部输入)
P35 T1(定时器1外部输入)
第3节 系统的软件设计
图3给出了该单片机密码锁电路的软件流程图。图中AA1~AA8以及START、SET、SAVE是程序中的标号,是为了理解程序而专门标在流程图的对应位置的,分析程序时可以仔细对照参考。
3.1 系统主程序设计流程图(见附页)
3.2 软件设计思想
软件任务分析环节是为软件设计做一个总体规划。从软件的功能来看可分为两大类:一类是执行软件,它能完成各种实质性的功能(如计算、显示、输出控制和通信等);另一类是监控软件,它是专门用来协调各执行模块和 *** 作者的关系,在系统软件中充当组织调度角色的软件。这两类软件的设计方法各有特色;执行软件的设计偏重算法效率,与硬件关系密切,千变万化;监控软件着眼全局,主要处理人机关系,特点是逻辑严密、千头万绪。
本设计要完成的软件任务主要有:一是键盘输入的识别;二是8位LED的显示;三是密码的比较、修改、存储;;四是报警和开锁控制电平的输出。
根据以上任务,结合硬件结构,可以将键盘输入的识别用来作为系统的监控程序(主程序),用显示程序来延时,不断查询键盘。如果有键按下,就得到相应的键值。结合当前系统所处的状态,调用不同的 *** 作模块,实现相应的功能。而执行模块主要有数字输入模块、确定键模块、修改键模块、显示模块及报警模块。
3.3 存储单元的分配
该密码锁中RAM存储单元的分配方案如下:
31H~38H:依次存放8位设定的密码,首位密码存放在31H单元;
R0:指向密码地址;
R2:已经键入密码的位数;
R3:存放允许的错码次数3与实际错码次数的差值;
R4至R7:延时用;
00H:错码标志位。
对于ROM存储单元的分配,由于程序比较短,而且占用的存储空间比较少,因此,在无特殊要求时,可以从0030H单元(其它地址也可以)开始存放主程序。
3.4 系统源程序
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 P35
L3:MOV R5,#8
ACALL BP
DJNZ R4,L3
MOV R3,#3
SETB P35
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 P37 MOV R7,#250
L2:MOV R6,#124
L1:DJNZ R6,L1
CPL P37
DJNZ R7,L2
SETB
RET
DELAY MOV R7,#20
L7:MOV R6,#125
L6:DJNZ R6,L6
DJNZ R7,L7
RET
END
3.5 应用说明
若按键AN1~AN7分别代表数码1~7,按键AN0代表数码8。在没有键按下时,P10~P17全是高电平1,若某个键被按下,相应的口线就变为低电平0。假如设定的密码是61234578,当按键AN6被按下时,P16变为低电平,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才能开锁。否则不能开锁,同时开始报警。
3.6 小结
该电子密码锁能充分利用了51系统单片机软、硬件资源,引入了智能化分析功能,提高了系统的可靠性和安全性,另外,电子密码锁若与串行通信结合在一起将会成为宾馆、工厂、学校等需要进行统一管理的建筑群不可缺的商品。
机电一体化的电子密码锁,其功能大大超过d子锁,且性能更稳定、更安全。其特点,首先保密性好,其次编码可变;其三误码输入保护;其四停电不掉码;其五多种密码开锁方式,使用方便,没有单人开锁、二三人多种开锁方式。由于自身的优势,电子密码锁会受到越来越多人们的欢迎,使用会越来越广泛,同时,也将会被社会所接受认可,并与d子锁平分秋色。
这样可以么?
44矩阵键盘检测程序(新手用),本程序用于检测44矩阵按键,先检测是否有按
键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给
8位数码管,P2^0位选,P2^1段选,P1接44矩阵按键
#include <reg52h>
#include<intrinsh> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit du=P2^1; //段选位
sbit we=P2^0; //位选位
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(xms) //延时函数
{
uchar i,j;
for(xms=i,i>0;i--;)
for(j=11;j>0;j--);
}
void main() //主函数
{
we=1; //位选开
P0=0; //8位数码管全部显示
we=0; //位选关
du=1; //段选开
P1=0x00; //初始化,8位数码管无显示
while(1)
{
uchar a,b;
P1=0xf0;
a=P1;
if(a!=0xf0)
{
delay(5); //去抖动
b=P1;
if(a==b)
{
a=0xfe;
do
{
P1=a;
if(a!=P1)
{
switch(P1)
{
case 0x7e:{P0=duanma[0];break;} //编码检测,第一个键按下显示0,第16个按键按下显示F
case 0xbe:{P0=duanma[1];break;}
case 0xde:{P0=duanma[2];break;}
case 0xee:{P0=duanma[3];break;}
case 0x7d:{P0=duanma[4];break;}
case 0xbd:{P0=duanma[5];break;}
case 0xdd:{P0=duanma[6];break;}
case 0xed:{P0=duanma[7];break;}
case 0x7b:{P0=duanma[8];break;}
case 0xbb:{P0=duanma[9];break;}
case 0xdb:{P0=duanma[10];break;}
case 0xeb:{P0=duanma[11];break;}
case 0x77:{P0=duanma[12];break;}
case 0xb7:{P0=duanma[13];break;}
case 0xd7:{P0=duanma[14];break;}
case 0xe7:{P0=duanma[15];break;}
}
}
a=_crol_(a,1); //循环移位去检测按键
}while(a!=0xef);
}
}
}
}
这里有 >
#include <reg52h>
#define uint unsigned int
#define uchar unsigned char
#define KEY P3 //键盘输入端口
#define No_key 20 //无按键时的返回值
#define lcddata P2 //1602的数据输入端口
sbit lcden= P1^2;
sbit lcdrs= P1^0;
sbit lcdrw= P1^1;
sbit light= P1^3;
sbit light1= P1^4;
uchar j ; //用来统计输入 个数的全局变量
uchar aa; //用来在定时器中计数的 全局变量
uchar code table[]= " Hello!";
uchar code table1[]=" OK! " ;
uchar code table2[]="Enter please:" ;
uchar code key_table[16] =
{
1,2,3,10,
4,5,6,11,
7,8,9,12,
0,13,14,15
};
uchar password[]={2,0,1,0,9,3} ; //设定初始密码
uchar save[6]; //保存输入的数据
uchar conflag ; //确认标志
uchar lockflag; //锁键盘标志
uchar startflag; //开始标志
void delay(uint z); //延时子函数
void wright_com(uchar com); //写指令函数
void wright_data(uchar date) ; //写数据函数
void init(); //初始化
void display_OK(); // 显示OK
void delete(); //删除输入的最后一个数
uchar keyscan() ; //带返回值的键盘扫描程序
void enter_code(uchar t); //输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,
void confirm(); //确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,
void succeed_an(); //输入密码成功时的 响应,
void fail_an(); //输入密码 失败时 响应
void lockkey(); //锁键盘三秒
void alarm(); //发出警报声
void reset(); //复位函数
void display_enter(); //显示输入
void main(void)
{
uchar temp;
init();
while(1)
{
if(lockflag)
{
temp=keyscan(); // 锁键期间也要进行键盘扫描
if(temp!=No_key) //重新记时三秒
{
aa=0; //重新在定时器中计数
}
}
else
{
temp=keyscan(); //反复扫描输入,等待随时输入
if(temp!=No_key) //有按键按下才进行下面的 *** 作
{
if(temp==10)
{
reset();
startflag=1; //开始标志置位
}
if(startflag)
{
enter_code(temp); //每扫描一次键盘就要进行一次处理,保存输入的数值
if(temp==13) //按下确认键盘就要进行密码确认
{
confirm(); //进行确认判断
if(conflag) //密码确认为正确
{
succeed_an(); //密码正确,作出相应的反应
}
else
{
fail_an(); //密码错误,作相应反应
}
}
if(temp==14)
{
delete(); //作删除 *** 作
}
}
}
}
}
}
/ 显示enter/
void display_enter()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table2[num]);
}
}
/ 显示OK/
void display_OK()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table1[num]);
}
}
/ 删除最后一个/
void delete()
{
wright_com(0x80+0x40+j); //确定删除对象
wright_data(' '); //显示空格即为删除
save[--j]=0; //删除后数据清零
wright_com(0x80+0x40+j); //为下次输入数据时写好位置,必须是在最后一个后面
}
/ 对各种变量进行复位/
void reset()
{
uchar num;
display_enter();
wright_com(0x80+0x40); //擦除屏幕上的显示
for(num=0;num<6;num++)
{
save[num]=0; //对输入的数值进行清零
wright_data(' '); //显示的是空格
}
wright_com(0x80+0x40); //下次再输入时可以又从起始位置输入
lockflag=0; //各种变量要清零回起始状态
conflag=0;
j=0;
}
/ 输入密码正确进行响应/
void succeed_an()
{
light=0; //灯亮
display_OK(); //显示成功
delay(1000);
light=1; //灯灭
}
/ 输入密码错误进行响应/
void fail_an()
{
alarm();
lockkey();
}
/ 发出警报声/
void alarm() //这个以后再扩展它
{
}
/锁键盘三秒/
void lockkey()
{
lockflag=1;
}
/输入密码并在屏幕上显示星号/
void enter_code(uchar t)
{
if(t>=0&&t<10)
{
if(j==0)
{
wright_com(0x80+0x40) ; //第一输入时要先写入地址指令,否则无法显示
wright_data('') ;
}
else
{
wright_data('') ;//不是第一个输入则不用再写地址
}
save[j++]=t; //保存输入的数据
}
}
/校对密码以确定是不是正确的/
void confirm()
{
uchar k;
for(k=0;k<6;k++)
{
if(password[k]!=save[k]) //对数组中的内容进行逐一比较,一旦有数据不对马上退出循环
{
break;
}
}
if(k==6) //要是条件退出的话说明六个数全对密码
{
conflag=1; // 进行标志密码正确
}
}
/中断服务程序/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重装初值
if(lockflag)
{
aa++;
light1=0;
if(aa>=60) //三秒到了
{
aa=0; //清零可以方便下次再使用
light1=1; //关闭警报
lockflag=0; //标志清零解除键锁,方便下次使用
}
}
}
/初始化/
void init()
{
uchar num;
/定时器初始化/
TMOD=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1; //开启总中断
TR0=1;//把定时器关闭
/1602初始化/
lcdrw=0; //这个必须要置 零,否则无法正常显示
lcden=0;
wright_com(0x38) ; //初始化
wright_com(0x0c) ; //打开光标 0x0c不显示光标 0x0e光标不闪,0x0f光标闪
wright_com(0x01) ; //清显示
wright_com(0x80) ;
for(num=0;num<9;num++)
{
wright_data(table[num]);
delay(1);
}
}
/1602写入指令/
void wright_com(uchar com)
{
lcdrs=0;
lcddata=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/1602写入数据/
void wright_data(uchar date)
{
lcdrs=1;
lcddata=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/延时函数/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
/4x4矩阵键盘扫描函数/
uchar keyscan()
{
uchar temp,num=No_key; //num的初值要为无键盘按下时的返回值
/扫描第一行/
KEY=0xfe;
temp=KEY;
temp=temp&0xf0; //读出高四位
while(temp!=0xf0)
{
delay(5); //延时消抖
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0) //确认确实有按键按下
{
temp=KEY;
switch(temp) //根据这八个电平可以确定是哪个按键按下
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=10;
break;
}
while(temp!=0xf0) //等待松手
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/扫描第二行/
KEY=0xfd;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xed:num=4;
break;
case 0xdd:num=5;
break;
case 0xbd:num=6;
break;
case 0x7d:num=11;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/扫描第三行/
KEY=0xfb;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xeb:num=7;
break;
case 0xdb:num=8 ;
break;
case 0xbb:num=9;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/扫描第四行/
KEY=0xf7;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xe7:num=0;
break;
case 0xd7:num=13;
break;
case 0xb7:num=14;
break;
case 0x77:num=15;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
return num;
}
[1]单片机多功能密码锁系统/防火防盗系统设计
实现功能:
1、 密码锁功能/可以修改密码, 下次开机后新密码仍然有效
2、 支持一键恢复初始密码
3、 可添加防火防盗报警功能
4、 可进行功能定制
☆已作出的实物优酷视频演示地址:
>
软件狗[Dongles]
1、认识软件狗。[首先我对软件狗作一简单介绍,在后面我们将对各种软件狗的加密和解密做详细的讲解。]
软件狗是插在微机并行口上的一个软件保护装置,它包括主机检查程序和密钥(也称加密盒)两部分。主机检查程序就是前面说的加密代码的一部分,加密盒是用来存放密码的。一般来说,软件狗插在并行口上,不会影响打印机的正常工作。常见的软件狗加密盒外形,如两个一公一母的D行25针连接器倒接在一起,公头(DB25/M)插在并行口上,母头(DB25/F)可接打印机,相当于原来的并行口。整个软件狗的硬件电路板就在这约5厘米见方的加密盒子里。
电路板上的公头(DB25/F)之间的管脚是一一对应、直接相联结的,以保证并行口的作用不变。存储密码或起信号加密变换作用的器件及其它辅助元件就跨接在这25根线上面,应用程序以特定的方式跟他们沟通、核对。除了某些设计不良的情况之外,一般不会影响打印机的正常工作,打印机工作时也不会影响它们。
为了防止程序被非法复制,所做的加密保护措施一般都包括两部分。首先是要有保存密码数据的载体,即密钥;其次是夹杂在应用程序中的主机检查程序,即加密代码。密钥应该能保证不易被解密、复制;如一般用磁盘做加密时,加密部分无法用一般的工具复制。另外,当检查程序用特殊方法去读密码时,密码应该能很容易地被读出,而不致影响应用程序的正常执行。当发现密码不对或密钥不存在时,就让主机挂起、重新起动或采用被的措施。
软件狗经历的“时代”
软件狗的发展经历了好几代,至2001年初就已发展到了第四代。
第一代是存储器型的加密锁。这是最有历史的加密锁,内部只有存储体,厂商只能对锁进行读、写。软件狗起信号加密变换作用的器件,最多只简单采用一些电阻、二极管等,检查方法也比较简单,很容易被人解密常见的有原金天地的“软件狗”、深思洛克的Keypro型、Rainbow的Cplus等。这种锁的主要特点是厂商可以预先把自己的保密数据设置到锁内,然后在软件运行时随机读取,这样防止了解密者通过简单重复并口数据来解密,但解密者进一步分析一下数据规律就可以解决了,这就是常说的“端口”层的数据分析。这种加密锁原理非常简单,是种正在被逐步淘汰的产品,但是其原料成本极低,即使在很低的价位也有很好的利润,加密厂商一般都不愿放弃这种锁;而很多厂商由于成本原因又不得不采用,因此这种锁仍有一定的市场份额;
第二代是算法不公开的加密锁。硬件内部增加了单片机,即所谓内置CPU,厂商主要是利用算法功能进行加密。加密锁通常还增加了一些辅助功能,比如倒计数器、远程升级等。软件狗采用了低功耗TTL,COMS等逻辑元件,在电路上做了一些加密工作,检查时也要比第一代软件狗多一道手续,解密的难度自然也增加了。常见的有深思洛克的“深思Ⅰ”型,彩虹天地的SuperPro、微狗,ALADDIN的MemoHASP等。利用单片机,软件与锁之间的数据通讯建立了一个保密协议,数据都是经过加密的,解密者就难以分析出数据内容和规律了,因此对于这种锁的数据分析就不是停留在“端口”层了,解密者转向了“功能”层,就是对软件中的函数调用进行分析。为了抵挡功能层的数据分析,这种锁来了个“软硬”兼施的策略。
“软”的是指驱动程序内反跟踪、外壳加密等等软件工作,让解密者难以在功能层上仿真,谁都靠的是对 *** 作系统、微机系统的精确理解。谁都无法决胜,结果是加密驱动程序在不断更新、膨胀。
“硬”的就是加密锁内的算法功能,这大大增加了解密难度,这是掌握在加密者手中的武器。但是,加密者只能设置算法的参数,即所谓内含多少种算法可选,而算法内容并不知道。这样就限制了厂商对算法的使用,要么预先记录算法结果然后在软件运行时核对(使用码表);要么在软件中至少变换两次然后比较结果是否一致。如果解密者截获这些数据,通过统计、分析就有可达到解密目的;
第三代加密锁,即所谓“可编程”的加密锁。1999年初,以北京深思洛克为代表推出了第三代加密锁,“可编程”加密锁概念的推出是软件加密技术的一次进步。“可编程”加密锁设计初衷是希望用户能够将软件中重要的代码或模块“移植”到加密保护设备中运行,使软件与加密锁实现真正无缝链接。但由于成本限制,早期推出的几款“可编程”加密锁采用的低档单片机给 “可编程”性造成了很大的局限,主要表现在:1、算法变换的复杂度不够高,2、指令编码空间较小,3、程序区的空间较小。这些局限性使得用户根本不可能利用“可编程”加密锁实现理想的高强度加密方案。 软件狗采用了PAL(Programmable Array Logic)、PEEL(Programmable Electrically Erasable Logic Device)、GAL(Generic Array Logic)等可编程器件,但目前流行的期间大概要算串行读写的EEPROM(Serial Electrically Erasable PROM)了。这些器件由于密码编制的灵活性和制成密钥后在程序中插入检查的方便性,极大地增加了解密的难度。从使用的角度来看PAL、PEEL、GAL 等逻辑器件只能读取数据,不能随时写入数据,密码的重新设置比较麻烦;而EEPROM芯片可随意读写,用在软件狗上灵活性相当大,譬如可以为每一个软件狗单独设一个密码,以增加解密的难度;另外,从EEPROM器件的电器性能上来说也非常适合做软件狗;因此这种器件在软件狗的设计中获得了广泛的应用,是当时软件狗制作者的首选芯片。它象一般RAM存储器一样可读写(只不过读写是串行的),即使断电后也能保存数据不变。常用的EEPROM型号是93C46,它是64×16bit的结构,也就是说一个93C46具有64个16位bit单元的容量,每次处理数据也都是16位。有的93C46,如 Microchip、ATMEL、CSi等品牌的93C46可以通过切换,变为128×8bit或64×16bit两种模式,这对软件狗制作来说就更灵活了,其加密效果也更好。当然也有人采用更大容量的93C56、93C66或容量小一点的93C06、93C26等EEPROM芯片。因为软件狗是插在微机的并行口上,所以检查程序是通过并行口的I/O地址去读写EEPROM。具体的读写方式跟硬件线路以及EEPROM的时序有关,因此,一般的检查程序针对某一种硬件线路;但是这些程序大同小异,大体上是差不多的。
第四代软件够在第三代软件狗基础上,加入一个单片机芯片,如PIC16C5X。此芯片中存有特定的算法程序,可将读出的密钥数据进行加密变换,以对抗逻辑分析仪。可以说,软件狗发展到第四代,已经非常成熟了。在此技术上,各软件狗研制公司又加入自己的电路设计,形成了各自的产品特色。
平时常见的狗主要有“洋狗”(国外狗)和“土狗”(国产狗)。这里“洋狗”主要指美国的彩虹和以色列的HASP,“土狗”主要有金天地(现在与美国彩虹合资,叫彩虹天地)、深思、坚石。总的来说,“洋狗”在软件接口、加壳、防跟踪等“软”方面做得没有“土狗”好,但在硬件上绝对“无法” pj(应当说pj难度非常大):而“土狗”在“软”的方面做得绝对称得上世界第一,许多技术,如噪音、自检测、算法可变、码表变换等等,可以说都很先进,而在硬件上不及国外,只要稍有单片机功力的人,都可复制。
现在狗的技术发展很快,针对不同的应用场合有不同的类型,如:
强劲狗:自由定义算法的高强度加密方案
微狗: 面向单片机环境的高强度加密方案
USB狗: USB接口的微狗全兼容产品
软件狗:面向单机环境的低成本加密方案
网络狗:面向网络环境的加密方案
卡式狗:面向网络环境的加密方案
软件狗采取了各种的加密技术,目前较先进的加密技术有以下几种:
AS技术:API函数调用与SHELL外壳加密结合,即使外壳被破坏,加密程序依然不能正常运行。
反跟踪:
a数据交换随机噪音技术:有效地对抗逻辑分析仪分析及各种调试工具的攻击。
b迷宫技术:在程序入口和出口之间包含大量判断跳转干扰,动态改变执行次序,提升狗的抗跟踪能力。
抗共享:可从硬件对抗并口共享器,由开发商选择是否共享狗。
口令: 可由软件开发商设置32位口令,口令错误将不能对存储区进行读写。
时间闸:某些狗内部设有时间闸,各种 *** 作必须在规定的时间内完成。狗正常 *** 作用时很短,但跟踪时用时较长,超过规定时间狗将返回错误结果。
单片机:硬件内置单片机,固化的单片机软件保证外部不可读,从而保证狗不可仿制。
存储器:提供20字节掉电保持存储器供开发商存放关键数据、配置参数等信息。
市场上常见几种软件狗的简单介绍
彩虹天地:在中国应该算是老大了,从第一代到第四代的产品都有,但它的主要产品还是第三代的微狗(TD-MH),该代产品中有干扰芯片,能随时产生无用的干扰信号,更加有效的对抗逻辑分析仪;虽然有第四代的强劲狗(CS-QA),但好象有不少问题,所以推出的USB接口的加密锁还是兼容微狗的。彩虹天地的加密强度不高,最简单的pj方法就是随便买一个狗,然后复制成要解的狗。
深思洛克:也是一个比较有名的,至2001年初最主要的产品就是第四代的深思Ⅲ型加密狗,特点就是用户可在狗中定义自己的算法,这大大加强了其保护能力,但它的CPU功能还不够强,算法上有漏洞,而且只提供一种加密方式,所以也是可以击破的,并且也能硬件复制原狗。此类狗加密的产品有Pkpm 结构计算软件、分析家股票软件、圆方cad软件等等。
深思 Ⅲ 的n阶黑箱模型法:
深思 Ⅲ 的n阶黑箱模型法并不是简单的记忆,而是通过深思 Ⅲ 独特的完全可编程使得深思 Ⅲ 锁对于输入和输出呈现高阶黑箱控制模型的特征。每次调用代码运行时使用锁内存储作为运算变量和参数,改变锁的状态影响后续的调用。用户自定义的代码没有任何的说明书和特征,甚至两次相同的调用会返回不同的有用的结果。这是深思 Ⅲ 独特之处。
以上加密范例并不要求加密者寻找复杂并难以预料的函数关系加以移植。
如果是采用0阶黑箱模型那么输入与输出具有直接的对应关系 y=f(x1,x2),其中x1,x2为本次输入,y为本次输出。这时如果函数关系简单就很容易被解密者破译,比如用迭代法、插值法和列表法等方法逼近;这就迫使加密者寻求复杂函数来防止解密者的破译和仿真。但由于锁内资源的限制使得软件移植几乎不可能。现在采用n阶黑箱模型,就使得输入与输出的对应关系复杂化: yn=f(yn-1,yn-2,yn-3,,y1,xn1,xn2),其中,y1,y2,,yn-1为以前n-1次调用输出或隐藏的结果, xn1,xn2为本次(第n次)调用的输入参数。
面对这样的复杂关系,解密者简单地取消中间的任何一次调用都可能使后边的结果发生错误,既使是简单的函数关系也可以被这高阶黑箱过程隐藏得难以推测。这样,借助于高阶黑箱模型法很容易找到应用软件中可以利用的公式或函数作为加密的对象。
n阶黑箱模型法使用过程中一样可以使用码表法,例如,范例中的第一次调用。
但是,这样的码表法不同的加密点互相关联,必须进行整体解密,这就大大地提高了加密强度。使用传统的0阶黑箱模型时,不同的加密点之间互不关联只需各个击破分别解密即可,其复杂度无法与n阶黑箱模型相比。对于比较复杂的函数,尽管锁内没有足够的资源,还是可以通过n阶模型法进行加密处理我们可以将复杂函数化为简单函数的运算组合,例如:y=(a-b)(a+b)+c可以先计算(a-b)和(a+b)然后将结果相乘再加c。
n阶模型严格说是不可解的(只是目前理论上,也请深思公司记住这一点),因为第n次输出依赖于前n-1次输入和输出,而前n-1次输出可能已部分或全部被隐藏,所以第n次输出无法推测,至少推测n-1次输入产生的输出要比一次输入产生的输出复杂度有质的飞跃。
深思 Ⅲ 具有完备的指令系统,可以通过编程实现n阶或任意阶黑箱模型,每次调用互相关联,并且可以绝对隐藏中间结果,只要使用得当,理论上是不可解的( 我的理论是没有不可解的:)
飞天诚信:是新崛起的一家,主要产品是ROCKEY-IV和相兼容的USB狗,技术支持比较好,功能比较多,它的外壳加密程序很不错,用在加密上主要是8号功能(种子码)和14、15、16号功能(都是自定义算法),它的自定义算法比深思的产品好,“没有”漏洞(目前理论上说)。如果很好地使用它加密,是极难pj的。但大多数开发商都很偷懒,比如就只用8号功能(种子码)来加密。
制作和出售软件狗的公司很多,你只要注意一下计算机杂志上的广告就能得知。各公司生产的软件狗除了上述特点外,一般都有一些为吸引用户而附加的功能,主要是一些工具软件,其核心技术却是大同小异。
加密狗的一般特点
1、不占用并行口,因为它虽然插在并行口上,但是它又提供了一个跟原来一致的并行口。
2、软件具有防解密功能,可对抗各种调试工具的跟踪。
3、一狗一密码或一种线路,软硬件不可互换,就像一把锁一把钥匙那样。
4、提供各种语言的编程接口以及一套实用工具,方便用户在自己开发的程序中嵌入加密模块。
5、提供对可执行文件的加密工具,以便用户对已有的产品进行加密。
目前主流软件加密锁的不足
对软件加密保护产品而言,使用者最关心的是加密的有效性,产品的兼容性和稳定性。目前市场上主要的软件加密锁硬件内部均含有单片机,即所谓内置CPU,软件厂商主要是利用算法功能进行加密。加密锁通常还增加了一些辅助功能,比如倒计数器、远程升级等。这类型加密锁主要产品有彩虹天地的“微狗” “SuperPro”、深思洛克的“深思Ⅰ、III型”、 ALADDIN的HASP3、4等。通过对这些软件锁进行分析,认为从安全性上讲他们至少有三方面致命的薄弱点:
薄弱点1:设计原理有很大缺陷
目前主流的加密锁硬件提供了读、写和算法变换功能,且算法变换关系难以pj和穷举。但这类加密锁最大的缺陷是算法不向软件厂商公开,锁内的变换算法在出厂时已经固定,软件加密者只能设置算法的参数。这样就限制了厂商对算法的使用,要么预先记录算法结果然后在软件运行时核对(使用码表),要么在软件中至少变换两次然后比较结果是否一致;如果解密者截获这些数据,通过统计、分析就有可达到解密目的。
薄弱点2:加密锁受处理能力的限制,无法为软件提供强有力的保护
市场上曾先后推出了几款“可编程”加密锁。这类型加密锁最大的特点就是可以让用户自行设计专用算法。“可编程”加密锁的出现的确是软件加密技术的一次进步。深思洛克的“深思III”、飞天诚信的“Rockey4”均属此类产品。
但由于成本限制,这类型加密锁往往只能采用10~20元人民币的通用8位单片机或同档次的ASIC芯片作为核心微处理器。这种低档单片机的处理运算能力是相当弱的,这就给 “可编程”加密锁造成了很大的局限性,主要表现在:1、算法变换的复杂度不够高,2、指令编码空间较小,3、程序区的空间较小。这些局限性使得用户根本不可能利用“可编程”加密锁实现理想的高强度加密方案。
薄弱点3:硬件本身抵抗恶意攻击的能力较弱
随着集成电路设计、生产技术的发展,安全产品的核心芯片硬件本身受到攻击的可能性越来越大。典型的硬件攻击手段有电子探测攻击(如SPA和DPA)和物理攻击(探测,如采用SiShell技术),下面我们就这方面进行简要的分析。
电子探测(SPA和DPA)攻击技术的原理是:单片机芯片是一个活动的电子元器件,当它执行不同的指令时,对应的电功率消耗也相应的变化。通过使用特殊的电子测量仪和数学统计技术,来检测和分析这些变化,从中得到单片机中的特定关键信息。
物理攻击的方法有:通过扫描电子显微镜对芯片内部存储器或其它逻辑直接进行分析读取;通过测试探头读取存储器内容;通过从外部无法获取的接口(例如厂家测试点)对存储器或处理器进行直接数据存取;再激活单片机的测试功能等。
由于通用低档单片机并非定位于制作安全类产品,没有提供有针对性的防范物理攻击手段,因此比较容易通过电子探测(SPA和DPA)攻击直接读出存储器内的数据。虽然大多数普通单片机都具有熔丝烧断保护单片机内代码的功能,但此类芯片应用场合广、发行批量大,随着厂商间委托加工与频繁技术转让,使得利用该类芯片下载程序的设计漏洞,利用厂商的芯片测试接口,通过特殊的烧写时序和数据读出信息成为比较容易的事情。
ASIC芯片是完全根据用户需求而特别定做,属于小批量生产。由于其采用特殊的逻辑电路且不会轻易公开测试功能接口,因此只要以其为基础开发的系统不是保存重要的信息或者不用于高级别的安全场合还是可以防范一般情况下的物理攻击。
加密锁性能判定
加密锁很小巧,包含的技术内容却很丰富。一般我们从三个方面分析加密锁的性能:
第一个是加密原理,或者说加密锁有些什么功能,这往往是针对一些解密方法发展起来的,最需要创造性的地方就是这里。国内产品在这个方面一直与国外产品具备足够的竞争能力。
第二个是加密锁的可靠性、稳定性、兼容性、透明性等。这些是对锁的基本要求,但是做完整并不容易,尤其是兼容性、透明性问题,加密厂家在这方面有着丰富的经验,但是没有谁可以100%保证。透明性是锁的一个比较特殊的指标,由于锁是工作在并口(打印口),并口还会有其他设备,比如打印机、绘图仪、硬盘、光驱等,锁如果影响到原来设备的正常工作就是透明性不够好,完全的透明是难以做到的,一般的加密厂家不保证锁对并口硬盘、光驱等设备的透明性。
最后一个是锁的易学性、易用性。
软件狗加解密技术的简单介绍(我将在以后陆续加入并详细介绍)
涉及到加、解密的技术可以说是包罗万象,基本的有汇编语言、调试工具、 *** 作系统等,还需要一些密码学的基本常识,如果对数据结构、编译原理等有一定的了解会更有帮助。当然,这并不是说没有这些基础就做不好加密,在使用加密锁时,很多工作已经由加密厂家完成了,其实加密者只要对“随机性”有一些基本的认识,就可以完成很出色的加密。这个随机与一般意义上的随机有所不同,这里强调的是“不可预测性”。如果解密者可以预知加密锁返回的数据,就可以用程序代替锁来返回,软件就无法知道锁是否真正存在,就是被解密了。这就是我们常说的“仿真”,在密码学中就是假冒攻击。所以,加密的一个重要思路就是让解密者看来:锁输入输出数据有很强的随机性。目前,加密设计中最迫切解决的就是构造随机性的问题。
常有人这样加密:在软件中反复检查锁内的数据,而且运用了很复杂的检查方法,比如中间插入一些运算或者垃圾程序等,加密的工作量很大,以为“我查了那么多次锁还不够吗?”。但这在解密者眼里不值一提,只要发现锁返回数据的规律性就足够解密了,根本不必理会软件是怎么使用的。这种加密失败在于,只是用了些读 *** 作,没有构成返回数据的随机性。那么,如果扩大加密锁存储容量,或者进行些写 *** 作就行吗?显然还是随机性太差。因为这点,第一代加密锁很难胜任真正的加密工作了。也因为这点,过去比较繁荣软加密技术难以深入发展。这提醒我们,如果加密原理不合理,再大的加密工作量也是徒劳无益的。
使用算法变换就可以增强随机性,但是有人这样加密:在软件中大量调用算法变换,变换的数据量也很大(即算法码表很大),可还是被轻易解密了。为什么呢?是不是算法被破了?不是。这种加密方法在解密者看来和上个没有什么不同,只要把每次变换的数据内容都记录下来,如果软件再用同样的数据调用算法,解密者自然知道应该返回什么数据了。失败原因是,码表内容是固定的,被解密者穷举了,没有构成随机性,这说明可以穷举的东西是不具备随机性的。那么怎么才能防止被穷举呢?由于加密者也不知道算法方程,实际上是做不到的。但是,我们可以给解密者增加很多穷举困难。我们知道,只要让解密者抓到一次,这个数据就再也没有加密作用了,因此不能让软件运行一次就用完所有码表,另外还可以用些随机数来做变换,这就考验解密者的分辨能力了。这是个技巧性比较高的问题,需要不小的工作量,但这的确对加密强度有贡献。
如果加密者知道算法内容,而解密者不知道,这样就可以用任何数据来访问加密锁的算法功能,解密者就无法穷举了,第三代“可编程”加密锁就能实现这种思想。
由于第三代锁的出现,需要补充另外一个话题,就是加密锁的功能。如果解密者可以通过数学方法解析出锁的内部功能,就可以“仿真”了。如何设计锁的功能才不易被破呢?这涉及到一点密码学,一般的加密者只要能够将不同类型的运算混合使用就够。对于第一、二代加密锁,解密者没有必要去分析程序是如何使用锁返回数据的(仿真的思路),而对于第三代锁,这种方法常成了解密者唯一希望,寄希望于通过跟踪锁返回数据的使用过程而推测出锁的内部功能。这时候几乎任何能够降低程序可读性的手段都会提高加密效果,比如程序垃圾、反复的数据搬动、嵌入汇编、插入浮点运算等等。这点很吸引人,即使你刚明白加密,也能让解密专家围着你团团转。
加密者往往远不如解密者专业,随着互联网的发展,解密技术正以更快的速度传播,这给加密带来了更大的挑战。
软件狗的加密技术介绍
解密一个软件狗可以从两方面入手,其一是软件,只要把检查软件狗的那部分代码解除,那么软件狗就成了一只“死狗”。其二是从硬件入手的解密方法,其含义是要仿制一个加密盒,不管机密做的如何好,如果加密盒被仿制了,那么软件狗的加密作用也就不存在了。因此,从硬件入手的解密跟从软件入手的解密其效果是一样的,只不过后者需要付出一定的额外代价—硬件成本而已。
那么既然从软件、硬件着手都能解密,用它来保护软件还有什么作用?不用着急,让我们来谈谈如何更地保护您的软件。
针对解密的两种方法,我们也从这两方面来加强软件的加密功能。
增强软件狗加密功能的方法
一、软件加密
全面我们说,从软件入手的解密方法很多,针对这种情况,人们也研制出了很多行之有效的防解密措施,在次,我们把一些常用的防止软件跟踪解密的措施列于下面:
1、计算程序执行时间,并判断程序的执行时间是否过长;
2、关键程序部分禁止 键盘中断,并检查键盘中断是否被开放;
3、关键程序部分禁止显示输出和打印输出;
4、在软件中多做几次软件狗检查;
5、把程序的重要部分加以编码加密,在运行时才解密;
6、修改断点中断功能;
7、利用除零中断或溢出中断是否有程序跟踪;
8、利用时钟中断检查是否有程序跟踪;
9、在程序中调用INT 7;
10、程序不要写得很结构化,要多一些“废话”;
11、若干种加密方法综合使用;
12、用黄玫瑰软件制作组出品的BITSHELL作外层防护;
==================================================
[ 附:外壳反跟踪反破译程序BITSHELL简介
一、系统简介
BITSHELL是一套可反跟踪反破译的软件加密系统,主要用语保护软件开发者的合法权益,防止未经授权的复制、算法解读及目标码反汇编。它是我们应高级开发者的要求从BITLOK中提炼出来的,专为应用软件提供pj保护的系统。应用软件开发者可以充分发挥自己的才智编写或精巧或复杂的程序,有 BITSHELL的保护不用担心竞争者对商品软件进行逆向分析。应用软件开发者更可以设计自己的反拷贝介质(加密卡、加密狗等),然后用BITSHELL 进行外层保护,从而不必担心访问反拷贝介质的代码被截获。应用软件开发者也可以购买商品化的加密卡,加密狗等,在应用系统内部秘密地存取加密卡、加密狗,用BITSHELL作外层保护,防止访问反拷贝介质的代码被截获。
主要功能和性能如下:
千变万化的加密方案
内含随机可选的二十套加密算法,构造出千变万化的反跟踪反破译方案,特别适合加密有多个单独执行程序的软件。
先进超强的反跟踪技术
采用加密虚拟机、多层间址多 链解等独创的世界领先技术,结合传统的加密方法,具备超强的动态反跟踪能力。防范各种软硬件调试器对其破译。不仅防止了国际上通用的调试器,如:Soft-ICE,Turbo Debugger,Symdeb等,还重点防范了国内开发的各种专用调试器。
可靠性高、兼容性好、使用面最广泛
经BITSHELL10加密过的软件日夜运行在超过60万台机器上,经过了最广泛、最严格的测试。BITSHELL20具备同样可靠的性能,加密过的软件可以在各种厂牌各种机型上正常运行,兼容各种流行的DOS系统。
功能全面、使用方便
可加密各种带覆盖模块的执行文件,特别适合加密有Clipper,FoxPro等编译的各种数据库应用系统。
提供OBJ嵌入式加密模块。这样,用户还可以在源程序里加入加密模块,与外壳部分相互关联,有效地提高破译难度。
可以为用户定制专用BITSHELL反跟踪反破译系统,可以满足用户的独特需求。
二、快速入门
BITSHELL经过了用户严格的检验,作者对其精雕细琢反复修正,现在的版本使用极容易。确保BITSHELL硬盘或网络安装已经成功,或BITSHELL源盘在软驱中,加密方法如下:
BITSHELL<源文件><目标文件>
例如:
把TESTEXE加密成TESTOKEXE。输入以下命令:
BITSHELL TESTEXE TESTOKEXE
把TEXEEXE加密不保留未加密的程序。输入以下命令。
三、 *** 作指南
1、BITSHELL参数的详细说明
BITSHELL可以用KEY环境变量来设定一些参数,这样可以简化使用过程。设置方法如下:
SET KEY=[SCHEMExx,][STAY,][CHECKOVL]
BITSHELL各项参数的意义如下:
(1)参数SCHEMExx,若给出则依用户的要求使用指定的变形算法,否则将随机抽取一种加密算法。BITSHELL20共有20种算法可选。
每一种算法都有自己
密码锁按键一般是矩阵键盘,识别键盘是通过发送扫描码,比如行扫描,发送行扫描码,依次检测列状态。goto(1,0)是不对的,因为这里goto是内部关键字,不会允许使用,程序里面是gotoxy(1,0),这应该是显示位置,比如这个,就是0行1列。
以上就是关于数字密码锁设计 如下图A、B、C、D 代表四位密码输入(密码由同学自己设定),E 为开锁控制输入全部的内容,包括:数字密码锁设计 如下图A、B、C、D 代表四位密码输入(密码由同学自己设定),E 为开锁控制输入、(80C51单片机)设计4×4键盘及8位数码管显示构成的电子密码锁.的C语言程序。、基于单片机的电子密码锁设计 毕业论文等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)