2014级测控技术与仪器专业综合课程设计
摘 要20世纪末,电子技术飞速发展,现代电子产品几乎渗透到社会各个领域,从而有力地推动了社会生产力的发展和社会信息化程度的提高,同时也进一步提高了现代电子产品性能,加快了电子产品的更新换代节奏。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人们忘记当时时间。
本系统是基于AT89C51单片机的具有准点报时、调时、以及可设闹钟功能的简单数字时钟系统的设计。以AT89C51为核心控制器,系统分为时钟模块、显示模块、按键模块及闹钟模块。系统以单片机内部定时器作为时钟模块的主要控制模块,通过频率计数实现计时功能,采用了8位数码管来显示时间,独立按键做为时间调时以及闹钟设置按键,蜂鸣器作为报时闹钟系统。通过Keil软件C语言程序的编写、编译、调试以及硬件单片机的连接,实现了时间显示(24小时制)、闹钟设置、时间调试以及准点报时,可复位的功能。通过运行该电路程序,得出该系统符合实验设计要求。
ABSTRACT
The end of the 20th century, obtained the rapid development of electronic technology, under the push, the modern electronic products almost permeated all fields of society, vigorously promoted the development of social productivity and the enhancement of social information degree, but also makes the modern electronic products performance further improve, product update rhythm also more faster. Time is always precious to people, and the busyness and complexity of the work make people forget the time.
The system is based on the design of a simple digital clock system with the time, timing and alarm function of the AT89C51 single chip microcomputer. With AT89C51 as the core controller, the system is divided into clock module, display module, key module and alarm module. System with the single chip processor as the main control module of the clock module, internal timer timing functions are implemented by frequency count, used the eight digital tube to display the time, separate button as time and alarm when the regulation of key, buzzer as the time clock system. C language program written by Keil software, compilation, debugging and single chip microcomputer hardware connection, realize the time display (24-hour), setting the alarm clock, time debugging and tell the time on time, can be reset function. By running the circuit program, the system complies with the experimental design requirements.
目 录
摘 要 I
Abstract II
1 设计任务书
1.1 涉及专业课程 (1)
1.2 设计任务 (1)
1.3 设计目标 (1)
1.4 本设计的主要功能 (2)
1.5 设计意义 (2)
1.6 本章小结 (2)
2 设计论证及计划
2.1 方案论证 (3)
2.2 设计原理 (3)
2.3 设计规划 (8)
2.4 本章小结 (9)
3 硬件设计
3.1 显示模块 (10)
3.2 按键模块 (10)
3.3 蜂鸣器模块 (11)
3.4 核心控制及时间控制模块 (12)
3.5 本章小结 (13)
4 软件及编程分析
4.1 主程序流程图 (14)
4.2 软件编程及分析 (14)
4.3 实验结果图 (16)
4.4 本章小结 (17)
5 总结与展望
5.1 课程设计总结 (18)
5.2 工作展望 (18)
附 录A 设计程序 (18)
附 录 B 设计参考资料 (29)
1 设计任务书本设计主要设计的专业课程有:
1、单片机原理及应用
通过软件程序的编程,硬件电路的调试,实现简单时钟系统的设定,使得该系统具有正常走时,能够正确的显示时、分、秒;能够进行调时,修改当前的时间,并且能够设定闹钟,使闹钟能够定时响。首先是时间的调试:若要进行正常的时间调试需要有进入时间的调时试状态按键以及调试是加或者是减的按键,即每个状态需要3个按键,共有时、分、秒三个状态,这样就一共需要9个按键,硬件设计需要的按键增多,且加大了软件编程复杂度。为解决以上问题,可通过同一个按键来控制定时器的走与停,以及通过按键次数来控制所进入的调试状态是时、分还是秒。当调试进入某一状态时,需要分别通过两个按键来控制时间的加与减,而此时的加与减的按键相当于是局部变量,可以在三个状态中分别使用,这样一共就只需要3个按键,大大节省了硬件用量并且简化了软件编程。针对此解决方案,设3个按键分别为key1、key2和key3,设计为当按键key1被按下时,停止走时,进入调时状态:当key1被按下1次,进行秒的调整;当key1被按下2次,进行分的调整;当key1被按下3次,进行时的调整;当key1被按下4次,停止调时,继续进行走时。在key1被按下4次以下的情况下,若按下key2键,则进行时间加,若按下key3,则进行时间减。其次是闹钟设定:基于时间调试的设置思路,同样将进入闹钟状态以及闹钟设定的按键分开,考虑到此时闹钟设置时,数码管显示问题以及定时器走时问题,故将进入闹钟的设定状态和时设定、分设定的按键分开,而分和时的设定又都需要时间的加和减,即各需要两个按键,再加上进入闹钟设定状态的一个按键,共需要5个按键来实现闹钟设定。针对此方案,设5个按键分别为key0、key4、key5、key6和key7,其中key0为进入闹钟状态按键,key4和key6分别为分钟设定的加和减的按键,key5和key7分别为时设定的加和减的按键。依照思路可设定为当 key0一直被按住的情况下,此时进入闹钟设定状态,但是定时器仍然在工作。在key0一直被按住的情况下,若key4或key5被按下,则分别进行分和时的累加状态;若key6和key7被按下,则分别进行分和时的减状态,当放开key0时,继续进行走时。若想再次进行闹钟的设定,重复上述的步骤,不过当再次按下按键 key0时,则显示上次设置的闹钟时间。
结合设计任务,本课程设计要求的设计目标如下:
一、完成目标
通过Keil软件C语言程序的编写、编译、调试以及硬件单片机的连接,实现时间显示(24小时制)、闹钟设置、时间调试以及准点报时,可复位的功能,并运行该电路程序,验证设计的系统是否符合实验设计要求。
应用知识: I/O 口应用、数码显示、定时 /计数器。
基本要求:设计一时钟系统,系统具有时钟功能,能准确显示时、分、秒。系统还应具有以下功能:
校正功能:能够修改当前的时间。
扩展部分:具备设定闹钟和定时闹钟响功能。
单片机模块最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,所以得到了广泛的使用。
数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭,车站,码头,办公室等公共场所,成为人们日常生活中不可少的必须品。基于51单片的电子时钟,外围电路简单易于实现,性价比高,是实现电子时钟的不错选择。研究电子钟及扩大其应用,有着非常现实的意义。
给出设计电子时钟的功能需求以及所需的技术指标,通过Keil软件C语言程序的编写、编译、调试以及硬件单片机的连接来实现任务。
2 设计论证及计划本章将会结合单片机对核心控制模块、显示模块、按键模块进行方案的选择。
2.1方案论证
(1)核心控制模块
方案一:采用FPGA作为核心控制模块。FPGA具有强大的资源,使用方便灵活,易于进行功能扩展,特别是结合了EDA,可以达到很高的效率。此方案虽然逻辑相对较为简单,但由于FPGA的价格过高且比较难掌握,对于设计数字时钟考虑成本和算法问题,本设计将不采用此方案。
方案二:采用AT89C51作为核心控制模块。此方案中AT89C51单片机的入门学习相对交容易,易于理解,外围电路比较简单,成本比较低。基于AT89C51单片机的系统控制灵活,能很好地满足本课题的基本要求和扩展要求,因此选用该方案。
方案一:采用LCD1602液晶显示屏。液晶显示屏耗电量低、体积小、辐射低。但其使用时受温度范围限制,且因是反光式的,在外界光线很明亮的情况下很容易看不清楚。数码管是 LED发光效果, 液晶是分子偏转引起的暗影效果,显示不是很清晰。
方案二:采用LED数码管显示。数码管在低电压小电流的驱动下就能够发光,发光响应时间短,高频性好,单色性好,亮度高,显示相对而言比较清晰。而且体积小,重量轻,抗冲击性能好,寿命长,成本低。
方案一:采用矩阵按键。矩阵按键需要通过扫描控制和译码,设计时需要有数值移位寄存器。
方案二:采用独立按键。单片机仿真板上有专用独立按键,连接方便,使用简单。且易于软件编程,适合本系统的设计。
2.2设计原理
本系统数字时钟设计原理主要利用AT89C51单片机 ,由单片机的P0口控制数码管的位显示,P2口控制数码管的段显示,P3口与按键相接用于时间校正以及闹钟设定。设计的主要方面有计时原理,中断及定时器原理以及调时方式,按键的消抖。
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度, 将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用 24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。在本设计中,24小时时钟显示、秒表的设计和显示都是依靠单片机中的定时器完成。定时器T0产生1s的中断,在中断程序中完成每一秒数字的变化,并在主程序中动态显示数字。
典型的8051单片机有5个中断源(外部中断0、1,内部定时器中断0、1,串口中断),具有两个中断优先级。与中断系统有关的特殊功能寄存器有中断允许寄存器IE、中断优先级控制寄存器IP、中断控制寄存器TCON和SCON中有关位。MCS-51单片机基本的中断系统结构如下图所示:
图2-1 MCS-51的中断系统
MCS-51的CPU对中断源的开放或屏蔽,即每一个中断源是否被允许中断,是由内部的中断允许寄存器IE(地址A8H)控制的。IE中具体各位的意义如下,EA:CPU的中断开放标志。EA=1,CPU开放中断;EA=0,CPU屏蔽所有的中断申请。EX0:外部中断0中断允许位。 EX0=1,允许中断:EX0=0,禁止中断。ET0:T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。ET1:定时器/计数器T1的溢出中断允许位。ET1=1,允许 T1中断;ET1=0禁止T1中断。ES:串行口中断允许位。ES=1,允许串行口中断;ES=0禁止串行口中。
中断优先级管理寄存器IP(地址8BH):MCS-51有两个中断优先级,一个正在被执行的低优先级中断服务能被高优先级中断所中断,但不能被另一个同级的或低优先级中断源所中断。CPU的查询顺序是:外部中断0;定时器T0中断;外部中断1;定时器T1中断;串行口中断(先外部后内部,先0后1)
中断服务函数的格式如下所示:
void 函数名 (void) interrupt n using m
{ 函数体语句 }
其中,interrupt和using是为编写C51中断服务程序而引入的关键字,interrupt表示该函数是一个中断服务函数,interrupt后的整数n表示该中断服务函数是对应哪一个中断源。每个中断源都有系统指定的中断编号:
表2-1 中断编号表
51单片机有三个内部中断,16位定时器/计数器T0、T1的溢出中断源和串行口的发送 /接收中断。对T0和T1中断,当定时计数回 ,0?溢出时,由硬件自动置位TCON中的TF0或 TF1中断请求标志位。定时/计数器实际上是一个加1计数器,它可以工作于定时方式,也可以工作于计数方式。两种工作方式实际上都是对脉冲计数,只不过所计脉冲来源不同。定时器的脉冲是由51单片机的内振荡器经过12分频后产生的,故当单片工作于定时状态时,计数脉冲的最高频率为f=fosc/12.
51单片机的寄存器有方式控制寄存器TMOD;加法计数寄存器TH0、TH1(高八位),TL0 、TL1(低八位);定时/计数到标志TF0、TF1(中断控制寄存器TCON);定时/计数器启停控位TR0、TR1(TCON);定时/计数器中断允许位ET0、ET1(中断允许寄存IE);定时/计数器中断优先级控制位PT0、PT1(中断优IP)。在定时器工作前,必须将控制命令写入定时器的控制寄存器,即进行初始化。TMOD的低四位为T0的方式字,高四位为T1的方式字。TMOD不能位寻址,必须整体赋值。TMOD各位的含义如下:
- 工作方式选择位M1,M0 :M1,M0 的状态决定定时器的工作方式:
表2-2 工作方式选择表
- 定时和计数方式选择位C/T。当C/T=1时为计数方式;C/T=0时为定时方式。
- 门控位GATE。GATE与TR0、TR1配合决定定时/计数器的启停。当GATE=0 时,软启动。定时器/计数器的启停只受定时器运行控制位(TR0、TR1)的控制。当GATE=1 时,软硬启动。定时器/计数器的启停除受TR0、TR1控制外,还受外部引脚(INT0、INT1)输入电平的控制(为高)。即TR0和INT0控制T0的运行,TR1和INT1控制T1的运行。
MCS-51的定时器有方式0、方式1、方式2 和方式3,这4种工作方式。以方式1为例,当M1M0=01时,定时/计数器工作在方式1。MCS-51单片机定时计数器在方式1时的工作原理如图所示:
图2-2 计数/定时器
当C/T=0时,工作在定时器状态,由振荡器经12分频后输入,否则由T1端输入。在定时时,对工作频率的12分频进行计数,先记入TL后记入TH,直到溢出为止,根据TL、TH内的初值不同可以定出不同的时间;在计数工作方式时,对T0(T1)引脚的输入脉冲进行计数,将计数值记入TL、TH。当定时/计数溢出时,会引起中断。计数初值与定时时间的关系为:T=12×(T_all–a)/fosc定时间隔为T,计数初值为a。所以有计数初值a=–T×fosc/12,THx=a/256,TLx=a%256。定时器均有一个最大定时时间,对于长时间的定时需要,可以将定时间隔为固定的较小时间,通过另设一全局变量ah1用于计数,累加固定的较小定时时间来进行。
使用MCS-51单片机的定时/计数器的步骤:
- 设定TMOD,确定工作状态(用作定时器/计数器)、工作方式、控制方式。
- 设置合适的计数初值,以产生期望的定时间隔。由于定时/计数器在方式0、方式1和方式2时的最大计数间隔取决于使用的晶振频率fosc,如下表所示,当需要的定时间隔较大时,要采用适当的方法,即将定时间隔分段处理。
- 确定定时/计数器工作于查询方式还是中断方式,若工作于中断方式,则在初始化时开放定时/计数器的中断及总中断:ET0=1,EA=1。
中断服务函数:
void T0_srv (void) interrupt 1 using 1
{ TL0 = a % 256 ;
TH0 = a / 256 ;
中断服务程序段 }
时间调整有多种方式:一、可以直接进入相关状态进行有关操作,二、将调整分两步,先进入状态,然后执行操作,这两步分别由两个键控制。 方式一比较直接,设计思想也比较简单。但是,这种方式存在操作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度。当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。如果采用二的方式,就不会出现这种情况。因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达 256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整。以上两种方式的实现都可以采用查询和中断的方式。两种方式必须注意的问题是两者进行相关操作的过程不能太长否则会影响显示的扫描。基于本系统的设置,将时间调整分为状态调整和数据调整两部分,每次进入中断只执行一次操作,然后返回,这样,就不必让中断处于调整等待状态,可以使中断的耗时很小。将定时器中断的优先级设置为最高级,那么中断的方式和查询的方式一样不会影响到时钟的记数。
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。按键消抖的方式有硬件和软件消抖,本系统采用软件消抖。软件消抖有定时器定时,和利用延时子程序的方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。
2.3设计规划
课程设计总图规划如图2-3所示:
图2-3 课程设计规划
- 对电子时钟设计的总体进行分析和规划。
- 根据流程图设计硬件原理图,然后焊接电路板。
- 根据原理图各个端口的设置,规划电子时钟程序,编写程序。
- 将程序烧进芯片,再将芯片与电路板连接,调试。
- 观察实验现象,记录数据,分析得出结果。
2.4本章小结
确定了模块的选择,明白了设计的计时原理,中断及定时器原理以及调时方式、按键的消抖。
3 硬件设计硬件电路的设计包括核心时间控制模块、显示模块、按键模块,以及闹钟的蜂鸣器模块。
3.1显示模块
通过外部连线将P0线接到J16,使得P0口控制数码管的位显示,将P2线接到J12,使得P2口控制数码管的段显示。
数码管显示原理图如下所示:
图3-1 数码管显示原理图
3.2按键模块
使用8路独立按键,通过改变排线连接,可以实现按钮的普通输入和中断输入通过外部接线,将P3口与JP5相连,实现由P3口控制时间调试和闹钟设定的按钮连接。
按键原理图如图3-2所示:
图3-2按键原理图
3.3蜂鸣器模块
通过单片机的内部设定,将 P1.5口作为蜂鸣器的控制端口,通过跳帽连接J8口,使得蜂鸣器可以工作,再由软件程序编写,使得蜂鸣器能够在特定的时刻响。
蜂鸣器原理图如图3-3所示:
图3-3 蜂鸣器原理图
3.4核心控制以及时间控制模块
首先RST保持两个机器周期以上的高电平时自动复位1、上电复位:上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。2、手动复位:首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被短路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,正常工作。复位电路图如图3-4所示:
单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周期包括12个时钟周期。如果一个单片机选择了12MHz晶振,它的时钟周期是1/12us,它的一个机器周期是12&TImes;(1/12)us,也就是1us。晶振连接图如图3-5所示:
P0口作为 I/O 口输出的时候时 输出低电平为 0 输出高电平为高组态(并非 5V,相当于悬空状态)。也就是说 P0 口不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻(一电阻连接到 VCC),由电源通过这个上拉电阻给负载提供电流。口外接上拉电阻如图3-6所示:
图3-4 复位电路 图3-5 晶振连接
图3-6 口外接上拉电阻图
单片机的核心控制模块由储存器结构、中断资源、IO接口等组成。如图3-7所示:
图3-7 单片机核心控制模块原理图
3.5本章小结
给出时间控制模块、显示模块、按键模块,以及闹钟的蜂鸣器模块,保证设计的进一步进行。
4软件及编程分析4.1主程序流程图
- 在4位数码管上显示当前时间,计时格式为“时时分分”。
- 由LED闪烁做秒显示。
- 利用按键可以对时间及闹钟进行设置,并可显示闹铃时间。当闹铃时间到蜂鸣器发出声响,按停止键可使闹铃声停止。
图4-1所示为程序流程图:
图4-1 程序设计流程图
4.2软件编程及分析
本系统的编程环境为keil uvision2,依照流程图编写程序并进行程序的编译,烧录软件使用PZISP将程序烧录进硬件中,软件得编译结果及烧录结果分别如图4-2和4-3所示:
图4-2 编译结果图
图4-3 烧录结果图
编写具体程序见附录所示,以下给出部分主要程序的分析说明:
(1)按键消抖
按键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms ,通过delay函数的延时作用,在按键被按下时,延时一段时间,确定按键是否真的被按下,如果是就执行程序,达到了消除按键的抖动的目的,程序如下:
if(key1==0) //按键被按下
{ delay(10); //延时
if(key1==0) //判断按键是否被按下
{
while(!key1); //进一步确认按键被按下
} }
(2)初始化程序
开中断并选择定时器:
void init()
{
TMOD=0x01; //选择定时器工作方式为 1
TH0=(65536-50000)/256; //写入计数初值,设定 t=50ms
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //允许定时器中断
TR0=1; //启动定时器
}
4.3实验结果图
硬件的位选、段选,以及按键的连线如图4-4和4-5所示:
图4-4 正常走时图
当按下按键0,并且一直按着时,进入闹钟的设定状态,开始的时候显示为 00—00—00
图4-5 进入闹钟状态图
4.4本章小结
完成了程序的编辑与烧录,我体会到了自己所学的知识是远远不够,需要学习的知识还有很多。同时此系统的设计提高了我的动手能力,为将来的学习和工作奠定了良好的基础。
5总结与展望5.1课程设计总结
课程设计主要完成内容如下:
设计了时钟系统,系统具有时钟功能,能准确显示时、分、秒。同时具备设定闹钟和定时闹钟响功能,实现了时间显示(24小时制)、闹钟设置、时间调试以及准点报时,可复位的功能,并运行了该电路的程序。
5.2工作展望
从任务要求出发,分析如何实现功能,通过这次课程设计使我对单片机有了深入的认识,特别是对定时中断方式有了直观的认识,设计时钟我使用单片机内部定时/计数器,通过设置定时器产生精确的定时中断,达到计时的目的。
这个时钟功能比较单一,还可以进一步的加入功能,在以后的设计中,逐渐增加其他的功能,比如说加温度检测,加秒表和显示日期和星期等来进一步完善这个时钟。
附 录 A 设计程序
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code
- table[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- sbit Bueer=P1^5;
- sbit key1=P3^1;
- sbit key2=P3^2;
- sbit key3=P3^3;
- sbit key4=P3^4;
- sbit key5=P3^5;
- sbit key6=P3^6;
- sbit key7=P3^7;
- sbit key0=P3^0;
- uchar aa,h,m,s,n,i,sec,min,hour
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display()
- {
- if(key0==1)
- {
- P2=0xfe;
- P0=table[s%10];
- delay(1);
- P2=0xfd;
- P0=table[s/10];
- delay(1);
- P2=0xfb;
- P0=0x40;
- delay(1);
- P2=0xf7;
- P0=table[m%10];
- delay(1);
- P2=0xef;
- P0=table[m/10];
- delay(1);
- P2=0xdf;
- P0=0x40;
- delay(1);
- P2=0xbf;
- P0=table[h%10];
- delay(1);
- P2=0x7f;
- P0=table[h/10];
- delay(1);
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- aa++;
- if(aa==20)
- {
- aa=0;
- s++;
- if(s==60)
- {
- s=0;
- m++;
- if(m==60)
- {
- m=0;
- h++;
- if(h==24)
- h=0;
- }
- }
- }
- }
- void keyscan()
- {
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- while(!key1);
- n++;
- TR0=0;
- if(n==1)
- {
- P2=0xfe;
- P0=table[s%10];
- delay(1);
- P2=0xfd;
- P0=table[s/10]
- delay(1);
- }
- if(n==2)
- {
- P2=0xf7;
- P0=table[m%10];
- delay(1);
- P2=0xef;
- P0=table[m/10];
- Delay(1);
- }
- if(n==3)
- {
- P2=0xbf;
- P0=table[h%10];
- delay(1); P2=0x7f;
- P0=table[h/10]; delay(1);
- }
- if(n==4)
- {
- TR0=1; n=0; } } }
- if(n!=0)
- {
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- while(!key2);
- if(n==1)
- {
- s++;
- if(s==60)
- s=0;
- }
- if(n==2)
- {
- m++;
- if(m==60)
- m=0;
- }
- if(n==3)
- {
- h++;
- if(h==24)
- h=0; } } }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- while(!key3);
- if(n==1)
- {
- if(s==0)
- s=60;
- s--;
- }
- if(n==2)
- {
- if(m==0)
- m=60;
- m--;
- }
- if(n==3)
- {
- if(h==0)
- h=24;
- h--; } } } } }
- void keyscan2()
- {
- if(key0==0)
- {
- P2=0xfe;
- P0=table[sec%10];
- delay(1);
- P2=0xfd;
- P0=table[sec/10];
- delay(1);
- P2=0xfb;
- P0=0x40;
- delay(1);
- P2=0xf7;
- P0=table[min%10];
- delay(1);
- P2=0xef;
- P0=table[min/10];
- delay(1);
- P2=0xdf;
- P0=0x40;
- delay(1);
- P2=0xbf;
- P0=table[hour%10];
- delay(1);
- P2=0x7f;
- P0=table[hour/10];
- delay(1);
- }
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- while(!key4);
- {
- min++;
- if(min==60)
- min=0;
- }
- }
- }
- if(key5==0)
- {
- delay(10);
- if(key5==0)
- {
- while(!key5)
- {
- hour++;
- if(hour==24)
- hour=0;
- }
- }
- }
- if(key6==0)
- {
- delay(10);
- if(key6==0)
- {
- while(!key6);
- {
- if(min==0)
- min=60;
- min--;
- }
- }
- }
- if(key7==0)
- {
- delay(10);
- if(key7==0)
- {
- while(!key7);
- {
- if(hour==0)
- hour=24;
- hour--;
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整的Word格式文档51黑下载地址:
电子时钟课程设计.doc
(2.65 MB, 下载次数: 16)