10/11学年第二学期
《单片机控制系统设计与调试》 课程设计任务书
指导教师: 班级: 地点:机房、单片机实验室 课程设计题目:密码锁的设计
一、 课程设计目的
1.灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到PCB制版,再到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解,并灵活运用,将各门知识综合应用。
2.能够上网查询器件资料,培养对新知识新技术的独立的学习能力和应用能力。
3.独立完成一个小的系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为日后的毕业设计及科研工作奠定良好的基础。
二、 课程设计内容(包括技术指标) 1. 主要设计内容:
使用数码管显示器来显示密码输入的相关信息,通过10位数字按键(0~9)设置4位数字(0~9)密码,2位功能按键A(输入校验密码并验证密码)和B (设置新密码),利用继电器模拟电子门锁作出是否开门以及报警等反应。
2. 具体设计内容:
上电时内定初始密码为“0000”,红色发光二极管点亮,绿色发光二极管熄灭,数码管显示器显示“初始状态”,“初始状态”由设计者自行设计,但不可省略。
功能按键A:实现设置新密码功能,存储新密码并显示,一旦设定新密码,则初始密码失效。
功能按键B:实现输入校验密码并验证密码功能,显示校验密码并进行密码比较。
密码输入正确则继电器启动,并使红色发光二极管熄灭,绿色发光二极管点亮,数码管显示器提示“密码正确”,“密码正确”状态的显示内容由设计者自行设计,但不可省略,持续2~5S后继电器关闭,绿色发光二极管熄灭,红色发光二极管点亮;
1
密码输入错误则持续红色发光二极管点亮,绿色发光二极管熄灭状态,蜂鸣器报警,数码管显示器提示“密码错误”,“密码错误”状态的显示内容由设计者自行设计,但不可省略,持续2~5S后蜂鸣器停止报警;
校验密码连续输入错误3次,则持续红色发光二极管点亮,绿色发光二极管熄灭状态,蜂鸣器报警,数码管显示器提示“密码连续错误3次”,“密码连续错误3次”状态的显示内容由设计者自行设计,但不可省略,持续2~5S后蜂鸣器停止报警,新密码失效,恢复初始密码使用。
3. 设计内容说明:
设计必须实现“主要设计内容”的所有功能,但对于“具体设计内容”可做适当调整,密码输入错误3次环节可自行设计。
此外,为了加强密码锁的严密性,可采取下述方案对“设置新密码功能”环节进行加强,依据设计思路可作适当调整,此部分内容为附加内容。
功能按键A:实现输入校验密码并验证密码功能,显示校验密码并进行密码比较。
密码输入正确:
则继电器启动,并使红色发光二极管熄灭,绿色发光二极管点亮,数码管显示器提示“密码正确”,“密码正确”状态的显示内容由设计者自行设计,但不可省略,若不设置新密码,则持续5~8S后继电器关闭,绿色发光二极管熄灭,红色发光二极管点亮;
若功能按键B按下:实现设置新密码功能,存储新密码并显示,一旦设定新密码,则初始密码失效。但此功能必须以旧密码输入正确为前提。
密码输入错误:
校验密码连续输入错误小于3次,则持续红色发光二极管点亮,绿色发光二极管熄灭状态,蜂鸣器报警,数码管显示器提示“密码错误”,“密码错误”状态的显示内容由设计者自行设计,但不可省略,持续2~5S后蜂鸣器停止报警;
校验密码连续输入错误3次,则持续红色发光二极管点亮,绿色发光二极管熄灭状态,蜂鸣器报警,数码管显示器提示“密码连续错误3次”,“密码连续错误3次”状态的显示内容由设计者自行设计,但不可省略,持续2~5S后蜂鸣器停止报警,新密码失效,恢复初始密码使用。
2
三、 时间安排
1. 布置任务、查资料
1天 3天 1天 3天 3天 1天 3天
2. 硬件电路图设计及PCB制版 3. 硬件电路图及PCB制版验收 4.软件编程设计 5.系统调试 6.调试验收 7.完成设计报告
四、 基本要求 1. 画出硬件电路图,完成PCB制版; 2. 3. 4.
画出软件流程图,编写程序(C51语言/汇编语言); 完成系统调试;
提交设计报告,用A4打印。
3
目 录
1 课程设计题目................................................. 1 2 课程设计目的及意义........................................... 1 3 系统方案设计及确定........................................... 2
3.1 系统方案的提出.......................................... 2 3.2 方案比较及确定.......................................... 3 4 系统硬件设计................................................. 4
4.1 STC89C52最小系统设计 ................................... 4
4.1.1时钟电路设计 ...................................... 4 4.1.2复位电路设计 ...................................... 5 4.2 键盘、显示电路硬件设计.................................. 6
4.2.1键盘电路硬件设计 .................................. 6 4.2.2显示电路硬件设计 .................................. 6 4.3 继电器驱动电路及报警电路设计............................ 8
4.3.1 固态继电器简介.................................... 8 4.3.2 固态继电器驱动电路设计............................ 9 4.3.3 报警提示电路..................................... 10
5 系统软件设计................................................ 10
5.1 主程序模块............................................. 12 5.2 密码比较判断模块....................................... 12 5.3 键盘扫描模块........................................... 12 5.4 修改密码模块........................................... 13 5.5 数码管液晶显示模块..................................... 14 6 系统调试.................................................... 15 7 总结........................................................ 15 参考文献....................................................... 17 附录一......................................................... 18 附录二......................................................... 24
1
1 课程设计题目:密码锁
利用单片机STC89C52设计一个密码锁,能够使用数码管显示器来显示密码输入的相关信息,通过10位数字按键(0~9)设置4位数字(0~9)密码,2位功能按键A(输入校验密码并验证密码)和B (设置新密码),利用继电器模拟电子门锁作出是否开门以及报警等反应。
2 课程设计目的及意义
在单片机向着大容量、多功能、高性能、高速度、低电压、低功耗及外围电路内装化的方向发展的时代,选择一种性价比最优的芯片显得尤为重要。
在本次课程设计中,程序编写可选汇编和C语言。而汇编效率高,对硬件的可操控性更强,体积小,但不易维护,可移植性很差;C语言效率比较低,硬件可操控性比较差,目标代码体积大,但容易维护,可移植性很好。该系统用C语言编写程序,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能,故本次课程设计我选择了C语言。
通过对此次设计的理解和掌握,使我受益很多:
1、熟悉掌握单片机的结构及工作原理,锻炼独立设计、制作和调试单片机应用系统的软硬件开发的过程和方法。
2、通过MCS-51单片机应用系统的设计与编程应用,将理论知识和实际应用结合起来,加深对电子电路、电子元器件、印刷电路板等方面的知识,提高在软件编程、排错调试、焊接技术、相关设备的使用技能。掌握单片机的接口及外围设备的特性,使用和控制方法。为以后设计和实现单片机应用系统打下良好的基础。
3、通过密码锁的设计将所学知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力,领会单片机应用系统的软件、硬件调试方法和习题研制开发过程,为进一步的动手实践活动打下一定的基础。
4、这次课程设计时我翻阅了很多资料例如张毅刚主编的《单片机原理及应用》、高峰编的《单片微型计算机原理与接口技术》等书籍,还从网上找了STC89C52、74LS244以及74LS06的资料。让我在学习开发单片机应用系统时对芯片功能的学习有了更新的理解,这不仅需要电子技术方面要有数字电路和模拟电路等方面的理论基础,还需要英语基础。
1
3 系统方案设计及确定
3.1 系统方案的提出
本次课程设计的密码锁电路主要由四个模块组成:键盘输入模块、数据处理模块、显示控制模块,继电器驱动模块和蜂鸣器报警模块。
方案一:以单片机为电子密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动4位数码管显示器提示程序运行过程和开锁的步骤,利用继电器及蜂鸣器模拟电子门锁作出是否开门以及报警等反应。图1为单片机控制密码锁的系统原理框图。
图1 单片机控制密码锁的系统原理框图
方案二:以74LS112双JK触发器构成的数字逻辑电路控制方案,如图2。
2
输入按扭开关5秒定时电路 20秒定时电路 声光指示电路 输入锁存电路 开锁控制电路 密码存储电路 图2 数字逻辑控制方案电子密码锁原理
机械动作构件 3.2 方案比较及确定
由于利用单片机灵活的编程设计和强大的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还可以增添掉电存储、声光提示等功能,故选用方案一。
CPU的选择
STC89C52系列单片机,高速、低功耗、新增在系统/在应用可编程(ISP,IAP)功能,使不具有E2PROM的单片机具有了E2PROM的功能,可以在线对现场历史数据的存储功能,适用于一些需经常改变数据的应用产品(如计费器、门禁系统等)及需远距离改变设备参数的产品(遥控设备等)。采用STC89C52单片机设计的电子密码锁,利用内部E2PROM资源,不需要外接程序存储器就能完成修改密码等多种功能,并且保密性高、成本低、简单易行,符合住宅、部门办公安全要求。
ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离,是一个强大易用的功能。具有双工UART串行通道。内部集成看门狗计时器,不再需要像AT89C51那样外接看门狗计时器单元电路
键盘电路采用矩阵式键盘,显示电路采用四位数码管动态显示方式,动态显示相对于静态显示有占用I/O口资源少的特点,恰好适合于本系统。方案中没有采用键盘、显示接口芯片8279实现键盘、显示接口。由于本次课程设计所使用的键盘数量、显示的方式及单片机的I/O口线使用情况等,采用前一种方式就足以能完成课程设计的要求,不必要多用一个芯片。根据本次课程设计的实际情况,兼顾经济性、使用性、简单易行、操作简单等多方面因素,本次课程设计采用方
3
案一来完成。
4 系统硬件设计
本次课程设计的密码锁电路主要由四个模块组成:键盘输入模块、数据处理模块、显示控制模块,继电器驱动模块和蜂鸣器报警模块。通过单片机送给开锁执行机构,电路驱动继电器吸合,从而达到开锁的目的。如图3所示,为密码锁开锁电路原理图。
当用户输入的密码正确时,单片机便输出开门信号,送到继电器驱动电路,然后驱动继电器常开触点闭合,达到开门的目的。本次设计中,继电器选用固态继电器,信息通过数码管显示,并利用蜂鸣器和发光二极管声光指示。其中,绿发光二极管亮,表示开锁;否则,红发光二极管亮,表示密码输入错误并开启报警电路。
锁定 STC89C52 单片机 密码 正确 是 开锁驱动电路
图3 密码锁开锁电路原理图
4.1 STC89C52最小系统设计
单片机最小系统包括CPU、时钟电路和复位电路等三部分。下面则分别介绍这三部分的选取。 4.1.1时钟电路设计
时钟电路用于产生单片机工作时所必需的时钟控制信号,常用的时钟电路有内部时钟方式和外部时钟方式。内部时钟方式电路外接两个电容和一个晶振,根据振荡频率要求的不同选用不同阻值的电容和晶振。时钟电路中的晶振震荡频率范围通常是1.2MHz~12MHz,AT89S51常选择6MHz或12MHz的石英晶体,为消除
4
否 开锁
误差,得到准确的波特率,本设计选择震荡频率为11.0592MHz的石英晶,时钟电路如图4所示。
图4时钟电路 4.1.2复位电路设计
复位是单片机的初始化操作,只需在单片机的复位引脚加上大于2个机器周期的高电平就可使单片机复位,当程序运行出错或操作进入死循环状态可通过复位重新启动程序。MCS-51的复位是由外部的复位电路来实现的,STC89C52也不例外,复位电路通常采用上电自动复位和按钮复位两种方式,为方便复位操作,本文采用按键电平复位,电路如图5所示。其中C取10uF,R2取10KΩ,复位电路如图5所示。
图5复位电路
5
4.2 键盘、显示电路硬件设计 4.2.1键盘电路硬件设计
键盘是系统中的手动控制部分,所以键盘的设计就显得尤为的重要。每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要M条行线和N条列线,即可组成具有M×N个按键的键盘。由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。本设计中,矩阵键盘列线和单片机P2.0-P2.3相连,行线与单片机P2.4-P2.7相连。
键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。
键盘电路硬件连接图如图6所示。
图6 矩阵按键
4.2.2显示电路硬件设计
显示是系统的输出部分,用于观察当前的输入状态。显示电路采用三极管对位码进行驱动。LED数码管有共阳和共阴两种,把这些LED发光二极管的正极接到一块(一般是拼成一个8字加一个小数点)而作为一个引脚,就叫共阳的,相反的,就叫共阴的,那么应用时这个脚就分别的接VCC和GND。再把多个这样的8字装在一起就成了多位的数码管了 。
6
图7 共阳、共阴数码管
显示方式有静态显示和动态显示两种显示方式。静态显示时,数据是分开送到每一位LED上的;而动态显示则是数据是送到每一个LED上,再根据位选线来确定是哪一位LED被显示。静态显示亮度很高,但口线占用较多;动态显示占用口线数目较少,适合用在显示位数较多的场合,但显示位数的增多,将占用大量的CPU时间。本次设计选用动态显示。
显示电路硬件连接图如图8、图9所示。
330
图8 数码管驱动电路
7
图9 四位数码管 4.3 继电器驱动电路及报警电路设计 4.3.1固态继电器简介
固态继电器(Solid State Relay,缩写SSR),是由微电子电路,分立电子器件,电力电子功率器件组成的无触点开关。用隔离器件实现了控制端与负载端的隔离。固态继电器的输入端用微小的控制信号,达到直接驱动大电流负载。
固态继电器有三部分组成:输入电路,隔离(耦合)和输出电路。按输入电压的不同类别,输入电路可分为直流输入电路,交流输入电路和交直流输入电路三种。有些输入控制电路还具有与TTL/CMOS兼容,正负逻辑控制和反相等功能。固态继电器的输入与输出电路的隔离和耦合方式有光电耦合和变压器耦合两种。固态继电器的输出电路也可分为直流输出电路,交流输出电路和交直流输出电路等形式。交流输出时,通常使用两个可控硅或一个双向可控硅,直流输出时可使用双极性器件或功率场效应管。
1、固态继电器的优点
(1)高寿命,高可靠:固态继电器没有机械零部件,有固体器件完成触点功能,由于没有运动的零部件,因此能在高冲击,振动的环境下工作,由于组成固态继电器的元器件的固有特性,决定了固态继电器的寿命长,可靠性高。
(2)灵敏度高,控制功率小,电磁兼容性好:固态继电器的输入电压范围较宽,驱动功率低,可与大多数逻辑集成电路兼容不需加缓冲器或驱动器。
(3)快速转换:固态继电器因为采用固体器件,所以切换速度可从几毫秒至
8
几微妙。
(4)电磁干扰小:固态继电器没有输入“线圈”,没有触点燃弧和回跳,因而减少了电磁干扰。大多数交流输出固态继电器是一个零电压开关,在零电压处导通,零电流处关断,减少了电流波形的突然中断,从而减少了开关瞬态效应。
2、固态继电器的缺点
(1)导通后的管压降大,可控硅或双相控硅的正向降压可达1~2V,大功率晶体管的饱和压降也在1~2V之间,一般功率场效应管的导通电阻也较机械触点的接触电阻大。
(2)半导体器件关断后仍可有数微安至数毫安的漏电流,因此不能实现理想的电隔离。
(3)由于管压降大,导通后的功耗和发热量也大,大功率固态继电器的体积远远大于同容量的电磁继电器,成本也较高。
(4) 电子元器件的温度特性和电子线路的抗干扰能力较差,耐辐射能力也较差,如不采取有效措施,则工作可靠性低。
(5)固态继电器对过载有较大的敏感性,必须用快速熔断器或RC阻尼电路对其进行过载保护。固态继电器的负载与环境温度明显有关,温度升高,负载能力将迅速下降。
(6)主要不足是存在通态压降(需相应散热措施),有断态漏电流,交直流不能通用,触点组数少,另外过电流、过电压及电压上升率、电流上升率等指标差。
4.3.2 固态继电器驱动电路设计
当用户输入的密码正确时,单片机便输出开门信号,送到继电器驱动电路,然后驱动继电器常开触点闭合,绿发光二极管亮,表示开锁;否则,红发光二极管亮,表示密码输入错误。
硬件电路如图10所示
9
图10 固态继电器驱动电路 4.3.3 报警提示电路
报警提示电路采用小蜂鸣器提示。蜂鸣器能够根据脉冲信号,以及信号的频率发出各种不同的声音,这样可以根据系统要求在密码出入正确和密码输入错误时发出不同的声音提示,已达到报警的要求。蜂鸣器电路,如图11所示。
图11 报警电路
5 系统软件设计
在系统设计中,除了硬件设计之外,软件设计也是很重要的,它是系统工作的指挥者,因此系统软件设计时要遵循结构合理、操作性能好、具有一定的保护措施、兼容性好的设计原则来开发设计。密码锁系统软件设计主要包括主程序模块、密码比较判断模块、键盘扫描模块、修改密码模块、数码管显示模块等及按键检测模块。
系统程序流程如图12所示。
10
开始 系统初始化 显示主界面 否 按键检测 是 读入键值 否 A键是否按下 是 否 判断密码对否 是 开锁,绿灯亮 否 B键是否按下 是 设置新密码 否 A键是否按下 是 新密码设置完成 图12 系统程序流程图
11
报警,红灯亮
5.1 主程序模块
主程序主要用于定义全局变量,给全局变量赋初值,启动定时器,为整个程序提供数据;检测按键;调用显示等功能。 5.2 密码比较判断模块
该模块的功能是将键盘输入的密码利用if语句与设定的密码进行逐个比较,若密码完全正确则开锁;若不正确,则开启报警电路,可重新输入密码。其密码输入和比较判决流程图如图13所示。
输入密码 核对 N键盘锁定,开启报警Y开锁灯亮,可密码修改 复位
图13 密码输入和比较判决流程图
5.3 键盘扫描模块
键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。如图14所示,为键盘扫描流程图。
12
开始 否有按键输入 是Y延时去抖动 Y有键按下? 是计算输入键否有键按下? 是读入键值 返回
图14 键盘扫描流程图
5.4 修改密码模块
在密码输入正确情况下,可以按下“重置密码”对密码进行重新设置,每设定一位就将密码存储起来,当设置4位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。图15为修改密码流程图。
否NN13
图15 修改密码流程图
5.5 数码管液晶显示模块
此模块包括数码管初始化、动态扫描等。
在显示之前,我们编好了段选表0—9,通过查表来显示,由于本次设计采用动态显示,所以先送段选给每一位,然后给相应的数码管送位选,延时1MS,再给下一位送段选,送位选,延时1MS,以此类推,让4位数码管显示不同的数字,利用人的视觉暂留,使我们看到4位数码管的动态显示效果。显示子程序流程图如图15所示。
14
图15 显示子程序流程图
6 系统调试
在本次软件调试中,我们使用的是STC_ISP_V481C51单片机下载工具和Keil uVision2软件,Keil uVision2是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序 。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
15
7 总 结
经过三周的紧张设计,终于顺利完成了设计任务。本次课程设计主要是针对密码锁系统做了详细介绍,以STC89C52为核心,并通过调试运行可以实现数码管显示器显示密码输入的相关信息,通过10位数字按键(0~9)设置4位数字(0~9)密码,实现2位功能按键A(输入校验密码并验证密码)和B (设置新密码),利用继电器模拟电子门锁作出是否开门以及报警等反应。
通过课程设计让我对单片机系统有了较详细的了解,而且触及到与其相关的很多新知识,而且随着电子技术的发展简易数字电压表也会越来越完善,作为大学生的我们应该跟上时代的步伐,时刻关注形势变化,不断充实更新自己的知识。
在设计中既应用到了基础知识,也用到了专业知识,它是对三年来所学知识的综合考察。最重要的是我通过亲自设计,亲自绘制原理图,印制电路板以及系统调试培养了我的耐心和细心,这对我以后的工作和学习有很大的帮助。
16
参考文献
1、张志良.单片机学习指导及习题解答. 机械工业出版社,2008. 2、张伟.单片机原理及应用. 机械工业出版社,2009.
3、孙俊逸 盛秋林. 张铮编著.单片机原理及应用.清华大学出版社. 4、张毅刚主编. 单片机原理及应用. 北京: 高等教育出版社,2010.5. 5、黄仁欣.单片机原理及应用技术. 北京: 清华大学出版社, 2005.
17
附录一:
程序清单
#include #define DataPort P0 //定义数据端口数码管显示 #define KeyPort P2 描 sbit DIG1=P3^1; sbit DIG2=P3^2; sbit DIG3=P3^3; sbit DIG4=P3^4; bit key_flag; bit Flag; bit clr_flag; sbit P23=P2^3;//继电器控制端 sbit P30=P3^0;//蜂鸣器控制端 unsigned char code dofly_DuanMa[]={0xc0,0xf9,0xa4,0x //按键扫 void Init_Timer0(void);//定时器初始化 void Init_Timer1(void); void main (void) { unsigned char key,i,j,count; unsigned char num; unsigned char temp[4]; unsigned char password[4]={0,0,0,0}; Init_Timer0(); Init_Timer1(); i=0; num=0; time_flag=0; count=0; clr_flag=0; change_flag=0; key=0; c_flag=0; delay_count1=0; delay_count2=0; for(j=0;j<4;j++) { } TempData[0]=0xbf; // TempData[1]=0xbf; // TempData[2]=0xbf; // TempData[3]=0xbf;// while (1) //主循环 TempData[j]=0xff; b0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e};// 显示段码值0~F unsigned char TempData[4]; //存储显示值的全局变量 unsigned char time_flag; unsigned char delay_count1; unsigned char delay_count2; unsigned char change_flag; unsigned char c_flag; void Delay(unsigned int z); void Display(void);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 18 { key_flag=0; key=KeyScan(); if(delay_count1!=0) P23=1; while(key_flag) { if(clr_flag==1) { clr_flag=0; for(j=0;j<4;j++) { TempData[j]=0xbf; } } switch(key) { case 0x11:num=0;break; case 0x21:num=1;break; case 0x41:num=2;break; case 0x81:num=3;break; case 0x12:num=4;break; case 0x22:num=5;break; case 0x42:num=6;break; case 0x82:num=7;break; case 0x14:num=8;break; case 0x24:num=9;break; case 0x44:num=10;break; case 0x84:num=11;break; default:break; } key_flag=0; if(change_flag==1&&num==11&&i==0) { c_flag=1; } if(change_flag==1&&c_flag==1) { if( i<5&&i>0) password[i-1]=num; TempData[i-1]=dofly_DuanMa[num]; if(i==5&&num==10) { for(j=0;j<4;j++) { 19 TempData[j]=0xbf; } i++; if(i==6) { } \"p\" \"E\" \"n\" TempData[3]=0xc8; // P23=1; TR0=1; // TempData[2]=0x86; // change_flag=0; } else { } c_flag=0; i=0; clr_flag=1; 定时器开关打开 change_flag=1; } else { count++; if(i<4) { temp[i] =num; if(count==3) { TempData[i]=0x89;//把按键 } TempData[0]=0x86; // \"E\" 值输入到显示数组中 if(i==4&&num==10) { TempData[1]=0x88; // \"r\" Flag=1;//先把比较位置1 for(j=0;j<4;j++) TempData[2]=0x88; // \"r\" TempData[3]=0xb0;//\"3\" Flag=Flag&&(temp[j]==password[j]); for(j=0;j<4;j++) TempData[j]=0XFF; if(Flag) { \"o\" TempData[0]=0xc0; // count=0; P30=0; TR1=1; //定时器0开关打开 20 } else { TempData[1]=0x8c; // //否则显示\"Err\" } void Delay(unsigned int z) { unsigned int x; unsigned int y; for(x=z;x>0;x--) for(y=100;y>0;y--); TempData[0]=0x86; // \"E\" TempData[1]=0x88; // \"r\" TempData[2]=0x88; // \"r } void Display(void) P30=0; TR1=1; { DataPort=0xff; //清空数 //定时器1开关打开 } } if(i==4&&num!=10) clr_flag=1; } 据,防止有交替重影 DIG1=0; DIG2=1; DIG3=1; DIG4=1; DataPort=TempData[0]; //取 { 显示数据,段码0 Delay(2); DataPort=0xff; //清空数 TempData[0]=0x86; // \"E\" 据,防止有交替重影 DIG1=1; DIG2=0; DIG3=1; DIG4=1; TempData[1]=0x88; // \"r\" TempData[2]=0x88; // \"r TempData[3]=0xff; // } 21 DataPort=TempData[1]; //取 } } } i++; if(i==5) i=0; 显示数据,段码1 Delay(2); DataPort=0xff; //清空数 据,防止有交替重影 DIG1=1; DIG2=1; DIG3=0; DIG4=1; Display(); DataPort=TempData[2]; //取 TH0=(65536-50000)/256; 显示数据,段码2 DataPort=0xff; //清空数 Delay(2); //重新赋值 50ms 关 } void Init_Timer1(void) { TMOD |= 0x10; TH1=(65536-40000)/256; TL1=(65536-40000)%256; EA=1; //总中断打开 ET1=1; //定时器中断打开 //TR1=1; //定时器开关 } TL0=(65536-50000)%256; delay_count1++; if(delay_count1==100) { P23=0; delay_count1=0; TR0=0; //定时器 据,防止有交替重影 DIG1=1; DIG2=1; DIG3=1; DIG4=0; DataPort=TempData[3]; //取 显示数据,段码3 } void Init_Timer0(void) { TMOD |= 0x01; Delay(2); DIG1=1; DIG2=1; DIG3=1; DIG4=1; 打开 } void Timer1_isr(void) interrupt 3 using 1 { TH1=(65536-40000)/256; //初 TH0=(65536-50000)/256; //重新赋值 50ms 开 断打开 } void Timer0_isr(void) interrupt 1 using 1 { 22 TL0=(65536-50000)%256; EA=1; //总中断打 ET0=1; //定时器中值40ms TL1=(65536-40000)%256; delay_count2++; if(delay_count2==100) { P30=1; delay_count2=0; TR1=0; //定时器 KeyPort=l_code; } } unsigned char KeyScan(void) { unsigned char l_code,h_code; KeyPort=0xf0; if((KeyPort&0xf0)!=0xf0) { Delay(5); if((KeyPort&0xf0)!=0xf0) { key_flag=1; l_code=0xfe; while((l_code&0x10)!=0) { P23=0; if((P2&0xf0)!=0xf0) { h_code=(KeyPort&0xf0)|0x0f; while((KeyPort&0xf0)!=0xf0); return((~l_code)+(~h_code)); } else l_code=(l_code<<1)|0x01; } } return(0); } } 23 关 原理图 PCB版图 附录二: 24 三维PCB版图 25 因篇幅问题不能全部显示,请点此查看更多更全内容