#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar old1=0,old2=0,old3=0,old4=0; //原始密码
uchar new1,new2,new3,new4; //采集到的4位密码输入
uchar a=17,b=17,c=17,d=17; //送入数码管显示的变量,初始----
uchar wei,key,temp,finish,allow=1;
void fm();
bit open;
sbit DISP_DCS=P3^6; //数码管段选
sbit DISP_PCS=P3^7; //数码管位选
sbit MOTOR_CS=P2^7; //蜂鸣器
sbit LED_CS=P2^5; //LED
sbit LCD_CS=P3^4; //数码管
unsigned char code table[]=
{
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E,
0x8C,0xBF,0xFF
};
void delay(int i)
{ int j;
uchar k;
for(j=i;j>0;j--)
for(k=125;k>0;k--); //延时ims
}
void display(uchar a,uchar b,uchar c,uchar d)
{
LED_CS=0; //关闭LED片选
DISP_DCS=0; //关闭数码管段选
P0=table[a]; //给数码管送一个数a
DISP_DCS=1; //打开段选
DISP_DCS=0;
DISP_PCS=0; //关闭片选
P0=0x01; //选择第一位
DISP_PCS=1; //打开片选
DISP_PCS=0; //关闭片选
delay(5); //延时
P0=table[b]; //送段码,开段选,关段选;送片选码,开片选,关片选;延时。
DISP_DCS=1;
DISP_DCS=0;
P0=0x02;
DISP_PCS=1;
DISP_PCS=0;
delay(5);
P0=table[c];
DISP_DCS=1;
DISP_DCS=0;
P0=0x04;
DISP_PCS=1;
DISP_PCS=0;
delay(5);
P0=table[d];
DISP_DCS=1;
DISP_DCS=0;
P0=0x08;
DISP_PCS=1;
DISP_PCS=0;
delay(5);
}
void keyscan()
{
MOTOR_CS=0; //关闭蜂鸣器片选
LED_CS=0; //关闭流水灯片选
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f) //----------消抖
{
temp=P1;
switch(temp)
{
case 0x7e: //扫描到第一个键,按键按下行列都为0
key=0; //设置按键对应的数值为0
wei++; //每按下一次位数就会加1
break;
case 0x7d:
key=1; //设置按键对应的数值为1
wei++;
break;
case 0x7b:
key=2; //设置按键对应的数值为2
wei++;
break;
case 0x77:
key=3;
wei++; //设置按键对应的数值为3
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
fm(); //扫描到这一行的每一个键都调用蜂鸣器响1秒程序
}
}
P1=0xbf; //给P1赋值,第二行为0其他都为1
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xbe:
key=4; //设置按键对应的数值为4
wei++;
break;
case 0xbd:
key=5; //设置按键对应的数值为5
wei++;
break;
case 0xbb:
key=6; //设置按键对应的数值为6
wei++;
break;
case 0xb7:
key=7; //设置按键对应的数值为7
wei++;
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
fm();
}
}
P1=0xdf; //给P1赋值,第三行为0其他为1
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xde:
key=8; //设置按键对应的数值为8
wei++;
break;
case 0xdd:
key=9; //设置按键对应的数值为9
wei++;
break;
case 0xdb:
break;
case 0xd7:
open=1;
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f; //判断按键是否松开
}
fm();
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xee:
break;
case 0xed:
break;
case 0xeb:
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
fm();
}
}
}
}
void fm() //蜂鸣器响1S
{
MOTOR_CS=1; //打开蜂鸣器片选
P0=0xb0; //蜂鸣器接在P0^6脚,低电平有效
delay(100); //延时100mS
P0=0xff; //给蜂鸣器置高电平
MOTOR_CS=0; //关闭蜂鸣器片选
}
void shumima() //对按键采集来的数据进行分配
{
if(!finish)
{
switch(wei)
{
case 1:new1=key;
a=key; break; //如果验证正确,此时的数值是修改密码时的值赋给a
case 2:new2=key;
b=key; break; //修改的第二位数赋给b
case 3:new3=key;
c=key; break; //修改的第三位数赋给c
case 4:new4=key;
d=key;finish=1; break; ////修改的第四位数赋给d,输入完毕
}
}
}
void yanzheng() //验证密码是否正确
{
if(finish) //只有当四位密码均输入完毕后方进行验证
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4))
{
a=16;b=17;c=17;d=17;
display(16,17,17,17) ;
MOTOR_CS=1; //打开蜂鸣器片选
P0=0xb0; //蜂鸣器接在P0^6脚,低电平有效
delay(100);
P0=0xff; //给蜂鸣器置高电平
MOTOR_CS=0; //关闭蜂鸣器片选
}
else
{
a=b=c=d=18;
display(18,18,18,18) ;
MOTOR_CS=1; //打开蜂鸣器片选
P0=0xb0; //蜂鸣器接在P0^6脚,低电平有效
delay(3000);
P0=0xff; //给蜂鸣器置高电平
MOTOR_CS=0; //关闭蜂鸣器片选
}
allow--;
}
}
void main()
{
while(1)
{
keyscan(); //键盘扫描
shumima();
if(open)
{
if(allow)
{
yanzheng();
}
}
display(a,b,c,d); //实时显示
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于AT89C52单片机的电子密码锁(内附电路图和仿真)
共21个文件
lst:3个
bak:3个
obj:2个
5星 · 超过95%的资源 需积分: 49 47 下载量 56 浏览量
2019-04-08
10:58:41
上传
评论 15
收藏 65KB RAR 举报
温馨提示
设计是以AT89C52单片机实现密码锁监控装置的检测和控制核心,实现密码信息的设定、加密、更改和错误输入发出警报等功能。分为键盘输入(此处采用4×4矩阵盘),显示输出,密码比对,实现开锁或警报的过程。该设计根据52单片机之间的串行通信原理,便于对密码信息的随机加密和保护。软件设计则是采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。测试结果表明,该系统已达到本设计的各项功能的所有要求。
资源推荐
资源详情
资源评论
收起资源包目录
密码锁.rar (21个子文件)
密码锁电路图.DSN 132KB
密码锁工程文件夹
密码锁.M51 15KB
密码锁.lnp 26B
mms.LST 14KB
密码锁.hex 2KB
mms.OBJ 11KB
密码锁.uvopt 6KB
STARTUP.LST 14KB
密码锁.uvproj 13KB
DISPLAY.lst 925B
密码锁.plg 216B
ExtDll.iex 19B
密码锁.uvgui.Administrator 230KB
密码锁_uvopt.bak 6KB
密码锁_uvproj.bak 13KB
STARTUP.A51 6KB
STARTUP.OBJ 749B
密码锁.uvgui_Administrator.bak 228KB
mms.c 6KB
密码锁 9KB
密码锁电路图.PWI 1KB
共 21 条
- 1
资源评论
- Asama浅间2023-07-28这个文件提供了一个基于AT89C52单片机的电子密码锁的详细电路图和仿真,很实用。
- 傅融2023-07-28通过仿真结果可以看出,该电子密码锁设计稳定可靠,可以满足正常使用的需求。
- 高工-老罗2023-07-28文件中的电路图设计清晰,可以方便地实现自己的电子密码锁项目。
- 奔跑的楠子2023-07-28文件中还提供了一些关于单片机基础知识的解释,对于初学者来说很有帮助。
- 練心2023-07-28评估整个文件的内容,非常适合想要自己制作电子密码锁的人阅读、学习和参考。
神里凌人
- 粉丝: 3
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功