资源描述
河南理工大学本科课程设计报告
河南理工大学
《单片机应用与仿真训练》设计报告
四路定时控制器
姓 名: 张浩
学 号: 311208000228
专业班级: 电仪12-1
指导老师: 荆鹏辉
所在学院; 电气工程与自动化学院
2014年 1月 11日
摘要
本设计是基于STC10F08XE单片机的多功能电子定时器硬件结构和软硬件设计方法。系统以STC10F08XE单片机为控制器通过对信息的分析与处理来控制电磁继电器实现四个道路的通断时间。可同时分别对四个通道设置多个时间段的定时通断,实现不同的控制效果。系统可以精确显示时间。整个系统采用单一5V电源,供电简单。利用数码管显示数据,显示清晰直观。通过单片机自身所带定时器进行计时,更稳定可靠。能通过按键任意设置某回路某时间段的开关状态和对显示时间的调节。通过对电磁继电器控制达到了利用弱电控制强电的效果。
本设计硬件电路总体可以分为四个单元:单片机最小系统单元,指继电器控制电路单元,按键电路单元,显示单元。软件系统可以大致分为四个大的模块为:初始化模块,按键扫描模块,定时模块,数码管显示模块。其中,键盘扫描和数码管显示采用查询方式。通过各个模块的协调工作构成了最终的软件系统。
此四路定时器整个系统通过软硬件的协调工作,具有读取方便、显示直观、功能多样、电路简洁、成本低廉、操作安全等诸多优点,具有广阔的市场前景,尤其在智能化家用电器和办公自动化设备等领域。
关键字:单片机;四路定时器;数码管。
目录
1 概述 4
1.1 制作背景目的 4
1.2 功能要求 4
1.3 系统原理概述 4
2 系统总体方案及硬件设计 6
2.1 系统总体方案设计 6
2.2 STC10F08XE单片机介绍 6
2.3 矩阵键盘电路介绍 9
2.4 数码管模块介绍 10
2.5 继电器模块介绍 11
3 软件设计 12
3.1 软件系统整体方案 12
3.2 定时器技术模块 13
3.3 键盘扫描模块 14
3.4 数码管显示模块 15
4 Proteus软件仿真 16
4. Proteus仿真 16
5 课程设计体会 17
5.1 方案特点 17
5.2 心得体会 17
参考文献 18
附1 源程序代码 19
附2 系统原理图 33
附3 系统说明书 34
1 概述
1.1 制作背景目的
本文主要阐述了四路定时器的制作方法,功能原理是单片机控制技术的一个具体应用。通过STC10F08XE单片机实现对不同电路通道开关状态的任意控制。
在工矿企业以及生产生活中很多场合都需要做到电能的不连续供给,在以往的电能开关状态控制中大多是需要人工来完成,而很多时候很难及时的达到所需要的工作状态。本设计正是以此为背景,以节能环保,方便快捷为目的,利用单片机的可编程控制控功能来实现对电能,电力的优化配置。克服了以往电路的需要人工控制开关状态的弊端。而且采用了数码管显示出当前时间等生活中较为关心的坏境条件,使用方便,操作简单。通过LED灯模块显示工作通路。
1.2 功能要求
基本功能:
1、主要应用于定时控制四个回路的电源通断。
2、以当前时间为基准,以24小时为周期,可以任意设定哪个回路于某时刻开,到某时刻关。如可以设置第一个回路在8:30-11:30开,14:30-18:00开,其他时间段为关。
3、能通过按键任意设置某回路某时间段的开关状态,利用数码管显示要直接明了。
4、制作操作说明书给于说明操作步骤,并以产品研发的思路制作,面向用户设计人机交互,力求做到功能强大,操作简单。
1.3 系统原理概述
本系统采用STC10F08XE单片机为控制核心,基于STC10F08XE单片机所具备的的计数功能,达到实时时钟的制作。并通过四位共阴极数码管将时间直观的显示出来。可以利用按键输入功能对显示时间进行调整。
该系统设置了四个定时通道,每个定时通道都是相互独立的。四个定时通道可以分别设置多个时间段的开关状态,每个通道都可以通过I/O口输出信号对电磁继电器进行控制,通过控制电磁继电器的通断进一步控制继电器所连接的其他电路的开关状态。充分利用了弱电控制强电的效果。还可以通过LED显示出该通道的工作状态。
本系统的人机交互是有输入设备—矩阵键盘来完成的。矩阵键盘具有节省单片机I/O等优点,可以利用键盘更改当前时间,和设定用户所期望的任意通道的工作时间以及工作状态。
2 系统总体方案及硬件设计
2.1 系统总体方案设计
该系统有电源电路、晶振电路、下载电路、单片机、数码管显示电路和键盘控制电路组成。控制核心采用当前较新颖好用的基于51内核的STC10F08XE单片机,该单片机功能强大,运行速度比普通单片机高,且价格低廉,容易购买。晶振电路采用11.0592MHz晶体振荡器,电源采用5V电源供电,显示模块采用四位共阴极数码管显示系统的各项信息,并利用发管二极管辅助显示,输入模块利用3*2矩阵键盘,四路定时器控制系统总体方案图如图2-1所示.
图2-1 四路定时器控制系统总体方案图
2.2 STC10F08XE单片机介绍
本系统采用的STC10 单片机为40引脚双列直插式封装。stc10xx系列单片机是宏晶科技设计的单时钟/机器周期(1t)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成高可靠复位电路,针对高速通信,智能控制,强干扰场合。
STC10xx系列单片机的定时器0/定时器1/串行口与传统8051兼容,增加了独立波特率发生器,省去了定时器2。传统8051的111条指令执行速度全面提速,最快的指令快24倍,最慢的指令快3倍。其引脚排列和逻辑符号如图2-2 所示。
各引脚功能简单介绍如下:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 图
门电流。P1口管脚写入“1”后,电位被 2-2引脚排列和逻辑符号
内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为STC10的一些特殊功能口:P3.0 RXD(串行输口);P3.1TXD(串行输出口) ;P3.2 INT0(外部中断0);P3.3 INT1(外部中断1) ;P3.4 T0(定时器0外部输入);P3.5 T1(定时器1外部输入);P3.6 WR (外部数据存储器写选通);P3.7 RD (外部数据存储器读选通)。同时P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE / PROG :当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
EA/VPP:当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
stc10xx单片机最小系统:
整个最小系统电路制作很简单,只需要一块单片机,一个晶振,三个电容,一个电阻即可。其中时钟晶振电路模块为单片机提供特定的时钟周期,以备单片机工作使用。单片机内部有一个用于构成振荡器的高增益反相放大器的输入与输出端分别是引脚XTAL1和XTAL2,在两引脚上外接时钟源即可构成时钟电路,系统外部采用11.0592MHz晶振。
系统的复位电路在这里采用的是电容充放电进行复位,其具体电路连接线如图2-4 所示:
图2-3 最小系统原理图
2.3 矩阵键盘电路介绍
系统采用3×2矩阵键盘输入定时时间,也可以通过键盘查看当前温度和设定四个通道某时间段的开关状态。其原理图如图2-7 所示:
图2-7 矩阵键盘原理图
采用矩阵键盘可以减少I/O口的占用,在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。利用行列扫描法读取按键信息是常用的按键识别方法。
2.4 数码管模块介绍
四位七段数码管四个数码显示管的a~g 及小数点dp 管脚并联在一起,作为数码管数据输入端;分别引出各个数码管的阴极A1~A4。只要在A1~A4 管脚上轮流加低电平其频率大于40Hz,可实现四个数码管同时被点亮的视觉效果。在点亮不同数码管的同时输入不同的数据,即可在数码管上同时显示四位不同的数字。
系统采用动态扫描方式。动态扫描方法是用其接口电路把所有显示器的8个笔画字段(a~g和dp)同名端连在一起,而每一个显示器的公共极COM各自独立接受I/O线控制。CPU向字段输出端口输出字型码时,所有显示器接受相同的字型码,但究竟使那一位则由I/O线决定。动态扫描用分时的方法轮流控制每个显示器的COM端,使每个显示器轮流电亮。在轮流点亮过程中,每位显示器的点亮时间极为短暂,但由于人的视觉暂留现象及发光二极管的余辉效应,给人的印象就是一组稳定的显示数据。动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。其数码管管脚图如图2-8 所示:
图2-8 数码管管脚图
2.5 继电器模块介绍
电磁继电器是有触点电继电器是有触点电继电器的一种。它是利用电磁效应实现电路开、关控制作用的原件,广泛应用在电子设备、仪器仪表及自动化设备中。
本系统采用单片机控制与三极管相连的I/O口的输出电平,接通或关闭相应的三极管,达到使继电器吸合或断开。从而起到以弱控强的目的。在各种自动设备中,都要求用一个低电压电路提控制一个高电压的电器电路。这样不仅可以为电子线路和电器电路提供良好的电隔离,还可以保护电子电路和人员安全。在这里三极管起到了放大电流,提高驱动能力的作用。当单片机控制端给三极管基极一个低电平时,三极管导通,线圈有电流流过,继电器吸和;当单片机控制端给三极管基极一个高电平时,三极管截止,线圈无电流流过,继电器断开。继电器的驱动原理图如图2-9 所示:
图2-9 继电器的驱动原理图
在继电器线圈两端反接一个二极管。这个二极管非常重要,当使用电磁继电器时必须连接。原因:线圈通电正常工作时,二极管对电路不起作用。当继电器线圈在断电的一瞬间会产生一个很强的反向电动势,在继电器线圈两端反向并联二极管就时用来消耗这个反向电动势的,通常这个二极管叫做消耗二极管,如果不加这个消耗二极管,反
向电动势会直接作用在驱动三极管上,很容易将三极管损坏。
11
河南理工大学本科课程设计报告
3 软件设计
3.1 软件系统整体方案
系统开始工作后在显示时钟,同时不停的执行键盘扫描程序,当监视到有按键按下时就立刻响应。当设置键按下时判断是时钟调整按键还是定时设定按键,当定时设定按键按下时,判断设置通道,LED显示设置的时间通道,数码管显示设置的时间,输入设置时间段后完成设置,回到显示时钟,当调节时钟按键按下时完成时钟调节恢复运行,当温度设置按键按下时,数码管显示温度。其系统整体原理框图如图3-1所示:
图3-1 系统整体流程原理框图
3.2 定时器技术模块
时钟采用单片机定时器1为模式一,即16位计算模式。在应用中,使GATE=0,从而由TRl的状态控制Tl的开闭:TRl=1,打开T1;TRl=0,关闭T1。在特殊的应用场合,例如利用定时器测量接于INT1引脚上的外部脉冲高电平的宽度时,可使GATE=1,TRl=1。当外部脉冲出现上升沿,亦即INT1由0变1电平时,启动T1定时,测量开始;一旦外部脉冲出现下降沿,亦即INT1由l变O时就关闭了T1。
定时器启动后,定时或计数脉冲加到TLl的低5位,从预先设置的初值(时间常数)开始不断增1。TL1计满后,向THl进位。当TL1和THl都计满之后,置位T1的定时器回零标志TFl,以此表明定时时间或计数次数已到,以供查询或在打开中断的条件下,可向CPU请求中断。如需进一步定时/计数,需用指令重置时间常数。其初始化程序如下:
void init()
{
TMOD=0X11; //设置定时器1为模式一,即16位计算模式
TH0=(65536-45872)/256; //给计数寄存器赋值,50毫秒时间
TL0=(65536-45872)%256;
EA=1; //开启总中断
ET1=1; //开启定时器1中断
// TR1=1; //启定定时器1
}
void timer() interrupt 1
{
TH0=(65536-45872)/256; //重新赋值50ms
TL0=(65536-45872)%256;
tt++;
}
3.3 键盘扫描模块
键盘扫描采用行扫描法又称为逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。因此我们就以“行扫描法”,其工作原理:
1. 判断键盘中有无键按下
将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与3根行线相交叉的2个按键之中;若所有列线均为高电平,则表示键盘中无键按下。
2. 判断闭合键所在的位置
在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平(即在置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。其实例程序如下:
void keyscan()
{uchar tem;
P3|=0x80; //h2=1 1000 0000
P3&=0xbf; //h1=0 1011 1111
P0|=0xe0; //l1=l2=l3=1 1110 0000
tem=P0; //
tem&=0xe0;
if(tem!=0xe0) //检测是否有按键按下
{delay_ms(5); //消抖
if(tem!=0xe0)
{switch(tem) //P0
{case 0xc0: key=1;break;
case 0xa0: key=2; break;
case 0x60: key=3;break;
case 0xe0:break; }
while(tem!=0xe0) //放手
{ tem=P0;
tem&=0xe0; } } }
3.4 数码管显示模块
数码管采用动态显示技术,显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。系统显示时工作在强上拉模式,可通过设置PXM1:PXM0的值选择该口的工作模式,PXM1,PXM0的定义如下:
0 0 准双向口(传统IO)
0 1 推挽输出(强上拉 ,电流可达20mA,尽量少用)
1 0 仅为输入(高阻)
1 1 开漏,如传统8051的P0口
4 Proteus软件仿真
4. Proteus仿真
按照总体电路图在仿真软件proteus7.8上一一选择芯片并进行连接,然后启动开关观察。一确保设计的正确性、可行性。并对电路进行分模块仿真实验,以确保系统的稳定性能,先利用protues进行仿真和电路参数的测定。观察数码管显示时间是否与理论值相近,并合理安排电路布局,为后期的电路布局的合理性、美观性打下基础。部分电路图如图4-1所示:
5 课程设计体会
5.1 方案特点
特点:本设计利用单片机为核心控制器件实现了四路定时器控制功能。能通过按键任意设置某回路某时间段的开关状态,并且利用数码管显示要直接明。
缺点:由于继电器等原因使电路体积较大,不易在小范围内使用
意见和展望:可改进电路结构减小体积,增加测功率等环节。
5.2 心得体会
通过这次课程设计,加强了我的动手、思考和解决问题的能力。同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。
通过次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时也要感谢所有教育过我的老师和周围的同学,在我遇到难题的时候给了我启发。是他们给我创造了良好的学习氛围。
总之,在这次的课程设计过程中,我收获了很多,即为我的以后学习设计有很大的帮助,也为将来的人生之路做好了一个很好的铺垫。
参考文献:
[1] 赵长德.微型计算机原理与接口技术[M].北京:机械工业出版社,
[2] 陈惠明,李燕华,王静滨.单片机控制手机的软硬件接口技术及应用[J] .微计算机信息,2005(1):139-141
[3] 苏平.单片机的原理与接口技术[M].北京:电子工业出版社,2006:1-113.
[4] 王忠民.微型计算机原理[M].西安:西安科技大学出版社,2003:15-55.
[5] 胡戴明.计算机组成原理[M].北京:经济科学出版社,2005:43-56.
[6] 纪宗南.单片机外围器件使用手册[M].北京:北京航空航天大学出版社,622-655.
[7] 周雪.模拟电子技术[M]西安: 西安电子科技大学出版社,2005:81-95.
[8] 左金生.电子与模拟电子技术[M].北京:电子工业出版社,2004:105-131.
[9] 尹勇.单片机开发环境μVision2的开发指南[M]. 北京:北京航空航天大学出版社,2004:173-199.
[10] 张斌武.单片机系统Proteus设计与仿真[M]. 北京:电子工业出版社,2005:52-89.
附1 源程序代码
#include"stc10f08xe.h"
#define uchar unsigned char
#define uint unsigned int
code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
code uchar tabled[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //带小数点共阴极数码管
code uchar LED3[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
code uchar LED2[]={0xff,0xef,0xcf,0x8f,0x0f,0xff};
charqian,bai,shi,ge,qian1,bai1,shi1,ge1,wq,wb,ws,wg,key,tt=0,set,setds,star;
char fen=0,tshi=0,hour,min;
uint time;
uchar time1a[4]={0};
uchar time2a[4]={0};
uchar time3a[6]={0};
uchar time4a[8]={0};
uchar time1b[10]={0};
uchar time2b[12]={0};
uchar time3b[14]={0};
uchar time4b[16]={0};
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit D4=P2^3;
void display();
void display2();
void dingshi();
void keyscan();
void relay();
void delay1ms() //@11.0592MHz
{ unsigned char i, j;
i = 11;
j = 190;
do{while (--j);
} while (--i);
}
void delay_ms(uint z)
{uchar i;
for(i=z;i>0;i--)
{
delay1ms();
}
}
////////初始化////////
void init()
{
TMOD=0X11; //设置定时器0为模式一,即16位计算模式
TH0=(65536-45872)/256; //给计数寄存器赋值,50毫秒时间
TL0=(65536-45872)%256;
EA=1; //开启总中断
ET0=1; //开启定时器0中断
// TR0=1; //启定定时器0
}
//////////键盘检测//////////
void keyscan()
{
uchar tem;
P3|=0x80; //h2=1 1000 0000
P3&=0xbf; //h1=0 1011 1111
P0|=0xe0; //l1=l2=l3=1 1110 0000
tem=P0; //
tem&=0xe0;
if(tem!=0xe0) //检测是否有按键按下
{ delay_ms(5); //消抖
if(tem!=0xe0)
{switch(tem) //P0
{case 0xc0: //key1
set++;
if(set&&(setds==0))TR0=0;
if(set==3){set=0;TR0=1;}
break;
case 0xa0: //key2
if(set==1&&setds==0) {fen++;} //调整时间+
if(set==2&&setds==0) {tshi++;}
if(set==1&&setds!=0) {min++;} //设定时间+
if(set==2&&setds!=0) {hour++;}
if(fen>59) {fen=0;tshi+=1;}
if(tshi>23) tshi=0;//qian=0;bai=0;
if(min>59) min=0;
if(hour>59) hour=0;//qian=0;bai=0;
break;
case 0x60: //key3
if((set==1)&&(setds==0)) {fen--;} //调整时间+
if((set==2)&&(setds==0)) {tshi--;}
if((set==1)&&(setds!=0)) {min--;} //设定时间+
if((set==2)&&(setds!=0)) {hour--;}
if(fen<0) fen=0;//shi=2;ge=0;
if(tshi<0) tshi=0;
if(min<0) min=0;
if(hour<60) hour=0;//qian=0;bai=0;
break;
case 0xe0:
break;
}
while(tem!=0xe0) //放手
{
tem=P0;
tem&=0xe0;
if(!setds) { display();} //时钟模式按键松手检测显示
else display2(); // 设定定时模式按键松手检测显示
}
}
}
P3|=0x40; //h1=1 0100 0000
P3&=0x7f; //h2=0 0111 1111
P0|=0xe0; //l1=l2=l3=1 1110 0000
tem=P0; //
tem&=0xe0; //检测是否有按键按下
if(tem!=0xe0)
{
delay_ms(5); //消抖
if(tem!=0xe0)
{switch(tem) //P0
{case 0xc0: //key4
setds++;
star=0; if(setds==5)
{setds=0;TR0=1;} //定时通道设置
P2=LED2[setds];
break;
case 0xa0: //key5 开始 结束设定
star++;
if(star==5)star=0;
P2=LED3[star];
Break;
case 0xe0: break;
} while(tem!=0xe0) //放手
{ tem=P0;
tem&=0xe0;
if(!setds){display();}
else display2();
} } } }
/////////定时判别//////////
void dingshi() //设定定时时间
{ if(star==1) //设定开始时间
{ switch(setds)
{ case 1: display2();
keyscan();
time1a[0]=hour*60+min;
break;
case 2: display2();
keyscan();
time2a[0]=hour*60+min;
break;
case 3: display2();
keyscan();
time3a[0]=hour*60+min;
break;
case 4: display2();
keyscan();
time4a[0]=hour*60+min;
break;
default :display();
break;
}
}
if(star==2) // 设定结束时间
{
switch(setds)
{
case 1: display2();
keyscan();
time1b[0]=hour*60+min;
break;
case 2: display2();
keyscan();
time2b[0]=hour*60+min;
break;
case 3: display2();
keyscan();
time3b[0]=hour*60+min;
break;
case 4: display2();
keyscan();
time4b[0]=hour*60+min;
break;
default :display();
break;
} }
if(star==3) //设定开始时间
{ switch(setds)
{ case 1: display2();
keyscan();
time1a[1]=hour*60+min;
break;
case 2: display2();
keyscan();
time2a[1]=hour*60+min;
break;
case 3: display2();
keyscan();
time3a[1]=hour*60+min;
break;
case 4: display2();
keyscan();
time4a[1]=hour*60+min;
break;
default :display();
break;
} }
if(star==4) // 设定结束时间
{ switch(setds)
{ case 1: display2();
keyscan();
time1b[1]=hour*60+min;
break;
case 2: display2();
keyscan();
time2b[1]=hour*60+min;
break;
case 3: display2();
keyscan();
time3b[1]=hour*60+min;
break;
case 4: display2();
keyscan();
time4b[1]=hour*60+min;
break;
default :display();
break;
} }
if(!setds){display();}
else display2();
}
///////数码管显示定时///////
void display2()
{ P1M1=0;
P1M0=0XFF; //强推挽
qian1=hour/10; //数码管位显示
bai1=hour%10;
shi1=min/10;
ge1=min%10;
P0=0xfe;
P1=table[qian1];
delay_ms(1);
P0=0xfd;
P1=table[bai1];
delay_ms(1);
P0=0xfb;
P1=table[shi1];
delay_ms(1);
P0=0xf7;
P1=table[ge1];
delay_ms(1);
}
////////////数码管显示////////////
void display()
{ P1M1=0;
P1M0=0XFF; //强推挽
qian=tshi/10; //数码管位显示
bai=tshi%10;
shi=fen/10;
ge=fen%10;
P0=0xfe;
P1=table[qian];
delay_ms(1);
P0=0xfd;
P1=table[bai];
delay_ms(1);
P0=0xfb;
P1=table[shi];
delay_ms(1);
P0=0xf7;
P1=table[ge];
delay_ms
展开阅读全文