图3.1 AT89C51引脚图
3.2振荡器和时钟电路
振荡器和时钟电路用于产生单片机正常工作时所需要的时钟信号,AT89C51单片机采用CMOS工艺,内部包含一个振荡器,可以用于CPU的时钟源;也允许采用外部振荡器,由外部振荡器产生的时钟信号来供内部CPU运行使用。
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部
时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
图3.2 振荡器电路
3.3 单片机复位电路
单片机的复位是一个很重要的部分,复位是使单片机的CPU以及系统的各个部件处于特定的初始状态,并使系统从初始状态开始工作。一般在系统上电,或者程序死机的时候需要进行单片机的复位。单片机复位原理是,在时钟电路开始工作后,在单片机的RST引脚施加24个时钟振荡脉冲(即两个机器周期)以上的高电平,单片机便可以实现复位。在复位期间,单片机的ALE引脚和PSEN引脚均输出高电平。当RST引脚从高电平跳变为低电平后,单片机便从0000H单元开始执行程序。本系统采用自动上电复位电路,这样可以上电自动复位和人工复
11
位单片机系统,如图3.4所示,当按下按键开关的时候,
VCC通过一个电阻连接到RST引脚,给RST一个高电平;按键松开的时候,RST引脚恢复为低电平,复位完成。
图3.3 手动上电复位电路
3.4 键盘电路设计
在单片机应用系统中,一般都会设置键盘,主要为了控制运行状态,输入一些命令或数据,以完成特定的人机交互。键盘是与单片机进行人机交互的最基本的途径,其以按键的形式来设置控制功能或输入数据,按键的输入状态本质上是一个开关量。对于简单的开关量的输入可以采用独立式按键,这种方法接口简单,但占用单片机I/O端口资源较多。对于输入参数较多、功能复杂的系统,需要采用矩阵式键盘进行输入控制。本系统采用4*4矩阵式键盘,键盘连接方式如图3.5所示:
12
图3.5 键盘电路图
3.5 液晶显示电路设计
液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。电子密码锁中需要显示的信息比较多,为了能直观的看到结果,并且为了设计显的美观,使用总线和排阻进行简化连接方式,本设计采用液晶显示屏LCD进行显示,具体连接方式如图3.6所示。
图3.6 液晶显示器电路
3.6 存储芯片电路设计
I2C总线(Inter Intergrate Circuit BUS)全称为芯片间总线,它在芯片
间以两根连线实现全双工同步数据传送,一条数据线(SDA)和一条串行时钟线(SDL),可以很方便地构成外围器件扩展系统。I2C总线采用两线制,由数据线
13
SDA和时钟线SCL构成,为了对数据进行存储,本系统使用串行EEPROM芯片,AT24C01系列是典型的I2C串行总线的EEPROM,本系统采用此芯片进行数据存储,存储系统连接如图3.7所示:
图3.7 I2C总线和存储芯片连接电路图
四、系统软件设计
程序设计(Programming)是指设计、编制、调试程序的方法和过程。它是目标明确的智力活动。在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件也占有重要的地位。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。所谓“模块”,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法。
模块程序设计法的主要优点是:
(1)单个模块比起一个完整的程序易编写、调试及修改。 (2)程序的易读性好。 (3)程序的修改可局部化。
14
(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。 (5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。 本系统软件采用模块化结构,由键盘扫描子程序,存储服务子程序,显示子程序。
源程序如下:
#include
#define uchar unsigned char #define uint unsigned int
#define w 6 //定义密码位数 sbit lcd1602_rs=P2^0; sbit lcd1602_rw=P2^1; sbit lcd1602_en=P2^2;
sbit Scl=P2^3; //24C02串行时钟 sbit Sda=P2^4; //24C02串行数据 sbit lock_led = P2^6; //开锁
sbit open_led = P2^7; //开锁指示灯 bit operation=0; //操作标志位 bit pass=0; //密码正确标志 bit ReInputEn=0; //重置输入允许标志 bit s3_keydown=0; //3秒按键标志位
uchar countt0,second; //t0中断计数器,秒计数器 uchar code a[]= {0xFE,0xFD,0xFB,0xF7}; //控盘扫描控制表 uchar code start_line[] = {\
uchar code name[] = {\ //显示名称uchar code Correct[] = {\ //输入正确 uchar code Error[] = {\//输入错误 uchar code codepass[] = {\
uchar code LockOpen[] = {\ //OPEN uchar code SetNew[] = {\
uchar code Input[] = {\ //INPUT uchar code ResetOK[] = {%uchar code initword[] = {%uchar code Er_try[] = {%uchar code again[] = {\
uchar InputData[6]; //输入密码暂存区 uchar CurrentPassword[6]={1,1,1,1,1,1}; //当前密码值 uchar TempPassword[6]; uchar N=0; //密码输入位数记数 uchar CorrectCont; //正确输入计数 uchar ReInputCont; //重新输入计数 uchar code initpassword[6]={0,0,0,0,0,0};
15