基于51单片机的电子时钟设计源程序
基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。
本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。
51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。
本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。
本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。
接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。
将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。
软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。
本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。
通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。
2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。
它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。
51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。
51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。
其存储器分为程序存储器(ROM)和数据存储器(RAM)。
程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。
51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。
51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
基于51单片机电子时钟程序

// 本程序实现功能:显示小时和分钟,并以最后一位的小数点闪烁一次表示一秒。
按下INT0键后显示日期。
并在所设定的时间蜂铃器响5次以此为闹钟;// 第二:按下INT1键后,可对时间,日期,闹钟进行设置,再次按下INT1推出设置//// 显示说明:前两位显示小时和月份,后两位显示分钟和日期//#include <reg52.h>/*==========================================宏定义uchar和uint===========================================*/#define uchar unsigned char#define uint unsigned intsbit alarm=P1^4;/*==============================================变量的定义==============================================*/int year=2010;/*初始年份为2010年*/uchar alarm_hour=0,alarm_min=0; /*初始闹钟时间为00:00*/uchar qian=0,bai=0,shi=0,ge=0,key_flag=0,Key=0,num=0,Flag=0; /*定义输出函数变量和按键号*/uchar x,dis_flag=0; /*显示变换标志位*/uchar Key_control=0; /*按键被按下的标志位*/uchar mounth=7,day=25; /*初始日期设为7月25号*/uchar hour=0,t=0,min=0,sec=0,ring=0;/*初始时间为00:00:00*//*=============================================子函数的定义=============================================*/void Init(); /*此函数用于初始化所有需要使用的中断*/void delay(uint z); /*用于数码管显示*/uchar Key_num(void); /*此函数为确定按下的按键输出编号*/void Led_display();void display(uchar cc, uchar dd); /*显示时间的函数,中间的点表示:*/void display_nian(uchar cc, uchar dd); /*显示年份的显示函数,即没有中间的点*/void display_date(uchar cc, uchar dd); /*显示日期的函数,即四个小数点全亮*/void display_alarm(uchar cc, uchar dd); /*显示闹钟的函数,第二个和第四个点*/void Leap_Nonleap(int aa); /*判断是闰年还是平年,并将二月的最大天数赋给Mounth_array[1]*/void Judge_Setting(uchar Key_set); /*所得出的按键号进行对应的设置*//*==========================================所使用数组的定义============================================*/uchar Mounth_array[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*每个月的最大天数数组*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,/*数码管显示编码*/};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*百位及其小数点的段码*//*==============================================主函数部分==============================================*/void main(){Init();while(1){Leap_Nonleap(year); /*进入大循环后首先对年份进行判断*/while(Key_control)/*当P3.3被按下后Key_control=1进入函数进行设置,直到第二次Key_control=0推出循环*/{Flag=Key_num(); /*将按键函数里面是否有按键被按下的标志位赋给Flag*/if(Flag) /*当有按键被按下时,进入设置函数*/{Judge_Setting(num); /*将num值传入函数,并进行设置*/}Led_display(); /*保证在设置的循环时有显示*/}Led_display();/*循环式动态显示*/}}/*===========================================系统初始化函数=============================================*/void Init() /*初始化系统,启动计时器0,1,外部中断0,1*/{TMOD=0x01; /*将计时器0定位工作方式1,将计时器1定为工作方式2*/TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;// ET1=1;// TR1=1;IE0=1;EX0=1; /*使用外部中断0和1,分别作为显示变换,设置的前戏*/IT0=1;/*为下降沿突发*/IE1=1;EX1=1;IT1=1;/*为下降沿突发*/EA=1;}void Display_flag() interrupt 0 /*使用外部中断0,进行显示时间和日期的转换P3.2口切换显示*/{dis_flag++;if(dis_flag==4) /*当dis_flag=0时,输出时间,当dis_flag=1时,输出日期,当dis_flag=2时,输出闹钟*/dis_flag=0; /*当dis_flag=3时,输出年份。
基于51单片机的电子时钟设计

基于51单片机的电子时钟设计
摘要:本文论述了基于51单片机的电子时钟设计,包括硬件设计与软件编程。
其中,硬件设计包括基本指示灯、DS1302时钟芯片等的选择与连接,时钟电路、晶振电路的设计等。
软件编程包括时钟显示的实现,时钟校准、闹钟等功能的实现等。
本设计具有精度高、操作简便、易于实现等特点,可广泛应用于各种场合。
关键词:51单片机;电子时钟;硬件设计;软件编程
前言
随着人们生活水平的提高,电子时钟已经成为人们生活中必不可少的物品,目前市场上各种类型的电子时钟层出不穷。
本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟,采用DS1302时钟芯片作为时钟驱动芯片,实现了时钟的准确显示、校准、闹钟等功能。
硬件设计
硬件设计主要包括控制器、时钟驱动、显示装置以及电源。
本设计采用了AT89C51单片机作为控制器,一块DS1302时钟芯片作为时钟驱动,LED数字管作为显示装置。
同时,本设计采用了USB供电方式,其电源电压为5V。
软件编程
软件编程主要包括时钟显示、时钟校准、闹钟功能的实现等。
时钟显示采用了动态显示方式,实现了时间的精确定位。
同时,本设计还具有时钟校准功能,在程序接通时,可自动对时钟进行校准,保证时钟的精确度。
此外,本设计还具有设置闹钟的功能,用户可在指定时间响起闹钟。
结论本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟。
通过对硬件设计、软件编程的设计与实现,使得该产品能够准确显示时间,保证了时钟的稳定性,满足了时间的要求,目前已
得到广泛应用。
基于51单片机的数字电子时钟设计

课程设计任务书摘要数字钟因其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
单片机为基础上设计出来的数字时钟数字钟,在日常生活中最常见,应用也最广泛。
本次课程设计的时钟就是以STC89C52单片机为核心,配备LED显示模块、时钟模块、等功能模块的数字电子钟。
采用24小时制方式显示时间。
文章主要从硬件设计和软件编程两个大的方面。
硬件电路设计主要包括中央处理模块、时钟模块,显示模块等几部分。
时钟电路采用DS1302芯片,并选用LED显示器。
软件方面用keil C语言来实现。
软硬件配合,达到电子时钟精准的显示。
关键字:单片机,时钟模块,精准目录1绪论 (2)1.1设计概述 (2)1.2技术简述 (2)1.3本课题的背景 (3)1.4本课题的意义 (3)2系统设计 (4)2.1设计目的 (4)2.2设计功能及要求 (4)2.3设计思路 (4)2.4硬件方案 (4)2.4.1时钟芯片的选择 (5)2.4.2显示屏的选择 (5)2.4.3单片机的选择 (5)2.5软件方案 (5)2.6整体方案 (6)2.7元器件清单 (6)3硬件设计 (7)3.1单片机最小系统 (7)3.1.1时钟电路 (7)3.1.2复位电路 (8)3.2时钟电路 (8)3.3电源电路 (9)3.4系统整体电路 (9)3.5系统仿真 (10)3.6硬件制作 (10)4软件设计 (11)4.1程序设计步骤 (11)4.2系统主程序 (11)4.3时钟模块子程序 (12)4.4显示模块子程序 (12)4.5主程序 (13)5联机调试 (14)6总结 (15)7参考文献 (16)1绪论1.1设计概述在单片机技术日趋成熟的今天,其灵活的硬件电路和软件程序的设计,使单片机得到广泛的应用,从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。
数字电子时钟是基于单片机和DS1302时钟芯片的一种计时工具。
基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。
单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。
该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。
STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。
AT89C51单片机电子时钟的设计

AT89C51单片机电子时钟的设计1.硬件设计首先,我们需要选择合适的外设硬件进行设计。
以下是一些常见的硬件组件:-AT89C51单片机-蜂鸣器-DS1302时钟模块-按键开关和对应的电阻液晶模块的连接方式如下:-VSS->GND-VDD->VCC-V0->电位器-RS->P0.7-R/W->P0.6-E->P0.5-DB0-DB7->P2.0-P2.7蜂鸣器的连接方式如下:-正极->P3.0-负极->GNDDS1302时钟模块的连接方式如下:-VCC->VCC-GND->GND-CE->P1.7-IO->P1.6-SCLK->P1.5按键开关的连接方式如下:-第一个按键->P3.1-第二个按键->P3.2-第三个按键->P3.32.软件设计在软件设计方面,我们将使用C语言编程来编写程序。
首先,我们需要定义和初始化必要的变量,例如小时、分钟和秒钟等计时变量。
然后,我们需要编写一个初始化函数来配置单片机的各种外设和寄存器。
在这个函数中,我们需要设置计时器/计数器、I/O口和中断等。
接下来,我们需要编写一个定时器中断函数,来更新计时变量并实现计时功能。
我们可以使用定时器中断来定期更新秒钟,并在需要时更新小时和分钟。
在主循环中,我们需要编写代码来控制液晶模块、蜂鸣器和按键开关等外设。
通过液晶模块,我们可以实现显示时间的功能。
通过蜂鸣器,我们可以实现头每秒发出一次滴答声的功能。
通过按键开关,我们可以实现设置时间的功能。
3.程序实现以下是AT89C51单片机电子时钟的程序框架:```c#include <reg51.h>#include <intrins.h>//定义和初始化计时变量unsigned char second = 0;unsigned char minute = 0;unsigned char hour = 0;//初始化函数void ini//配置计时器/计数器,设置定时器中断//配置I/O口和中断等//...//定时器中断函数//更新计时变量//...//主函数void mai//初始化init(;//主循环while (1)//控制液晶模块//控制蜂鸣器//控制按键开关//...}```在具体的代码实现中,我们需要根据液晶模块、蜂鸣器和按键开关等外设的具体规格和功能来编写相应的代码。
基于51单片机的简易电子钟设计

基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。
二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。
1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。
以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。
同时,根据用户按键的操作,可以调整时间的设定。
2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。
可以显示当前时间和设置的闹钟时间。
初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。
3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。
通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。
4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。
同时可以添加外部中断用于响应用户按键操作。
三、主要功能和实现步骤1.系统初始化。
2.设置定时器,每1秒产生一次中断。
3.初始化LCD显示屏,显示初始时间00:00:00。
4.查询键盘状态,判断是否有按键按下。
5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。
-数字键:根据键入的数字进行时间的调整和闹钟设定。
6.根据定时器的中断,更新时间的显示。
7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。
8.循环执行步骤4-7,实现连续的时间显示和按键操作。
四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg51.h>unsigned char DispBuf[6]; //时间显示缓冲区unsigned char Disdate[6]; //日期显示缓冲区unsigned char DisSec[6]; //秒表缓冲区struct //设定时间结构体{unsigned char Hour;unsigned char Min;unsigned char Sec;}Time;struct //设定日期结构体{unsigned char Year;unsigned char Month;unsigned char Days;}Date;struct //设定毫秒结构体{unsigned char Minite;unsigned char Second;unsigned char MilliSec;}Millisecond;unsigned char point=0;unsigned char point1=0;unsigned char point2=0;unsigned char Daymount;unsigned char Daymount1;unsigned char T0_Int_Times=0; //中断次数计数变量unsigned char Flash_flag=0; //闪烁标志,每半秒闪烁unsigned char Flash_flag1=0; //闪烁标志,每半秒闪烁unsigned char DisPlay_Back=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致unsigned char DisPlay_Back1=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致unsigned char i,j; unsigned char SetMillisecond; //启动秒表code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80}; //数码管显示代码code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); // 调日期void displaydate(); // 显示日期void makedays(); //确定每个月的日期void runSec();void delay(unsigned int i); //函数声名sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;//***************************************************// Init 初始化代码// 设定50ms中断一次,注:在Fosc=6M情况下//****************************************************void Init(void){Date.Year=10;Date.Month=12;Date.Days=25;Time.Hour=12;Time.Min=0;Time.Sec=0;TMOD=0x01;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;}/******************************延时子程序*********************************************/void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}//*******************************************// 主程序//*******************************************main(){Init(); //初始化for(;;){if(DisPlay_Back!=Flash_flag) //是否显示?{DisPlay_Back=Flash_flag; //显示过后要半秒后再显示ChangeToDispCode(); //转化时间为可显示代码if(Flash_flag) //更新双点闪烁{DispBuf[2]=DispBuf[2]|0x10; //双点熄灭DispBuf[4]=DispBuf[4]|0x20;}else{DispBuf[2]=DispBuf[2]&0xef; //点亮双点DispBuf[4]=DispBuf[4]&0xdf;};if(Flash_flag & point==1) //更新小时{DispBuf[0]=DispBuf[0]|0xff; //小时熄灭DispBuf[1]=DispBuf[1]|0xff;}else{DispBuf[0]=DispBuf[0]&0xff; //小时点亮DispBuf[1]=DispBuf[1]&0xff;};if(Flash_flag & point==2) //更新分钟{DispBuf[2]=DispBuf[2]|0xff; //分钟熄灭DispBuf[3]=DispBuf[3]|0xff;}else{DispBuf[2]=DispBuf[2]&0xff; //分钟点亮DispBuf[3]=DispBuf[3]&0xff;};if(Flash_flag & point==3) //更新秒钟{DispBuf[4]=DispBuf[4]|0xff; //秒钟熄灭DispBuf[5]=DispBuf[5]|0xff;}else{DispBuf[4]=DispBuf[4]&0xff; //秒钟点亮DispBuf[5]=DispBuf[5]&0xff;};DisPlayBuf();//显示}if((P1&0x07)!=0x7) //按键处理模块模块{delay(250);if((P1&0x07)!=0x7){if(P1_2==0){point=(point+1)%5;}else if (P1_1==0){switch(point){case 0: Millisecond.Minite=0;Millisecond.Second=0;liSec=0;SetMillisecond++;runSec();break;case 1:Time.Hour=( Time.Hour+1)%24;break;case 2:Time.Min=( Time.Min+1)%60;break;case 3:Time.Sec=( Time.Sec+1)%60;break;};}else if (P1_0==0){switch(point){case 0:ChangeToDispCode1();Disdate[2]=Disdate[2]&0xef; //点亮双点Disdate[4]=Disdate[4]&0xdf;displaydate();delay(2000);break;case 1:Time.Hour=( Time.Hour+24-1)%24;break;case 2:Time.Min=( Time.Min+60-1)%60;break;case 3:Time.Sec=( Time.Sec+60-1)%60;break;case 4:changedate();break;};};};};makedays();}}//***************************************************** // 把时间显示缓冲区的内容发到74HC164//***************************************************** void DisPlayBuf(void){unsigned char i;for(i=0;i<6;i++){SBUF=DispBuf[i];while(TI==0); //等待发送完毕TI=0; //把发送完标志清掉以备下次再用};}//***************************************************** // 把日期显示缓冲区的内容发到74HC164//***************************************************** void displaydate(void){unsigned char i;for(i=0;i<6;i++){SBUF=Disdate[i];while(TI==0); //等待发送完毕TI=0; //把发送完标志清掉以备下次再用};}//***************************************************** // 把秒表技术显示缓冲区的内容发到74HC164//***************************************************** void displaySec(void){unsigned char i;for(i=0;i<6;i++){SBUF=DisSec[i];while(TI==0); //等待发送完毕TI=0; //把发送完标志清掉以备下次再用};}//*******************************************// 把时间转换为可以显示的代码//*******************************************void ChangeToDispCode(void){DispBuf[0]=LEDCode[Time.Hour/10];DispBuf[1]=LEDCode[Time.Hour%10];DispBuf[2]=LEDCode[Time.Min/10];DispBuf[3]=LEDCode[Time.Min%10];DispBuf[4]=ErrorLEDCode[Time.Sec/10];DispBuf[5]=LEDCode[Time.Sec%10];}//*******************************************// 把日期转化为现实的数//*******************************************void ChangeToDispCode1(void){Disdate[0]=LEDCode[Date.Year/10];Disdate[1]=LEDCode[Date.Year%10];Disdate[2]=LEDCode[Date.Month/10];Disdate[3]=LEDCode[Date.Month%10];Disdate[4]=ErrorLEDCode[ Date.Days/10];Disdate[5]=LEDCode[Date.Days%10];}//*******************************************// 秒表功能//*******************************************void ChangeToDispCode2(void){DisSec[0]=LEDCode[Millisecond.Minite/10];DisSec[1]=LEDCode[Millisecond.Minite%10];DisSec[2]=LEDCode[Millisecond.Second/10];DisSec[3]=LEDCode[Millisecond.Second%10];DisSec[4]=ErrorLEDCode[ liSec/10];DisSec[5]=LEDCode[liSec%10];}//******************************************************// 定时器中断//******************************************************void T0_Int(void) interrupt 1 using 1{TH0=(65536-5000)/256; //定时器装填TL0=(65536-5000)%256;if(SetMillisecond!=0){liSec++;if(liSec>=100){liSec=0;Millisecond.Second++;if(Millisecond.Second>=60){Millisecond.Second=0;Millisecond.Minite++;if(Millisecond.Minite>=60)Millisecond.Minite=0;}}}T0_Int_Times++; //中断次数加if(T0_Int_Times>=50) //每半秒更新闪烁标志{Flash_flag =1;Flash_flag1 =1;}else{Flash_flag =0;Flash_flag1 =0;};if(T0_Int_Times>=100) //如果中断10次为1秒的时间开始更新时、分、秒{T0_Int_Times=0;Time.Sec++;if(Time.Sec>=60){Time.Sec=0;Time.Min++;if(Time.Min>=60){Time.Min=0;Time.Hour=(Time.Hour+1)%24;if(Time.Hour>=24){Time.Hour=0;Date.Days++;if( Date.Days >Daymount){Date.Days=1;Date.Month++;if(Date.Month>12)Date.Month=1;Date.Year++;};};};};}}//**************************************************************** //******************************调节日期*************************** //***************************************************************** void changedate(void){while(1){if(DisPlay_Back1!=Flash_flag1) //是否显示?{DisPlay_Back1=Flash_flag1; //显示过后要半秒后再显示ChangeToDispCode1(); //转化时间为可显示代码if(Flash_flag1) //更新双点闪烁{Disdate[2]=Disdate[2]|0x10; //双点熄灭Disdate[4]=Disdate[4]|0x20;}else{Disdate[2]=Disdate[2]&0xef; //点亮双点Disdate[4]=Disdate[4]&0xdf;};if(Flash_flag1& point1==1) //更新年{Disdate[0]=Disdate[0]|0xff; //年熄灭Disdate[1]=Disdate[1]|0xff;}else{Disdate[0]=Disdate[0]&0xff; //年点亮Disdate[1]=Disdate[1]&0xff;};if(Flash_flag1 & point1==2) //更新月{Disdate[2]=Disdate[2]|0xff; //月熄灭Disdate[3]=Disdate[3]|0xff;}else{Disdate[2]=Disdate[2]&0xff; //月点亮Disdate[3]=Disdate[3]&0xff;};if(Flash_flag1 & point1==3) //更新天{Disdate[4]=Disdate[4]|0xff; //天熄灭Disdate[5]=Disdate[5]|0xff;}else{Disdate[4]=Disdate[4]&0xff; //天点亮Disdate[5]=Disdate[5]&0xff;};displaydate();}if((P1&0x07)!=0x7) //**********按键处理模块******* {delay(250);if((P1&0x07)!=0x7){if(P1_2==0){point1=(point1+1)%5;}else if (P1_1==0){switch(point1){case 1:Date.Year++;break;case 2:Date.Month++;if( Date.Month==13){Date.Month=1;}break;case 3:makedays();Date.Days++;if(Date.Days>Daymount){Date.Days=1;}break;};}else if (P1_0==0){switch(point1){case 1:Date.Year--;break;case 2:Date.Month--;if( Date.Month<=0){Date.Month=12;}break;case 3:makedays();Date.Days--;if(Date.Days<=0){Date.Days=Daymount;};break;};};}if(point1==4){point1=0;break;}}}}//***************************************************** //***************调日期加时时确定天数******************* //****************************************************** void makedays(){switch (Date.Month){case 4:case 6:case 9:case 11:Daymount=30;break;case 2:if(Date.Year%4==0)Daymount=29;elseDaymount=28;break;default: Daymount=31;break;}}void runSec(){while(1){if(DisPlay_Back!=Flash_flag) //是否显示?{DisPlay_Back=Flash_flag; //显示过后要半秒后再显示ChangeToDispCode2(); //转化时间为可显示代码if(Flash_flag) //更新双点闪烁{DisSec[2]=DisSec[2]|0x10; //双点熄灭DisSec[4]=DisSec[4]|0x20;}else{DisSec[2]=DisSec[2]&0xef; //点亮双点DisSec[4]=DisSec[4]&0xdf;};displaySec();}if((P1&0x07)!=0x7) //按键处理模块模块{delay(250);if((P1&0x07)!=0x7){if(P1_2==0){break;}else if (P1_1==0){point2=( point2+1)%3;switch( point2-1){case 0:SetMillisecond=0;break;case 1: point2=point2-2;SetMillisecond=1;break;}}else if(P1_0==0){SetMillisecond=0;Millisecond.Minite=0;Millisecond.Second=0;liSec=0;SetMillisecond=1;}}}} }。