基于89C51电子密码锁设计附程序文件.docx

上传人:b****4 文档编号:27062425 上传时间:2023-06-26 格式:DOCX 页数:50 大小:2.77MB
下载 相关 举报
基于89C51电子密码锁设计附程序文件.docx_第1页
第1页 / 共50页
基于89C51电子密码锁设计附程序文件.docx_第2页
第2页 / 共50页
基于89C51电子密码锁设计附程序文件.docx_第3页
第3页 / 共50页
基于89C51电子密码锁设计附程序文件.docx_第4页
第4页 / 共50页
基于89C51电子密码锁设计附程序文件.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

基于89C51电子密码锁设计附程序文件.docx

《基于89C51电子密码锁设计附程序文件.docx》由会员分享,可在线阅读,更多相关《基于89C51电子密码锁设计附程序文件.docx(50页珍藏版)》请在冰豆网上搜索。

基于89C51电子密码锁设计附程序文件.docx

基于89C51电子密码锁设计附程序文件

《电子技术综合设计》

设计报告

 

设计题目:

基于STC89C52单片机的电子密码锁设计

组长:

汪菲学号:

专业与班级:

信息12-1班

姓名:

田宣宣学号:

专业与班级:

信息12-1班

姓名:

侯宁博学号:

专业与班级:

信息12-1班

时间:

2014~2015学年第

(1)学期

指导教师:

袁小平成绩:

日期:

2015年1月1日

 

一、设计摘要和课题任务

在日常生活和工作中,住宅与部门的安全防、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。

目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。

针对这些锁具给人们带来的不便,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的电子密码锁应运而生。

它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。

本文从经济实用的角度出发,采用89S51单片机与低功耗CMOS型E2PROMAT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。

关键词:

单片机;密码锁;红外遥控

完成的功能:

1.密码锁初始设置6位密码,密码通过红外遥控器或4X4键盘输入,若密码正确,则将锁打开。

在按下每个按键的时候都会有蜂鸣器响声。

2.密码由用户自己设定,在开锁状态下,用户可自行修改密码。

本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误一次将报警。

密码可以由用户自己修改设定,锁打开后才能修改密码。

修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

3.系统工作时,用户通过红外遥控器或键盘输入密码,单片机将输入密码与设定密码进行比较,若密码正确,则发出开锁信号,将门打开,系统不报警;若密码不正确,则有相应的指示灯闪动,并要求重新输入密码,重新输入密码的次数不能超过3次,若3次输入的密码都不正确,则发出报警信号。

4.对密码进行存储,用户设定的密码掉电不丢失。

二、方案比较与选择

可行性分析:

本次设计采用STC89C52芯片,STC89C52是一个低电压,高性能CMOS8位单片机.编程软件采用keil软件,由keilC生成HEX文件,然后烧入单片机。

密码输入采用红外遥控输入和4X4键盘输入方式。

红外线输入采用通用遥控器,遥控接收采用HX1838一体化万能接收头。

接收到的信号通过单片机INT0输入单片机。

键盘采用的是4X4矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口,让设计更容易实现。

密码存储采用EEPROM串行IC总线芯片AT24C02。

通过单片机对24c02芯片进行密码存储,存储好密码后,通过按键输入密码与存储芯片里面的数据进行对比,根据数据是否一致,来执行相应的操作,还可以根据按键操作来执行是否更换数据。

报警部分由蜂鸣器及外围电路组成,加电后不发声,当密码输入错误时,单片机的P3.6引脚为低电平,三极管导通执行蜂鸣器报警声子程序发出警笛报警。

开锁用户通过键盘设置六位密码,并储存在EEPROM中作为锁码指令。

首先按下键盘数字键0-9输入密码,最后按下确认键。

当用户输入一密码后,单片机自动识码,如果识码不符,则提示重新输入,如果超过三次则报警。

如果正确,系统使单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开,实物中用继电器替代。

除红外遥控外其它部分可以采用Proteus软件进行仿真,使用C语言编程,使该设计的功能更容易进行规划调试及实现,同时也节约了开发成本,具有一定可行性。

三、系统设计

STC89C52

程序

键盘红外输入

报警模块

继电器模块

1602显示

24c02模块

如图所示,本次密码锁设计共有如下六部分组成:

四、电路设计

1)STC89C52RC单片机

STC89C52RC单片机为40引脚芯片如图所示。

I/O口线:

P0、P1、P2、P3共四个八位P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读ˆ写操作。

P1口是专门供用户使用的I/O口,是准双向口。

P2口是从系统扩展时作高8位地址线用。

不扩展外部存储器时,P口也可以作为用户I/O口线使用,P2口也是准双向口。

P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二I/O功能,作为第一功能使用时操作同P1口。

(我们用STC的原因:

STC89系列单片机大部分具有在系统可编程(ISP)特性,ISP的好处是:

省去购买通用编程器,单片机在用户系统上即可下载/烧录用户程序)

 

2)晶振时钟电路

XTAL1:

单芯片系统时钟的反向放大器输入端。

XTAL2:

系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个30PF的小电容,可以使系统更稳定,避免噪声干扰而死机。

3)复位电路

RESET:

芯片的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,芯片便能完成系统重置的各项动作,使得部特殊功能寄存器之容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

本图为开关复位基本电路:

 

4)蜂鸣器电路

三极管主要是做驱动用的。

因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出低电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出高电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。

(5)1602的使用:

硬件接线:

液晶4端RS端为向液晶控制器写数据/写命令选择端。

液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。

液晶6端为使能信号E,是操作时必需的信号。

(6)红外遥控输入

红外线输入采用通用遥控器,遥控接收采用HX1838一体化万能接收头。

接收到的信号通过单片机INT0输入单片机。

通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

遥控信号接收

接收电路可以使用一种集红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

接收器对外只有3个引脚:

Out、GND、Vcc与单片机接口非常方便,如图7所示。

①脉冲信号输出接,直接接单片机的IO口。

②GND接系统的地线(0V);

③Vcc接系统的电源正极(+5V);

(7)

继电器模拟开锁部分

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。

只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。

当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。

这样吸合、释放,从而达到了在电路中的导通、切断的目的。

对于继电器的“常开、常闭”触点,可以这样来区分:

继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。

继电器一般有两股电路,为低压控制电路和高压工作电路。

如果密码输入正确,系统使单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开,实物中用继电器替代。

 

(8)密码存储部分

密码存储采用EEPROM串行I2C总线芯片AT24C02。

通过单片机对24C02芯片进行密码存储,存储好密码后,通过按键输入密码与存储芯片里面的数据进行对比,根据数据是否一致,来执行相应的操作,还可以根据按键操作来执行是否更换数据。

 

(9)矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P2口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显b,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

5、程序设计:

本设计选用单片机STC89C52RC作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。

在单片机的外围电路:

外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。

当用户需要开锁时,先按键盘的数字键0-9输入密码。

密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。

新密码输入无误后按确认键使新密码将得到存储,密码修改成功。

(1)程序设计框图:

具体程序在以后设计过图书馆、网上查询资料进行编写,调试。

(2)LCD1602的控制实现

voidwrite_(uchar)//1602液晶写指令

{

rs=0;

lcden=0;

P1=;

delayms

(1);

lcden=1;

delayms

(2);

lcden=0;

}

voidwrite_date(uchardate)//1602液晶写数据

{

rs=1;

lcden=0;

P1=date;

delayms

(1);

lcden=1;

delayms

(2);

lcden=0;

}

voidinit_lcd(void)//初始化液晶,及画面初始化

{

wela=0;

lcden=0;

write_(0x38);

write_(0x0c);

write_(0x06);

write_(0x01);

write_(0x80);

}

voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)

{

if(y==0){write_(0x80+x);}

else{write_(0xC0+x);}

while(*s)

{write_date(*s);s++;}

}

注意:

写操作命令和写数据命令分别是两个独立的函数完成的,函数部唯一的区别就是液晶数据命令选择端的高低电平的不同。

我们小组通过先写了这些程序,作用是以后想要往1602的某一行某一列读写数据的时候可以直接调用LCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)程序,其中X是指定某一列,y指定某一行,S表示要显示的字符。

(3)矩阵键盘的控制实现

1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:

依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

ucharKeys_Scan()

{

ucharTmp,KeyNO=0;

P2=0x0f;

delayms

(1);

Tmp=P2^0x0f;

switch(Tmp)

{

case1:

KeyNO=0;break;

case2:

KeyNO=1;break;

case4:

KeyNO=2;break;

case8:

KeyNO=3;break;

default:

KeyNO=16;

}

P2=0xf0;

delayms

(1);

Tmp=P2>>4^0x0f;

switch(Tmp)

{

case1:

KeyNO+=0;break;

case2:

KeyNO+=4;break;

case4:

KeyNO+=8;break;

case8:

KeyNO+=12;

}

Beep();

returnKeyNO;

}

Keys_Scan()为键盘扫描程序首先让P2口高四位为0,低四位为1,。

若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。

然后让P2口高四位为1,低四位为0,若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。

(4)存储器24C02:

(模块化程序,可以直接拿来用,需要自己定义的就是SDA和SCK的控制引脚)

voidI2C_start(void)

{

SDA_EEPROM=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SDA_EEPROM=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

}

voidI2C_stop(void)

{

SDA_EEPROM=0;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SDA_EEPROM=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

}

voidI2C_ackownledge(void)

{

SDA_EEPROM=0;

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

_nop_();

}

voidI2C_no_ackownledge(void)

{

SDA_EEPROM=1;

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

_nop_();

}

voidI2C_sendB(ucharbyte)

{

ucharcounter;

for(counter=0;counter<8;counter++)

{

if(byte&0x80)SDA_EEPROM=1;

elseSDA_EEPROM=0;

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

byte<<=1;

}

_nop_();

_nop_();

SDA_EEPROM=1;

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

if(SDA_EEPROM==0)ack=1;

elseack=0;

SCL=0;

_nop_();

_nop_();

}

ucharI2C_receiveB(void)

{

uchartemp;

ucharcounter;

temp=0;

SDA_EEPROM=1;

_nop_();

_nop_();

for(counter=0;counter<8;counter++)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

if(SDA_EEPROM==1)temp=(temp<<1)|0x01;

elsetemp=temp<<1;

_nop_();

_nop_();

SCL=0;

_nop_();

_nop_();

_nop_();

}

_nop_();

_nop_();

return(temp);

}

bitI2C_send_string(ucharno,ucharaddress)

{

ucharcounter;

for(counter=0;counter

{

I2C_start();

I2C_sendB(C02_write);

if(ack==0)return(0);

I2C_sendB(address+counter);

if(ack==0)return(0);

I2C_sendB(UserPassword[counter]);

I2C_stop();

delay_ms(20);

}

return

(1);

}

//读EEPROMPassword

bitI2C_receive_string(ucharno,ucharaddress)

{

ucharcounter;

for(counter=0;counter

{

I2C_start();

I2C_sendB(C02_write);

if(ack==0)return(0);

I2C_sendB(address+counter);

if(ack==0)return(0);

I2C_start();

I2C_sendB(C02_read);

if(ack==0)return(0);

IIC_Password[counter]=I2C_receiveB();

I2C_no_ackownledge();

I2C_stop();

}

}

(5)红外发射与接收部分:

voidEX0_ISR(void)interrupt0//外部中断1服务函数

{

staticunsignedchari;//接收红外信号处理

staticbitstartflag;//是否开始处理标志位

if(startflag)

{

if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms

i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1

irtime=0;

i++;

if(i==33)

{

irok=1;

i=0;

}

}

else

{

irtime=0;

startflag=1;

}

}

红外接收占用了一个外部中断,一个定时器0。

解码程序部分如下:

voidIr_work(void)

{

switch(IRcord[2])

{

case0x16:

KeyNo=0;break;//遥控按键0

case0x0c:

KeyNo=1;break;//遥控按键1

case0x18:

KeyNo=2;break;//遥控按键2

case0x5e:

KeyNo=3;break;//遥控按键3

case0x08:

KeyNo=4;break;//遥控按键4

case0x1c:

KeyNo=5;break;//遥控按键5

case0x5a:

KeyNo=6;break;//遥控按键6

case0x42:

KeyNo=7;break;//遥控按键7

case0x52:

KeyNo=8;break;//遥控按键8

case0x4a:

KeyNo=9;break;//遥控按键9

case0x19:

KeyNo=10;break;//遥控按键100+

case0x0d:

KeyNo=11;break;//遥控按键200+

default:

KeyNo=16;

}

IRcord[0]=0;//清除输入数据

IRcord[1]=0;//清除输入数据

IRcord[2]=0;//清除输入数据

IRcord[3]=0;//清除输入数据

irpro_ok=0;//处理完成标志

}

voidIrcordpro(void)//红外码值处理函数

{

unsignedchari,j,k;

unsignedcharcord,value;

k=1;

for(i=0;i<4;i++)//处理4个字节

{

for(j=1;j<=8;j++)//处理1个字节8位

{

cord=irdata[k];

if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80;

if(j<8)

{

value>>=1;

}

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

 

(6)器件采购

元件名称

数量

元件名称

数量

STC89C52RC芯片

一个

12MHZ晶振

一个

LCD显示屏

一个

二极管

一个

三极管

两个

按键

十七个

LED

一个

103滑动变阻器

一个

蜂鸣器

一个

SRA-06VDC继电器

一个

AT24C02芯片

一个

红外遥控器

一个

红外接收头

一个

导线

若干

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1