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