51单片机可调电子时钟

合集下载

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。

时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。

10秒位到5后,即59秒,分钟加1,10秒位回0。

依次类推,时钟最大的显示值为23小时59分59秒。

这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。

开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。

6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。

基于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单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。

DIY基于51单片机的旋转LED数字电子钟

DIY基于51单片机的旋转LED数字电子钟

标签:DIY基于51单片机的旋转LED数字电子钟(红外线遥控调时)在网上看到不少老外做的各种旋转LED显示屏,非常COOL,我也动手用洞洞板试做了一个类似的显示屏,结果感觉还不错。

于是再接再励继续努力,将作品进一步改进,完善后制成如今这个样子。

由于刚学51单片机,加上制作电路板软件也是从零开始,的确花了我不少的时间和精力。

不过也就是在这艰难的独立制作中,真正学到了不少实在的东西。

本项目的关键是如何解决高速旋转的电路板如何供电,如何调时的问题。

我采用电机电刷的原理,将旋转轴钻空,通过一只插头将电源的从反面引到前面的电路板上,而这个旋转的插头又与固定在背板上的两个铜片接触的。

调时的问题有些困难,一是让电路板在旋转前与PC机相接,由电脑传送调时数据,这虽然可行但不方便。

还有就是用遥控方法,但此方案在调试方面有很大的困难。

显示方式上,我采用平衡式的两排LED,这除了在旋转时能较好的保持平衡外,主要能利用两边交替显示方式,比单排要快一倍。

本装置不仅是一个时钟,它还可以动态显示汉字及图案,这就看如何发挥了。

其具体制作过程如下:一。

旋转电机的制作从制作成本与方便考虑,选用旧电脑用的大软驱上的直流无刷电机,只是对局部进行改造。

就是这种古董软驱软驱上的直流无刷电机拆开后的电机仔细拆开直流电机,将带圆盘的铝轴从中开孔,让它刚好能插入一个插头。

将旋转轴加工成这样装配好以后按拆开时的顺序,反序将轴安装直流电机上。

电机装配完成后用两片铜片做的电刷电刷装好后的侧面图将电路板上较突出的元件改焊在反面,电机的电源接法。

从电路板标注的符号看,“+”为电源正,“G”为电源负,“C”与“M”端分别与电源正相连匀可使电机运转将一张旧唱片按电机座的位置开孔,而定位用的挡光板应根据电路板上感光组件的位置确定。

二。

电路板的制作本制作品用51单片机控制,具体电原理图如下:用Protel 99设计制作了电路板。

最后得到完成的作品。

遥控器用的是松下车载机的,只用了其中的六个键。

基于51单片机的电子时钟

基于51单片机的电子时钟

1、电子闹钟的硬件系统框架:设计出电子闹钟的基本整体框架。

2、电子闹钟的电源设计:采用交直流供电电源。

电子钟一般采用数码管等显示介质,因而必须以交流供电为主,以直流电源为后备辅助电源。

3、电子闹钟的主机电路设计:主要有1)系统时钟电路设计:对时间要求不是很高,只要能使系统可靠起振并稳定运行就行。

2)系统复位电路设计:本系统采用的是RC复位方式3)按键与按钮电路设计:按键与按钮电路设计中关键要考虑的就是按键的去抖动问题。

本系统采用软件去抖。

考虑到对时和设定闹铃时间操作的使用频率不高,为了精简系统和降低成本,本系统只设置两个按键。

a)SET键,对应系统的不同工作状态,具有3个功能:在复位后的待机状态下,用于启动设定时间参数(对时或定闹);在设定时间参数状态而且不是设定最低位(即分个位)的状态下,用于结束当前位的设定,当前设定位下移;在设定最低位(分个位)的状态下,用于结束本次时间设定。

b)+1键,用于对当前设定位进行加1操作。

4)闹铃声光指示电路设计:本系统采用声音指示,关键元件是蜂鸣器。

4、电子闹钟的显示电路设计:设计一个由LED数码管组成的显示电路,显示采用共阳极数码管,其目的是为了简化限流电路的设计和实现亮度可调的要求。

一功能模、设计指标:1. 显示时、分、秒。

2. 可以24小时制或12小时制。

3. 具有校时功能,可以对小时和分单独校时,对分校时的时候,停止分向小时进位。

校时时钟源可以手动输入或借用电路中的时钟。

4. 具有正点报时功能,正点前10秒开始,蜂鸣器1秒响1秒停地响5次。

5. 为了保证计时准确、稳定,由晶体振荡器提供标准时间的基准信号。

二、设计要求:1. 画出总体设计框图,以说明数字钟由哪些相对独立的块组成,标出各个模块之间互相联系,时钟信号传输路径、方向和频率变化。

并以文字对原理作辅助说明。

2. 设计各个功能模块的电路图,加上原理说明。

3. 选择合适的元器件,在面包上接线验证、调试各个功能模块的电路,在接线验证时设计、选择合适的输入信号和输出方式,在充分电路正确性同时,输入信号和输出方式要便于电路的测试和故障排除。

基于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单片机课程设计电子时钟课程设计:单片机课程设计课程名称:单片机电子时钟题目名称:电信学院学院:程工专业子电:姓名曾代科:学号 3201:国加杨指导教师2010月11年 7日一、课程设计名称:51单片机电子时钟二、设计方案:1、通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。

2、采用时钟芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。

三、设计内容:这里采用应用广泛的AT89C52作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。

首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,妙计60次形成分,分计60形成小时,小时计到12。

最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。

此外还要实现对时间的调整功能,89C52的、、外接三个独立按键,当按下按键时,系统进入调时间的状态或启动时间显示的功能;当按下按键时,对显示的数码管进行加一的功能;当按下按键时,对显示的数码管进行减一的功能,达到调整时间的目的。

四、系统软件程序设计1.主程序先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下时,则转入相应的功能程序。

2、数码管显示模块本实验有8个数码管,从右到左为妙、横线、分、横线、时。

在本系统中数码管显示采用软件译码动态显示。

在存储器中首先建立一张显示信息的字段码表,显示时,先中取出显示的信息,然后通过查表程序在从显示缓冲区字段表中查出所显示的信息的断码,从P0端口输出,同时在P2端口进行数码管显示。

3、定时器/计数器T0中断服务程序T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。

基于51单片机多功能电子时钟设计报告

基于51单片机多功能电子时钟设计报告

多功能电子数字钟姓名 :学号 :班级 :指导教师:目录一课程设计题目-------------------------------- 3二电路设计--------------------------------------- 4三程序总体设计思路概述------------------- 5四各模块程序设计及流程图---------------- 6五程序及程序说明见附录------------------- **六课程设计心得及体会---------------------- 11七参考资料--------------------------------------- 12一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。

具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。

最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能 ----及格(2)完成“校时修改”功能----中等(3)完成“校时修改位闪”----良好(4)完成“定点报警”功能,且使用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3.7口。

因为单片机输出高电平时输出的电流不足以驱动蜂鸣器所以蜂鸣器,所以P3.7口与蜂鸣器直接接反相器再接蜂鸣器的一端,蜂鸣器的另一端接5V电源。

51单片机可调时电子时钟程序

51单片机可调时电子时钟程序

//*******************基于51单片机的可调时电子时钟实验**********************////***电子时钟前两位为分钟,后两位为秒钟,逢38秒进1分***********************////***按下调时键第一次,秒钟闪烁,进入编辑状态******************************////***按下调时键第二次,分钟闪烁,进入编辑状态******************************////***按下调时键第三次,则确定**********************************************////***在编辑状态下,按下增/减按钮,闪烁位则进行加/减操作********************////***若在编辑状态下,按下增/减按钮时间超过1S,则闪烁位以0.5秒的速度自加1***//#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit wela1=P2^4;sbit wela2=P2^5;sbit wela3=P2^6;sbit wela4=P2^7;sbit key1=P1^5;sbit key2=P1^6;sbit key3=P1^7;//位定义uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar miao,fen,mode,modeflag;//模式标志位bit flag,flash,miao_long,fen_long;//*********延时子函数*************// void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********定时器T0和变量的初始化****// void T0_init(){miao=00;fen=00;mode=0;modeflag=0;flash=0;flag=0;P2=0x0f;//锁存允许接口全部置低电平TMOD=0x01;//选择定时器工作方式TH0=(65536-2000)/256;TL0=(65536-2000)%256;//赋初值EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//启动定时器}//*******数码管显示子函数***********// void display(){if(flag==0)//闪烁标志位为0时不闪烁{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0; //送数给分位显示wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //送数给秒位显示}else //闪烁标志位为1时闪烁{if(mode==1)//模式为1,即调秒{if(miao_long==0)//没有长按加、减按钮{if(flash==0)//当闪烁等于0时{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}else//当闪烁等于1时{P0=0xff;wela3=0;wela4=1;P0=0xff;wela4=0;}}else//长按了加、减按钮{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}}else//模式为2,即调分{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //在秒位熄灭的那一刻,按下调时键时,要把秒位点亮if(fen_long==0)//没有长按加、减按钮{if(flash==0){P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}else{wela1=1;P0=0xff;wela1=0;wela2=1;P0=0xff;wela2=0;}}else//长按了加、减按钮{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}}}}//*********key1按钮子程序**************//void key1_scan(){if(key1==0){delay(10);//消抖if(key1==0){modeflag++;//模式标志位自加1flag=1;//闪烁标志位打开mode++;//模式自加1if(mode==3)//只在模式1:调秒,模式2:调分中间选择mode=0;while(!key1);//松手检测}}else if(modeflag==3)//按键次数到了第三次{modeflag=0;flag=0;while(!key1);}}//************key2,key3子程序**************//void key23_scan(){if(key2==0)//加数的操作{delay(10);if(key2==0){if(mode==1)//如果是模式1的话,key2键对秒加1{miao++;if(miao==38)//38秒进1分miao=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){miao_long=1;miao++;if(miao==38)miao=0;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key2键对分加一{fen++;if(fen==60)//60分钟进1fen=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){fen_long=1;fen++;if(fen==60)fen=0;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}else if(key3==0)//减数的操作{delay(10);if(key3==0){if(mode==1)//如果是模式1的话,key3键对秒减一{miao--;if(miao==0)miao=37;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3){miao_long=1;miao--;if(miao==0)miao=37;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key3键对分减一{fen--;if(fen==0)fen=59;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3)fen_long=1;fen--;if(fen==0)fen=59;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}}}void main(){T0_init();while(1){key1_scan();key23_scan();}}void T0_time() interrupt 1{static uchar t=0;static uint i=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(flag==0)//时间显示调整{i++;if(i==20){i=0;miao++;if(miao==38){miao=0;fen++;if(fen==60){fen=0;}}}}t++;if(t==10){t=0;flash=~flash;//闪烁标志位取反}display();}。

基于51单片机的简易电子钟设计

基于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单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。

但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。

51单片机可调电子时钟

51单片机可调电子时钟

目录摘要 (2)Abstract (3)1.设计目的 (4)2.设计任务 (4)2.1.任务1:开机界面的设置 (4)2.2.任务2:LCD-1602显示日期时间 (4)2.3.任务3:时间与日期的调整 (4)3.硬件设计 (4)3.1.STC89C51(51单片机) (4)3.2.LCD-1602液晶显示屏 (5)4.软件设计 (7)4.1.应用软件 (7)4.2.程序框图 (7)4.3.使用说明 (7)4.4.注意事项 (8)4.5.调试结果 (8)5.收获 (9)附录: (10)附录A.硬件图 (10)附录B.主要程序 (11)摘要电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。

本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。

硬件由主控器、显示电路、键盘接口等三个模块组成。

该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。

软件利用C语言编程实现单片机的控制功能。

关键词:电子时钟、单片机、LCD-1602液晶显示AbstractElectronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button. Software uses C language programming microcontroller control functions.Key words: electronic clock, single chip microcomputer,LCD-1602 liquid crystal display1.设计目的该电子时钟由C语言编写而成,利用单片机定时器控制时钟运行,实现按键调整时间和日期的功能。

基于51单片机的电子时钟的设计

基于51单片机的电子时钟的设计

基于51单片机的电子时钟的设计电子时钟已经成为我们日常生活中不可或缺的设备之一。

随着科技的不断发展,电子时钟也越来越智能化,功能也越来越强大。

然而,简单的电子时钟也非常实用,可以帮助我们准确地把握时间,安排生活。

本文将基于51单片机,介绍一个简单的电子时钟的设计。

第一步,硬件设计。

要实现电子时钟,我们需要用到一个时钟模块,它可以为我们提供一个准确的时间基准。

同时,我们还需要将时间显示在一个数码管上,所以在硬件设计中我们需要使用数码管。

此外,为了方便调试,我们需要一个串口模块,它可以将调试信息输出到PC端,供我们观察。

具体的硬件设计如下:1.时钟模块我们使用的是DS1302时钟模块,它可以提供准确的时间计算。

DS1302时钟模块有六个引脚,分别是:VCC、GND、CLK、DAT、RST、DS。

其中,VCC和GND分别连接电源正负极,CLK是时钟,DAT是数据,RST是复位,DS是时钟数据存储器。

2.数码管我们使用共阴数码管,它有12个引脚,其中11个引脚是段选线,另外一个引脚是位选线。

为了方便连接,我们可以使用数码管驱动芯片,如74HC595。

它可以将51单片机的串行数据转为并行数据,以驱动数码管。

3.串口模块串口模块是用于通信的模块,它有4个引脚,分别是:VCC、GND、TX、RX。

其中,VCC 和GND连接电源正负极,TX是发送端口,RX是接收端口。

第二步,软件设计。

软件设计主要包括三个部分,分别是时钟模块的驱动程序、数码管的驱动程序和主程序。

我们需要编写一个DS1302时钟模块的驱动程序。

通过驱动程序,我们可以读取当前时间,并将其设置为时钟模块的初始时间。

同时,我们还需要实现定时器中断,以更新时钟显示。

数码管驱动程序是通过74HC595芯片实现的。

我们需要编写一个函数,将当前时间转换为段选数据,再通过74HC595芯片输出到数码管上。

3.主程序主程序主要包括时钟的初始化、时钟的设置、时钟的显示等功能。

51单片机C语言可调时钟(2)(1)

51单片机C语言可调时钟(2)(1)

/*这是一个真正有意义的时钟key1功能键选择可调位,短按,每按一下有一位闪烁长按闪烁不断向下一位推移key2 加键短按相应闪烁的位加1,长按连续加1;key3 减键短按相应闪烁的位减1,长按连续减一;key4 确定键按下退出调时,正常显示;*/#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0#define KEY_1 0x0e#define KEY_2 0x0d#define KEY_3 0x0b#define KEY_4 0x07#define KEY_NULL 0x0f#define KEY_PRESS 0x80#define KEY_LONG 0x40#define KEY_STATE_INIT 0#define KEY_STATE_PRESS 1#define KEY_STATE_LONG 2#define KEY_STATE_UP 3#define KEY_LONG_PERIOD 20#define KEY_CONTINUE_PERIOD 10bit set;bit dao1S=0;bit dao2MS=0;bit dao10MS;sbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;int main_flag,exit_flag,up_flag,down_flag;int tab[]={0,0,0,0,0,0};uchar weitable[]={0x01,0x02,0x04,0x08,0x10,0x20};uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void nint(){ TMOD=0X01;TH0=0XF8;TL0=0XCC;TR0=1;ET0=1;}uchar KeyScan(){if(key1==0) return KEY_1;if(key2==0) return KEY_2;if(key3==0) return KEY_3;if(key4==0) return KEY_4;return KEY_NULL;}uchar GetKey(){uchar keyRetu=0,keyTemp=KEY_NULL;static uchar s_keyState=KEY_STATE_INIT,keyTime=0,keyLast=KEY_NULL;keyTemp=KeyScan();switch (s_keyState){case KEY_STA TE_INIT:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_PRESS;}break;case KEY_STA TE_PRESS:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_LONG;keyTime=0;keyLast=keyTemp;}else{s_keyState=KEY_STA TE_INIT;}break;case KEY_STA TE_LONG:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;keyRetu=(keyLast|KEY_PRESS);}else{if(++keyTime>=KEY_LONG_PERIOD) //按下时间>1s{s_keyState=KEY_STATE_UP;keyTime=0;}}break;case KEY_STA TE_UP:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;}else{if(++keyTime>=KEY_CONTINUE_PERIOD) //按下时间>0.5s {keyTime=0;keyRetu=(keyLast|KEY_LONG);}}break;}return keyRetu;}void updatetime(){if(dao1S){dao1S=0;if(++tab[5]==10){ tab[5]=0;if(++tab[4]==6){tab[4]=0;if(++tab[3]==10){ tab[3]=0;if(++tab[2]==6){ tab[2]=0;if(tab[0]<2){if(++tab[1]==10){ tab[1]=0;tab[0]++;}}else{ if(tab[1]==4){ tab[1]=0;tab[0]=0;}} }}}}}}void display(){ static uchar k=0;dula=1;LED=tab1[tab[k]];if(set&&((k==main_flag-1))){LED=0XFF;}dula=0;LED=0Xff;wela=1;LED=weitable[k];wela=0;if(++k>5) k=0;}void sittime(uchar hour,uchar minute,uchar second ) { uchar a1,a2,b1,b2,c1,c2;a1=hour/10;a2=hour%10;b1=minute/10;b2=minute%10;c1=second/10;c2=second%10;tab[0]=a1;tab[1]=a2;tab[2]=b1;tab[3]=b2;tab[4]=c1;tab[5]=c2;}void main(){ nint();EA=1;sittime(15,20,15);while(1){updatetime();if(dao2MS){dao2MS=0;display();}if(dao10MS){dao10MS=0;switch (GetKey()){case (KEY_1|KEY_PRESS):if(++main_flag>=7)main_flag=0;break;case (KEY_1|KEY_LONG):if(++main_flag>=7)main_flag=0;break;case (KEY_2|KEY_PRESS):switch(main_flag){case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_2|KEY_LONG): switch(main_flag) {case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_3|KEY_PRESS):switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_3|KEY_LONG): switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_4|KEY_PRESS):main_flag=0;display();}}}}void timer() interrupt 1{ static count=0;static count1=0;TH0=0XF8;TL0=0XCC;dao2MS=1;count++;if(++count1==10){ c ount1=0;dao10MS=1;}if(!(count%25)) set = !set;if(count==500) {count=0;dao1S=1; }}。

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
void buzz_pro(uchar be)//蜂鸣器发声函数
{
switch(be)
{//uint i;
/*用于整点响铃*/case 0:{
buzz=~buzz;
//delay1();
}break;
/*用于闹铃报时*/case 1:{
buzz=~buzz;
//delay(10);
}break;
}
}
void write_com(uchar com)//命令写入函数
{
rs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(uchar date)//数据写入函数
{
rs=1;
delay(3);
P0=date;
delay(3);
write_date(0x30+ge);
}
void write_ymd(uchar add,uchar date)//年月日写入子程序
{
uchar sh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
sbit buzz=P1^5; //蜂鸣器控制端
uchar code week0[]="Sun";
uchar code week1[]="Mon";
uchar code week2[]="Tue";

基于C51单片机的数字可调时钟

基于C51单片机的数字可调时钟

河南机电高等专科学校《C51程序设计》大作业设计题目:数字可调时钟班级:通技091学号:090413128姓名:成绩:2011年11月1 设计任务制作数字可调时钟,要求可以分开调节分、时、年、月、日,能够显示温度。

2电路原理图以下为protel99se画的的原理图3 系统流程图数字可调时钟分以下四个部分构成:显示部分:此次显示采用了动态扫描显示,采用74ls573进行数据锁存。

温度采集:温度采集采用了18b20采集的,18b20转化温度较快,精度高。

时钟:采用普通的ds1302芯片。

数据运算:单片机用普通的8051单片机(12M晶振)。

4 源程序/*******************************数字可调时钟*********************************/ /*******************************by:lhc****************************************/ #include<reg51.h> #define DataPort P0void delayms(unsigned char i); sbit DQ=P1^3; sbit sclk=P1^4;sbit date=P1^5; sbit rst=P1^6;sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存unsigned char time[8]={20,11,11,27,11,30,00,7}; //年 月日 时 分 秒 周 unsigned char time1[8],readtemflag;unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char code pingnian[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份天数 unsigned char code yunnian[13]= { 0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年的月份天数 unsigned char TempData[8]; //存储显示值的全局变量 void delay(unsigned char i) {while(--i); //us 延时函数}void delayms(unsigned char i) //ms 延时函数 {while(i--) { delay(245); delay(245); } }bit rest(void)//18b20重启函数{ bit k=0; DQ=1; delay(5); DQ=0; delay(150); delay(200); DQ=1; delay(40); k =DQ; delay(25); r eturn(k); }unsigned char read()//18b20读数据函数{ unsigned char i=0; unsigned char dat=0;for(i=0;i<8;i++) {DQ=0; dat>>=1; DQ=1;if(DQ) dat|=0x80; delay(25); }return (dat);}void write(unsigned char dat)//18b20写数据函数{unsigned char i=0; for(i=0;i<8;i++){ DQ = 0; DQ = dat&0x01; delay(25); DQ = 1; dat>>=1;} delay(25);}unsigned int ReadTemperature(void) //读取温度函数{ unsigned char a=0; unsigned int kk=0,b=0;LOOP:if(rest()==0){ write(0xCC); //跳过ROM w rite(0x44); //初始化温度转换delayms(20); rest();TH1=0XFa; TL1=0Xff; write(0xCC); write(0xBE); //读取温度a=read(); b=read(); b<<=8; kk=a+b; return(kk);} else goto LOOP;}void restds1302(void){sclk=0; rst=0; //ds1302重启 }void writebyte(unsigned char addr,unsigned char byte) //写入ds1302一个字节数据{ unsigned char i;rst=1;addr=addr&0xfe;for(i=0;i<8;i++){ date=addr&0x01; sclk=1; sclk=0; addr>>=1;}for(i=0;i<8;i++){ date=byte&0x01; sclk=1; sclk=0; byte>>=1;}rst=0;}unsigned char readbyte(unsigned char addr) //读取一个字节的数据{ unsigned char i,temp;rst=1; addr=addr|0x01;for(i=0;i<8;i++) //读函数{ date=addr&0x01;sclk=1; sclk=0;addr=addr>>1;}for(i=0;i<8;i++){temp=temp>>1;if(date) temp|=0x80;else temp&=0x7f; sclk=1; sclk=0;}rst=0;return temp;}void writetime(void) //调时函数{unsigned char i,tmp;for(i=0;i<8;i++){ //BCD处理tmp=time[i]/10;time1[i]=time[i]%10;time1[i]=time1[i]+tmp*16;}writebyte(0x8e,0x00);//关闭写保护writebyte(0x80,0x80);// 暂停writebyte(0x8c,time1[1]);// 年写入writebyte(0x88,time1[2]);//月写入writebyte(0x86,time1[3]);// 日写入//些时间writebyte(0x84,time1[4]);// 时写入writebyte(0x82,time1[5]);// 分写入writebyte(0x80,time1[6]);// 秒写入writebyte(0x8a,time1[7]);// 周写入//writebyte(0x80,0x00);// 秒写入writebyte(0x8e,0x80);//打开写保护}void readtime(void) //读取时间函数{ unsigned char i,tmp;time1[1]=readbyte(0x8d);// 年读time1[2]=readbyte(0x89);// 月读time1[3]=readbyte(0x87);// 日读// 读时间time1[4]=readbyte(0x85);// 时time1[5]=readbyte(0x83);// 分time1[6]=readbyte(0x81);// 秒time1[7]=readbyte(0x8b);// 周for(i=0;i<8;i++) //BCD处理{ tmp=time1[i]/16;time[i]=time1[i]%16;time[i]=time[i]+tmp*10;}}void Display(unsigned char FirstBit,unsigned char Num) //动态显示函数{ static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0; i++;if(i==Num) i=0;}unsigned char key(void) //键盘读取函数{ unsigned char i;if(P3!=0xff){ delay(10); if(P3!=0xff){ i=P3; while(P3!=0xff) ;switch(i){case 0xfe:return 1;break;case 0xfd:return 2;break;case 0xfb:return 3;break;default:return 0;break;}}}return 0;}void T1_rest() //定时器1的初始化函数{TMOD|=0X10;TH1=0XF8;TL1=0X30;EA=1 ;ET1= 1;TR1=1;}void isr0(void) interrupt 3{static unsigned char qq;TR1=0; TH1=0XF8; TL1=0X30;Display(0,8); //送去显示qq++;if(qq==200){ qq=0,readtemflag=1; } TR1=1; }void main(){unsigned char bian=0,k=0;unsigned char num=6;unsigned int h,l,tempp,year;bit nianflag; restds1302(); writetime(); T1_rest();while(1){readtime(); year=time[1]*200;if(year%4==0&&year%100!=0||year%400==0) nianflag=1;else nianflag=0; k=key();if(k!=0){ if(k==1){ bian++;num=6; k=0; }//调节显示的内容if(bian==3) bian=0;if(k==2){ num--;if(num<4) bian=1;if(num>3) bian=0; //选着调节对象分,时,年月日if(num==0) num=6; k=0;}if(k==4&&num!=6) //调节对象(分时年月日)加一{ time[num]++;if(num==5&&time[num]==60) time[num]=0;if(num==4&&time[num]==24) time[num]=0;if(num==3&&nianflag){if(time[3]>yunnian[time[2]]) time[3]=1;}else if(num==3){ if(time[3]>pingnian[time[2]])time[3]=1;}if(num==2&&time[num]==13) time[num]=1;if(num==1&&time[num]==99) time[num]=0; k=0;}if(k==3&&num!=6) //调节对象(分时年月日)减一{ time[num]--;if(time[num]==-1&&num==5) time[num]=59;if(time[num]==-1&&num==4) time[num]=23;if(num==3&&nianflag){ if(time[3]==0) time[3]=yunnian[time[2]]; }else if(num==3){ if(time[3]==0) time[3]=pingnian[time[2]]; }if(time[num]==0&&num==2) time[num]=12;if(time[num]==-1&&num==1) time[num]=99; k=0;}if(nianflag){ if(time[3]>yunnian[time[2]]) time[3]=1;}else { if(time[3]>pingnian[time[2]]) time[3]=1; }writetime();}if(bian==0) //对时,分,秒,显示数据分离处理{TempData[0]=DuanMa[time[4]/10];TempData[1]=DuanMa[time[4]%10];TempData[2]=0x40; //加入"-"TempData[3]=DuanMa[time[5]/10];//分TempData[4]=DuanMa[time[5]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[6]/10];//秒TempData[7]=DuanMa[time[6]%10];if(num!=6){ delayms(30);if(num==4){ TempData[0]=0; TempData[1]=0; delayms(30); }if(num==5){ TempData[3]=0; TempData[4]=0; delayms(30); }}}else if(bian==1) //对年月日的显示数据分离处理{ TempData[0]=DuanMa[time[1]/10]; TempData[1]=DuanMa[time[1]%10];TempData[2]=0x40;//加入"-"TempData[3]=DuanMa[time[2]/10];//月TempData[4]=DuanMa[time[2]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[3]/10];//日TempData[7]=DuanMa[time[3]%10];if(num!=6){ delayms(30);if(num==1){ TempData[0]=0;TempData[1]=0;delayms(30); }if(num==2){ TempData[3]=0;TempData[4]=0;delayms(30); }if(num==3){ TempData[6]=0;TempData[7]=0;delayms(30); }}}else if(bian==2) //对温度和星期的显示数据分离处理{if( readtemflag==1){ tempp=ReadTemperature();readtemflag=0;}if(tempp&0x8000){ TempData[0]=0x40;//负号标志tempp=~tempp; tempp +=1;}elseTempData[0]=0;h=tempp>>4; l=tempp&0x0F; l=l*6/10;//小数近TempData[1]=DuanMa[(h%100)/10]; //十位温度TempData[2]=DuanMa[(h%100)%10]|0x80; //个位温度,带小数点TempData[3]=DuanMa[l];TempData[4]=0x39; TempData[5]=0;TempData[6]=DuanMa[time[7]/10];TempData[7]=DuanMa[time[7]%10];}}}参考文献【1】Brian W.Kernighan,Dennis M.Ritchie.C.程序设计语言.机械工业出版社,机械工业出版社,2004.1.【2】祁伟,杨婷.单片机C51程序设计教程与实验,北京航空航天大学出版社,2006.1. 【3】梅丽凤,郝万新.单片机原理及应用,清华大学出版社,2009.7.【4】18B20数据手册.【5】DS1302数据手册.。

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

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

设计研发2021.07基于51单片机的多功能电子时钟设计杨洁,叶晶晶(黔南民族师范学院物理与电子科学学院,贵州都匀,558000 )摘要:单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、深受初学者喜欢。

以STC90C58为核心控制芯片,DS1302为时钟芯片,DS18B20釆集温度,完成多功能电子时钟的设计。

该设计能够准确显示年、月、日、星期、时、分、秒及温度,通过按键可以调整年、月、日、星期、时、分、秒、12/24小时转换、整点提示以及闹钟,还可显示阴阳历。

关键词:电子时钟;单片机;阴阳历转换;DS1302 ; DS18B20Design of Multi-function Clock Based on 51 MCUYang Jie, Ye Jingjing(College of physics and electronic science, Qiannan Normal University for N&tionalities, DuyunGuizhou, 558000)Abstract : MCU is small in size, light in weight, strong in anti-interference ability, low in environmentai requirements, low in price, high in reliability, good in flexibility, and is popular among beginners. Stc90c58 as the core control chip, DS1302 as the clock chip, DS18B20 temperature acquisition, complete the design of multi —functional electronic clock. The design can accurately display the year, month, day, week, hour, minute, second and temperatore. Through the button, you can adjust the year, month, day, week, hour, minute, second, 12/24-hour conversion, whole point prompt and alarm clock, and display the lunar calendar.Keywords : Electronic clock ; MCU ; The lunar conversion ; DS 1302 ; DS18B200引言目前单片机的使用已经十分广泛,本次设计的多功能电 子钟能完成年、月、日、星期、时、分、秒的显示与调整,并且还 添加了温度、阴阳历转换显示及闹钟、12/24小时转换、整点提示等功能,有较强的应用性。

基于51单片机电子时钟设计

基于51单片机电子时钟设计

基于51单片机电子时钟设计51单片机是一种非常常见的单片机,被广泛应用于各种电子设备中。

在本文中,我将基于51单片机设计一个电子时钟。

首先,我们需要收集各种元器件,包括51单片机、数码管显示模块、电容、电阻、晶体振荡器等。

接下来,我们将进行硬件连接。

首先,将数码管显示模块连接到单片机的相应引脚上。

数码管显示模块通常由多个七段数码管组成,每个七段数码管有共阴极和共阳极两种类型,根据具体的数码管型号选择适当的连接方式。

接下来,连接晶体振荡器到单片机上。

晶体振荡器通常用于提供时钟信号,给单片机提供准确的时钟频率。

选择适当的晶体振荡器频率,将其连接到单片机的相应引脚上。

同时,还需要连接其他的元件,如电容和电阻。

电容用于稳定电压,在电路中通常用作滤波器。

选择合适的电容,将其连接到电源引脚上。

电阻用于限制电流和调整电压,根据需要选择合适的电阻值,并将其连接到相应的引脚上。

接下来,我们将进行软件编程。

首先,我们需要在编程环境中选择适当的编程语言,比如C语言。

然后,我们需要编写代码来实现时钟的各种功能。

首先,我们需要初始化单片机的引脚。

这可以通过设置相应的寄存器来实现,以确保单片机正常工作。

接下来,我们需要编写代码来实现时钟的显示功能。

我们可以使用循环来不断刷新数码管显示,以确保显示的时钟数值实时更新。

可以通过读取单片机内部的计时器或使用外部的定时模块来获取当前的时间,并将其转换为数码管可以显示的格式。

除了显示功能之外,还可以添加其他功能,比如闹钟、定时器等。

闹钟功能可以通过检测当前时间和设置的闹钟时间来触发相应的提醒。

定时器功能可以用来设置特定的时间间隔,并在到达设定时间时触发相应的操作。

总结起来,基于51单片机设计一个电子时钟需要进行硬件连接和软件编程。

通过合理的硬件连接和编写精确的代码,我们可以实现一个功能齐全的电子时钟,满足各种需求。

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计

基于51单片机的电子时钟设计
电子时钟是一种使用电子元件和计算机技术制造的时计,它可以显示年、月、日、时、分、秒等时间信息,并且具有显示精确、功能齐全、操
作简便等特点。

本文将基于51单片机设计一个电子时钟。

一、硬件设计:
1.时钟模块:我们可以使用DS1302时钟模块作为实时时钟芯片,它
可以提供精确的时间信息,并且可以通过单片机与之进行通信。

2.显示模块:我们可以使用共阳数码管进行时间的显示,将时钟设计
成6位7段显示器。

3.按键模块:我们可以使用按键作为输入方式,通过按键调整时间信息。

二、软件设计:
1.初始化:首先,我们需要初始化时钟模块和显示模块,使它们正常
工作。

同时,设置时钟的初始时间为系统当前时间。

2.获取时间:通过与时钟模块的通信,获取当前的时间信息,包括年、月、日、时、分、秒等。

3.显示时间:将获取到的时间信息通过显示模块显示出来,分别显示
在6个数码管上。

4.时间调整:通过按键模块的输入,判断用户是否需要调整时间。


果需要,可以通过按键的不同组合来调整时、分、秒等时间信息。

5.刷新显示:通过不断更新显示模块的输入信号来实现时钟的流动性,保持秒针不断运动的效果。

6.时间保存:为了保证时钟断电后依然能够保持时间,我们需要将时
钟模块获取到的时间信息保存在特定的EEPROM中。

7.闹钟功能:可以通过按键设置闹钟,当到达闹钟时间时,会通过蜂
鸣器发出响声。

以上就是基于51单片机的电子时钟设计方案。

通过对硬件和软件的
综合设计,我们可以实现一个功能齐全的电子时钟。

基于51单片机定时器的电子时钟设计

基于51单片机定时器的电子时钟设计

基于51单片机定时器的电子时钟设计电子时钟是一种集计时、显示时间等功能于一体的电子设备。

它可以准确地显示当前的时间,并通过定时器控制乃至更新时间。

本文将介绍基于51单片机定时器的电子时钟设计。

设计步骤如下:步骤一:硬件设计首先,需要准备以下硬件元件:1.51单片机:作为主要控制单元;2.DS1302实时时钟芯片:用于计时和保存时间数据;3.16x2字符LCD显示屏:用于显示时间;4.4x4矩阵键盘:用于调整时间和设置闹钟;5.蜂鸣器:用于报时功能;6.电位器:用于调整LCD背光亮度。

将这些硬件元件按照电路图连接起来,注意正确连接引脚和电源。

步骤二:软件设计在51单片机上编写程序,实现以下功能:1.初始化:a.初始化DS1302实时时钟芯片,设置初始时间;b.初始化LCD显示屏;c.初始化矩阵键盘;2.获取时间:a.从DS1302芯片读取当前时间;3.显示时间:a.将时间数据转换为字符,并在LCD上显示出来;4.键盘输入:a.监测矩阵键盘输入,判断用户按下的是哪个键;b.根据不同的键,执行相应的操作,如设置时间、设置闹钟等;5.闹钟功能:a.设置闹钟时间,当当前时间与闹钟时间相同时,触发蜂鸣器报时;b.可以通过按键来设置闹钟时间和开启/关闭闹钟功能。

以上是基本的电子时钟功能,可以根据实际需求进行扩展和添加其他功能。

步骤三:测试与调试步骤四:优化与扩展在基本功能正常运行的基础上,可以对电子时钟进行优化和扩展。

添加一些实用的功能,如温湿度显示、日期显示、闹钟音乐选择等,以提高电子时钟的实用性和用户体验。

总结:本文介绍了基于51单片机定时器的电子时钟设计步骤,包括硬件设计和软件编程。

通过该设计,可以实现准确显示时间、调整时间、设置闹钟等功能。

为了使电子时钟更加实用,可以根据需要进行优化和扩展。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录摘要 (2)Abstract (3)1.设计目的 (4)2.设计任务 (4)2.1.任务1:开机界面的设置 (4)2.2.任务2:LCD-1602显示日期时间 (4)2.3.任务3:时间与日期的调整 (4)3.硬件设计 (4)3.1.STC89C51(51单片机) (4)3.2.LCD-1602液晶显示屏 (5)4.软件设计 (7)4.1.应用软件 (7)4.2.程序框图 (7)4.3.使用说明 (7)4.4.注意事项 (8)4.5.调试结果 (8)5.收获 (9)附录: (10)附录A.硬件图 (10)附录B.主要程序 (11)摘要电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。

本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。

硬件由主控器、显示电路、键盘接口等三个模块组成。

该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。

软件利用C语言编程实现单片机的控制功能。

关键词:电子时钟、单片机、LCD-1602液晶显示AbstractElectronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button. Software uses C language programming microcontroller control functions.Key words: electronic clock, single chip microcomputer,LCD-1602 liquid crystal display1.设计目的该电子时钟由C语言编写而成,利用单片机定时器控制时钟运行,实现按键调整时间和日期的功能。

2.设计任务2.1.任务1:开机界面的设置上电显示开机界面,“King.G”闪烁两次,之后进入主界面。

2.2.任务2:LCD-1602显示日期时间采用双行显示,第一行显示“2015-11-11”第二行显示“08-00-00”并且开始跑表。

2.3.任务3:时间与日期的调整采用三个独立按键,按下功能键,定时器暂停,光标开启并在秒数位置闪烁,其他两个按键可对秒数进行加减操作。

每按一次功能键,光标依次从秒数移至年历数,当光标显示在何位置时,其他两个按键可对该位置的数值进行调整,调整结束,定时器开启。

3.硬件设计3.1.STC89C51(51单片机)STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8K Bytes的可反复擦写1000次的Flash 只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。

STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路0。

具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选0。

图3.1.1 89C51控制模块3.2.LCD-1602液晶显示屏LCD1602液晶显示器0是目前广泛使用的一种字符型液晶显示模块。

它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。

为了降低成本,现在绝大多数制造商都直接将裸片做到本子上。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

图3.2.1 LCD1602显示模块序指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0 号1 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D s4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *0 0 0 1 字符发生存贮器地址7 置字符发生存储器地址8 置数据存贮器0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址1 0 要写的数据内容10 写数到CGRAM或DDRAM11 从CGRAM或1 1 读出的数据内容DDRAM读数表3.2.2 1602控制指令开始初始化单片机数据处理按键按下 LCD -1602液晶显示判断调整条件4. 软件设计4.1. 应用软件软件运行环境:KEIL UV4 PROTEUS 7.5本设计软件涉及KEIL UV4、STC 烧录软件,由KEIL UV4编写C 语言程序以及进行调试,由STC 烧录软件将调试好的程序下载入单片机中。

4.2. 程序框图图4.2.1 程序框图程序开始后,先进入初始化,定时器打开,LCD 液晶显示模式设置,单片机循环进行数据处理,此时,LCD-1602显示时间。

若按键按下,判断调整条件,经单片机处理后,液晶显示数据更换,以达到调整时间的目的。

4.3. 使用说明按下功能键,进入时间、日期调整界面,依次按下可逐个调整秒、分、时、日、月、年。

调整结束后,再次按下功能键可恢复时间界面。

加数键,可以增加位数上的数值;减数键可减少位数上数值。

增加和减少需要在时间调整下可以使用,在不调整时间的情况下,两个按键均无法使用。

时间日期调整范围2000年1月1日00:00:00-2099年12月31日23:59:59。

4.4.注意事项该时钟是采用单片机及C语言逻辑控制的。

缺少闰年2月29天的补偿功能。

4.5.调试结果如图4.5.1所示,当不进行操作时,时间正常运行;如图4.5.2所示当按下调整时间功能键时,时间暂停且光标开启,此时可增加或减少光标所在位的数值。

图4.5.1 时间运行界面图4.5.2 调整时间界面5.收获经过本次的设计,深入了解了单片机I/O口的使用,学会使用数据手册来查阅LCD-1602的使用。

对于按键扫描更加的了解。

对单片机学习过程中的定时器,中断系统一级单片机各引脚的功能有了更加深入的了解。

参考文献:[1] 李叶紫,等.MCS-51单片机应用教程[M].北京:清华大学出版社,2004.[2] 张培仁.MCS-51单片机原理与应用[M].北京:清华大学出版社,2003.[3] 朱华光.浅议LCD1602的编程技巧[J].电脑知识与技术,2010,6(18).附录:附录A.硬件图附录B.主要程序#include<reg52.h>#include<intrins.h>sbit RS = P2^2; //定义端口sbit RW = P2^3;sbit EN = P2^4;sbit KEY_function=P3^4;sbit KEY_ADD=P3^5;sbit KEY_DEC=P3^6;sbit key4=P3^7;sbit DUAN=P2^6;//定义锁存使能端口段锁存sbit WEI=P2^7;// 位锁存#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char t,s,f,m,b,n,y,r; unsigned char flag=0;void DelayUs2x();void DelayMs();bit LCD_Check_Busy();void LCD_Write_Com();void LCD_Write_Data() ;void LCD_Clear();void LCD_Write_String() ;void LCD_Write_Char();void LCD_Init();unsigned char KeyScan (void ){if(!KEY_function){DelayMs(10);if(!KEY_function){flag++;while(!KEY_function); if(flag==1){TR1=0;LCD_Write_Com(0xC0+10); LCD_Write_Com(0x0f);}if(flag==2){LCD_Write_Com(0xC0+7); }if(flag==3){LCD_Write_Com(0xC0+4); }if(flag==4){LCD_Write_Com(0x80+11); }if(flag==5){LCD_Write_Com(0x80+8); }if(flag==6){LCD_Write_Com(0x80+5); }if(flag==7){flag=0;LCD_Write_Com(0x0c);TR1=1;}}}if(flag!=0){if(!KEY_ADD){DelayMs(10);if(!KEY_ADD){while(!KEY_ADD);if(flag==1){m++;if(m==60)m=0;LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Com(0xC0+10);}if(flag==2){f++;if(f==60)f=0;LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Com(0xC0+7);}if(flag==3){s++;if(s==24)s=0;LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30); LCD_Write_Com(0xC0+4);}if(flag==4){r++;if(r==32)r=1;LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); LCD_Write_Com(0x80+11);}if(flag==5){y++;if(y==13)y=1;LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Com(0x80+8);}if(flag==6){n++;if(n==100)n=0;LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30); LCD_Write_Com(0x80+5);}}}if(!KEY_DEC){DelayMs(10);if(!KEY_DEC){while(!KEY_DEC);if(flag==1){m--;if(m==-1)m=59;LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Com(0xC0+10);}if(flag==2){f--;if(f==-1)f=59;LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Com(0xC0+7);}if(flag==3){s--;if(s==-1)s=23;LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30); LCD_Write_Com(0xC0+4);}if(flag==4){r--;if(r==0)r=31;LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); LCD_Write_Com(0x80+11);}if(flag==5){y--;if(y==0)y=12;LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Com(0x80+8);}if(flag==6){n--;if(n==-1)n=99;LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30); LCD_Write_Com(0x80+5);}}}}return 0;}/*主函数*/void main(){LCD_Init();LCD_Clear();LCD_Write_String(5,0,"King.G"); DelayMs(500);LCD_Clear();DelayMs(500);LCD_Write_String(5,0,"King.G"); DelayMs(500);LCD_Clear();DelayMs(500);LCD_Write_String(3,0,"2015-11-11"); LCD_Write_String(4,1,"08:00:00"); while (1){KeyScan();}}void time() interrupt 3{TH1=0x3c;TL1=0xb0;t++;if(t==20){ t=0;m++;if(m==60){m=0;f++;}if(f==60){f=0;s++;}if(s==24){s=0;r++;}if(r==32&&y==1) {r=1;y++;}if(r==29&&y==2) {r=1;y++;}if(r==32&&y==3) {r=1;y++;}if(r==31&&y==4) {r=1;y++;}if(r==32&&y==5) {r=1;y++;}if(r==31&&y==6) {r=1;y++;}if(r==32&&y==7) {r=1;y++;}if(r==32&&y==8) {r=1;y++;}if(r==31&&y==9) {r=1;y++;}if(r==32&&y==10) {r=1;y++;}if(r==31&&y==11) {r=1;y++;}if(r==32&&y==12) {r=1;y++;}if(y==13){y=1;n++;}if(n==100){n=0;}LCD_Write_Char(4,1,s/10+0x30); LCD_Write_Char(5,1,s%10+0x30);LCD_Write_Char(7,1,f/10+0x30); LCD_Write_Char(8,1,f%10+0x30); LCD_Write_Char(10,1,m/10+0x30); LCD_Write_Char(11,1,m%10+0x30); LCD_Write_Char(5,0,n/10+0x30); LCD_Write_Char(6,0,n%10+0x30);LCD_Write_Char(8,0,y/10+0x30); LCD_Write_Char(9,0,y%10+0x30); LCD_Write_Char(11,0,r/10+0x30); LCD_Write_Char(12,0,r%10+0x30); }}20。

相关文档
最新文档