表1.11-1所示为硬件设计中使用到的元器件。
表1.11-1 元器件列表
元器件 单片机 三极管 EEPROM 稳压管 液晶显示器 晶振 电阻 排阻 电容 发光二级管 蜂鸣器 规格/型号 AT89S51 8550 AT24C02 7805 LCD1602 12M 10K/1K/100 10K 104/30Pf.7uF 红色/绿色/黄色 数量 1 1 1 1 1 1 4/6/1 1 3/2/1 1/1/1 1
2 软件程序设计
目前,对单片机的编程主要采用汇编跟C语言。汇编语言有执行效率高、速度快、与硬件结合紧密等特点。尤其在进行I/O端口管理时,使用汇编语言有快捷、直观的优点。但是使用汇编语言相对于使用高级语言编程难度要大一些,且程序可读性低,开放性差,从系统开发时间来看,效率不是很高。
C语言是一种结构化语言,可产生紧凑代码。C语言可以用许多机器级函数直接控制操作8051硬件。与汇编语言相比,C语言有如下的优点:
◆不要求了解单片机的指令系统,仅要求对8051的存储结构有初步了解; ◆寄存器分配,不同存储器的寻址及数据类型等细节可由编译器管理; ◆程序有规范的结构,可分为不同的函数,这种方式可使程序结构化; ◆具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; ◆关键字及运算符可用近似人的思维方式使用; ◆编程及程序调试时间显著缩短,从而提高效率;
◆提供的库包含许多标准子程序,具有较强的数据处理能力;
◆已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。
15 当然,采用混编模式,就能结合两者的优点。
本系统程序使用C语言编写。使用C语言编程,目的是实现数字密码锁的所有功能。C语言编程主要实现显示功能,进行密码输入,对密码进行比较,判断密码对错和修改密码等功能。
2.1 编译器Keil uVision2简介
Keil uVision2 是德国Keil公司开发的一个单片机C语言编译器,可以用它来编译C源码,汇编编写的汇编源程序,连接和重定位目标文件和库文件,创建HEX文件,调试目标程序。和其他的C语言编译器相比,Keil uVision2有着很多的优点,例如可产生最少的代码、支持浮点和长整数、支持重入和递归。在Keil uVision2的仿真功能中,有两种仿真模式:软件仿真模式和目标板仿真模式,在软件仿真模式下我们不需要任何8051单片机硬件即可完成用户程序仿真调试,极大地提高了用户程序开发的效率。在目标板调试方式下,用户可以将程序下载到自己的8051单片机板上,利用8051的串口与PC机进行通讯来实现程序的实时在线仿真。 2.2 软件总设计流程图
软件总设计流程图如图2.2-1所示。
16 开始 LCD初始化 时钟显示 S2 设置时间 S3 检测命令键 S4 密码锁界面 Return键 检测命令键 N 输入密码 修改密码键 N 密码正确 Y 开锁 红色LED亮 N+1 修改密码 N N>3 Y 报警
图2.2-1 软件设计流程图
2.3 具体功能软件实现
2.3.1 4×4矩阵键盘扫描程序
当键盘中按键数量较多时,为了减少对I/O口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图2.3.1-1所示,它由
17 行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。
图2.3.1-1 4×4矩阵键盘
图2.3.1-1为一个4×4行列结构,可以构成16个键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O口线。
矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU的时间,所以较好的方式是采用状态机的方法来设计,尽量减少键盘查询过程对MCU的占用时间。
图2.3.1-1中,KEY1、KEY2、KEY3、KEY4为4根列线,作为键盘的输入口(工作于输入方式)。KEY5、KEY6、KEY7、KEY8为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。
18 行扫描法也称为逐行扫描查询法,其按键识别的过程如下:
将全部行线KEY5-KEY8置低电平输出,然后读KEY1-KEY4四根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。
在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依次将行线置为低电平,并检测列线的输入(扫描),进而确认具体的按键位置。如当KEY5输出低电平时(KEY5=0、KEY6=1、KEY7=1、KEY8=1),测到KEY2的输入为低电平(KEY=1、KEY2=0、KEY3=1、KEY4=1),则可确认按键S3处于闭合状态。通过以上分析可以看出,MCU对矩阵键盘的按键识别,是采用扫描方式控制行线的输出和检测列线输入的信号相配合实现的。
矩阵按键的识别仅仅是确认和定位了行和列的交叉点上的按键,接下来还要考虑键盘的编码,即对各个按键进行编号。在软件中常通过计算的方法或查表的方法对按键进行具体的定义和编号。
2.3.2 显示程序
本系统使用LCD1602实现显示,只要参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。这里的驱动程序主要包括:初始化函数、设置显示坐标、写字符函数及写字符串函数。在时钟界面时显示时间的运行,在密码锁界面时主要显示提示信息和输入的密码,当然,当输入密码数字时,输出不是显示数字,而是用“*”显示代替。
2.3.3 时钟运行子程序
当系统开始后,LCD1602初始化,然后显示时钟界面,程序在T0中断,进入时钟运行子程序,其流程图如图2.3.3-1所示。
19