《北京交通大学单片机原理及应用课程设计报告.doc》由会员分享,可在线阅读,更多相关《北京交通大学单片机原理及应用课程设计报告.doc(24页珍藏版)》请在三一办公上搜索。
1、单片机原理及应用课程设计报告基于单片机的电子时钟设计 摘要:单片机是集中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器T0/T1和多种接口于一体的微控制器。它体积小、成本低、功能强,特别适用于控制领域,已广泛应用于工业测控、计算机通信、各类仪器仪表和工业自动化中。传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。利用单片机设计的电子时钟则可以克服传统电子时钟的弊端。本设计拟实现的基本功能为时钟显示,加入定时及秒表拓展功能。关键词:单片机;电子时钟;闹钟;秒表; C语言一背景
2、:1.1数字电子钟的背景: 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义
3、还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。1.2数字电子钟的意义:数字钟是采用数字电路实现对时,分数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用
4、,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用有着非常现实的意义。1.3数字电子钟的应用: 数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方
5、便等优点,它还用于计时、自动报时及自动控制等各个领域。 二,时钟设计分析2.1总体设计构思针对要实现的功能,采用SST89E58RDA单片机进行设计,SST89E58RDA 单片机是一款低功耗,高性能CMOS8位单片机,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。SST89E58RDA既能够直接烧写程序也能与与keil连接进行在线实时连调,这是其他同款的单片机无法做到的,这样既减少了程序修改一次烧写一次的麻烦,节约了时间效率较高,也大大延长的单片机的使用寿命,做到了经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使
6、程序易于理解,又能便于添加各项功能。程序可分为按键扫描程序、闹钟的声音程序(闹钟程序)、时间显示程序、秒表显示程序,时间调整程序、闹钟调整程序、延时程序、时间比对程序、中断子程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法以及单片I/O口的定义与用法,否则,编程无从下手,更无法理解DJ51的设计思想,这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据
7、设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!22各部分模块工作原理:2.2.1存储空间:单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的
8、结构,即普林斯顿(Princeton)结构。(1) 程序存储空间:在逻辑上,内部程序存储程序存储空间可以分为内部程序存储器和外部程序存储器。(2)数据存储空间:1)片内数据存储器共有256B,它们被分为两部分:高128字节和低128字节。低128字节的内部数据存储器是真正的RAM区,可以被用来写入或读出数据。这一部分存储容量不是很大,但有很大的作用。它可以进一步被分为3部分,如图所示:图2.4 内部数据存储器低128字节在内部数据存储器低128字节中,地址从00H1FH的最低32个字节组成4组工作寄存器,每组有8个工作寄存器(R0,R1,R2R7)。在一个具体时刻,CPU只能使用其中的一组工作
9、寄存器。当前正在使用的工作寄存器组由位于高128字节的程序状态字寄存器(PSW)中第3位(RS0)和第4位(RS1)的数据决定。程序状态字寄存器中的数据可以通过编程来改变,这种功能为保护工作寄存器的内容提供了很大的方便。如果用户程序中不需要全部使用4组工作寄存器,那么剩下的工作寄存器所对应的内部数据存储器也可以作为通用数据存储器使用。在工作寄存器区上面,内部数据存储器的地址从20H2FH的16个字节范围内,既可以通过字节寻址的方式进入,也可以通过位寻址的方式进入,位地址范围从00H到7FH。内部数据存储器地址从30H7FH部分仅可以用作通用数据存储器。内部数据存储器的高128字节被称为特殊功能
10、寄存器(SFR)区。特殊功能寄存器被用作CPU和在片外围器件之间的接口,CPU通过向相应的特殊功能存储器写入数据实现控制对应的在片外围器件的工作,从相应的特殊功能存储器读出数据实现读取对应的在片外围器件的工作结果。2)片外数据存储空间可以被映射为数据存储器、扩展的输入/输出接口、模拟/数字转换器和数字/模拟转换器等。这些外围器件统一编址,所有外围器件的地址都占用数据存储空间的地址资源,因此CPU与片外外围器件进行数据交换时可以使用与访问外部数据存储器相同的指令。CPU通过向相应的外部数据存储器地址单元写入数据实现控制对应的片外外围器件的工作,从相应的外部数据存储器地址单元读出数据实现读取对应的
11、片外外围器件的工作结果。2.22数码管:数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共商。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即,所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。
12、数码管显示驱动方法可分为静态显示驱动和动态显示驱动两种:(1)静态显示驱动静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多。(2)动态显示驱动数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决
13、于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。如下图所示数码管内部结构图:2.2.3 :I/0口:(1)P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8T
14、TL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。 (2) P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。 (3) P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部
15、程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。 (4) P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL),。这是由于上拉的缘故。另外P3口还具有第二功能P3口的第二功能如下表所示:口管脚第二功能P3.0RXD(串行输入口)P3.1 TXD(串行输出口)P3.2INT0(外部中断0)P3.3INT1(外部中断1
16、)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)2.2.4 其他引脚:(1)RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。(2)EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。(3)VCC:电源。(4)GND:接地。三时钟的硬件设计3.1 整体设计此次
17、设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用4个共阴数码管分别显示,小时、分钟,和秒(LED流水灯显示),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。单片机采用SST89E58系列,这种单片机应用简单,使用方便,适合电子钟设计。电路的总体设计框架如下:单片机输入部分晶振和复位输出部分3.2 分块设计模块电路主要分为:输入部分、输出部分、复位和晶振电路。3.2.1 输入部分输入信号主要是各种模式选择和调整信号,由按键开关提供。以下为输入部分样例:在本实验中主要用用P3.2-P3.5口输入按键信号,分别实现时间/闹时的切换,时间
18、/闹时的小时调整,时间/闹时的分钟调整,秒表等功能3.2.2 输出部分本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,秒提示灯信号。本实验的数码管是共阳的,为了防止段选信号不能驱动数码管,故在P0口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入数码管用来显示时,分(秒表功能中实现秒的十位,个位,0.1位。0.01位),P1口接8个LED灯,用来显示秒如下图:闹铃由P2.4端输出,模块如下:3.2.3 晶振与复位电路本实验单片机时钟用内部时钟,模块如下:XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL
19、1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。SST89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
20、因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22F。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。复位电路为手动复位构成,模块如下:在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触
21、发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。各模块拼接组合,电路总体设计图如下四电子时钟的程序设计:41基本原理:利用C语言编程,设置单片机内部定时器/计数器T0为定时器功能,并设定其工作在方式1。设定时器 T0 赋初值,使得定时器T0每隔 5ms 中断一次。设置变量mstcnt,使得每中断一次变量mstcnt加 1,当变量mstcnt值为 200 时,则表明计时时间为 1s ,给秒变量加1。正常时间运行过程中,秒位满60后给分位加1,分位满60给时位加
22、1,时位满24时位清零。而在调节时间设定程序中,时位24计满后由0开始;分位60计满后由0开始,但计满后不向时位进1,这样可以避免在错误多按分按键的情况下,需要循环多次按时位调节键才能调节到所需数字。正常时间运行原理如图:4.2基本功能及操作:(由程序设定初值,使得开发板打开电源后的初始闹钟时间是8:40,时钟时间是8:30。)(1)闹钟时间调节:打开单片机开发板电源,数码管显示“8:40”,此时显示的是闹钟设定的时间值,如需改变闹钟时间,则可按S2键以调节时加1,按S3键以调节分加1。(2)时钟时间调节:按S1(P3.2)键可以由闹钟时间显示切换到时钟时间显示,同样操作,按S2使时位加1,按
23、S3使分位加1。当闹钟时间与时钟时间相重合的时候蜂鸣器会响。(3)秒表操作:在闹钟显示界面或时钟显示界面,可以通过按S4键切换到秒表状态,按S1键来调节秒表的开始和暂停。按S4键可以调回到时钟或闹钟界面(取决于你在打开秒表之前的时间显示状态)。4.3程序子模块4.3.1 延时模块数码管显示动态扫描时,用到延时程序,这里使用延迟1ms的程序,此程序需反复调,除数码管动态扫描外,数码管的闪烁提示,以及音乐模块也用到了延时,只是延时的长短不同罢了,在此不再赘述。4.3.2中断服务程序本实验中,计数器运用T0中断,T0中断为时钟定时所用,T1中断用于音乐播放。T0的定时长度为0.05s,工作于方式1,
24、计数1次,时长1us,故计数器计数5000次,进入中断,计数初值为65536-5000=60536=#0EC77,装满定时器需要0.01s的时间,从而200次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。另外,由于要实现倒计时功能,因此在中断程序中还要加入减一的寄存器,需要时将其进行显示。4.4 系统时钟误差分析时间是一个基本物理量,具有连续、自动流逝、不重复等特性。我国时间基准来自国家授时中心,人们日常使用的时钟就是以一定的精度与该基准保持同步的。结合时间概念和误差理论,可以定义电子钟的走时误差S=S1-S
25、2,S1表示程序实际运行计算所得的秒;S2表示客观时间的标准秒。S0时表示电子钟秒单元数值刷新滞后,即走时误差为“慢”;反之,S0表示秒单元数值的刷新超前,即走时误差为“快”。本次设计的单片机电子钟系统中,其误差主要来源包括晶体频率误差,定时器溢出误差,延迟误差。晶体频率产生震荡,容易产生走时误差;定时器溢出的时间误差,本应这一秒溢出,但却在下一秒溢出,造成走时误差;延迟时间过长或过短,都会造成与基准时间产生偏差,造成走时误差。4.5 软件调试问题及解决软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿
26、真器即可;后者一般需要仿真系统的支持。本次课题,Keil软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。仿真部分采用protus 7.5 professional软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。首先打开protus 7.5 professional软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再选择keil4已经编译好的*.hex文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求。五.软件仿真:(1)原理:(2)实时:(3)闹钟:(4)秒表:Keil联调六源程序
27、代码:C语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。对于对电子时钟的设计这样的程序来说,用c语言是最快最有效的语言,下面是用c语言进行编写的基于单片机的电子时钟的设计的部分主要流程程序。#includereg52.h#includeintrins.h#define uchar unsigned char#define uint unsigned int/*七段共阳管显示定义,段选和位选都是低电平有效*/ code unsigned char digseg=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
28、0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E; /数码管显示定义 / 0 1 2 3 4 5 6 7 8 9 A b C d E Fcode unsigned char digseg1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E;/ 数码管显示定义 / 0 1 2 3 4 5 6 7 8 9 A b C d E Fcode unsigned char segsel=0xfe,0xfd,0xfb,0xf7; /数码管位选定义 /*uchar cod
29、e SONG_TONE= 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0; uchar code SONG_LONG= 9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0; */ /音乐 /*定义并初始化变量*/uchar fen=40;uchar shi=8;uchar mstcnt=0;uchar seconde=0;uchar minite=30;
30、uchar hour=8;uchar n=0,a=0;uchar x=0,y=0,z=0,w=0,i,change; /x,y,z,w分别表示秒表的十位,个位,0.1位,0.01位,初值均为0uchar temp=0xfe;sbit P3_2=P32; /按键定义 sbit P3_3=P33; sbit P3_4=P34; sbit P3_5=P35;sbit BUZZER=P24;/蜂鸣器定义 void delay(uchar k ); /延时子程序 void time_pro( ); /时间定义子函数 void display( ); /时钟显示子程序 void dishow( ); /闹
31、钟显示子程序void keyscan( ); /按键扫描子程序 void compare( ); /时间比对子程序void PlayMusic(); /音乐播放子程序void mb(); /秒表子程序void delay (uchar k) /延时子程序 uchar j;while(k-)!=0) for(j=0;j125;j+) ; /* void PlayMusic() /音乐播放子程序 uint i=0,j,k; while(SONG_LONGi!=0|SONG_TONEi!=0) for(j=0;jSONG_LONGi*20;j+) BUZZER=BUZZER; for(k=0;k=2
32、) n=0;/n=2时,置零 if(n=0) if(P3_2=0) delay(90); if(P3_2=0) / while(!P3_2); a=a+1;if(a=2) a=0;/a=2时,置零 if(n=0) if(a=0) dishow(); /数码管时间显示 if(a=1) display( ); /数码管闹钟显示 compare( ); /比较函数 if(n=0) if(a=1) if(P3_3=0) delay(90); if(P3_3=0) /按键当前时间小时加1 hour+; if(hour=24) hour=0; if(P3_4=0) delay(90); if(P3_4=0
33、) /按键当前时间分钟加1 minite+; if(minite=60) minite=0; if(a=0) if(P3_4=0) delay(90); if(P3_4=0) /按键闹钟时间分钟加1 fen+; if(fen=60) fen=0; if(P3_3=0) delay(90); if(P3_3=0)/按键闹钟时间小时加1 shi+; if(shi=24) shi=0; /*/ /*秒表子程序*/ /*/if(n=1) mb(); if(w=10) /秒的0.01位满10,0.1位进1,同时0.01位清零,下同 w=0; z+; if(z=10) z=0; y+;if(y=10) y
34、=0; x+;if(x=6) /60秒秒表,秒十位为6,全部清零 x=0;y=0;z=0;w=0; /*/ /*秒表显示子程序*/ /*/void mb() P2=segsel0; /位选显示 数码管第一位 P0=digsegx; / 段选显示 数码管第一位 ,秒十位 delay(4); P2=segsel1; /位选显示 数码管第二位 P0=digseg1y; / 段选显示 数码管第二位 秒个位 delay(4); P2=segsel2; /位选显示 数码管第三位 P0=digsegz; / 段选显示 数码管第三位 秒0.1位 delay(4); P2=segsel3; /位选显示 数码管第
35、四位 P0=digsegw; / 段选显示 数码管第四位 秒0.01位 delay(4); /*/ /*当前时钟显示子程序*/ /*/void display(void) P2=segsel0; P0=digseghour/10; /显示小时的十位 delay(4); P2=segsel1; P0=(digseg1(hour%10); /显示小时的个位 delay(4); P2=segsel2; P0=digsegminite/10; /显示分的十位 delay(4); P2=segsel3; P0=digsegminite%10; /显示分的个位 delay(4); /*/ /*闹钟显示子程
36、序*/ /*/void dishow(void) P2=segsel0; P0=digsegshi/10; /显示小时的十位 delay(4); P2=segsel1; P0=(digseg1(shi%10); /显示小时的个位 delay(4); P2=segsel2; P0=digsegfen/10; /显示分的十位 delay(4); P2=segsel3; P0=digsegfen%10; /显示分的个位 delay(4); /*/ /*中断子程序*/ /*/void timer0(void) interrupt 1 using 0 /定时器0方式1,5ms中断一次 TH0=0xec; TL0=0x77; /预置计数初值 TMOD=0x01; mstcnt+; /计数5ms,则mstcnt加1,满200时,秒加1,同时mstcnt清零 if(mstcnt=200) seconde+; mstcnt=0; /* if(seconde%2=1) P1=0; else P1=0xff;*/P1=temp;temp=_crol_(temp,1); /流水灯子程序,每1秒闪烁一次,8个二极管依次显示if(mstcnt=12000) minite+; mstcnt=0; if( minite=60) minite=0; hour+; if(hour=24)