程序简洁的单片机6位数字钟
单片机课程设计数字钟实验报告

单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。
2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。
3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。
4、能够实现按键启动与停止功能。
5、能够实现整点报时功能。
6、能够实现秒表功能。
二、设计思路1、芯片介绍VCC:电源。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,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口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。
单片机制作的6位数字钟

单片机制作的6位数字钟常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。
时钟的基本显示原理:时钟开始显示为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秒定时用初值(50MS×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 ET0 ;关T0中断允许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秒时对秒计时单元清0 MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0 MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0 OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断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不显示)状态。
单片机闹钟设计程序报告

单片机闹钟设计程序报告1. 引言闹钟作为人们日常生活中的常用物品,不仅有叫醒人们起床的功能,还可以作为提醒的工具。
随着科技的进步,单片机闹钟逐渐取代了传统的机械闹钟,成为人们生活中不可或缺的一部分。
本报告旨在介绍一个基于单片机的简单闹钟设计程序。
2. 设计方案本设计方案使用了单片机和数码管作为主要硬件,通过对单片机的编程,实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
2.1 硬件设计硬件方面,本设计基于某型号的单片机和数码管。
单片机通过相关的引脚与数码管相连,通过控制引脚的电平来显示不同的数字。
2.2 软件设计软件方面,本设计使用C语言编程实现。
主要的功能包括获取当前时间、显示时间、设置时间、设置闹钟时间、闹钟触发检测、蜂鸣器报警等。
3. 程序实现3.1 初始化设置在程序的开始部分,需要对单片机进行初始化设置。
包括设置引脚的输入输出模式、设置计时器、设置中断等。
3.2 时间显示为了实现时间显示的功能,我们需要通过单片机的计时器来不断获取当前时间,并将其转换为时、分、秒的格式。
然后通过数码管显示出来。
3.3 时间设置通过给单片机的某个引脚接入按钮,实现时间设置功能。
当按钮被按下时,单片机进入时间设置模式。
此时,用户可以通过另外的按钮来逐个调整时、分、秒的数值。
3.4 闹钟时间设置类似于时间设置,闹钟时间设置也需要通过按钮来实现。
用户可以按下对应的按钮来设置闹钟的时、分,设置完毕后,单片机会将设置的时间保存起来。
3.5 闹钟触发检测在每一次时间显示的循环中,程序都会检测当前时间是否与闹钟时间相符。
如果相符,则触发闹钟,蜂鸣器开始报警。
3.6 蜂鸣器报警通过单片机的一个输出引脚,连接到蜂鸣器,实现蜂鸣器的报警功能。
当闹钟触发时,单片机会给对应的引脚输出一个高电平,从而使蜂鸣器发声。
4. 总结通过对单片机闹钟设计程序的实现,我们成功实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
基于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单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
基于单片机控制的电子时钟设计(完整版图纸直接可用)

中图分类号:基于单片机控制的电子时钟设计专业名称:应用电子技术****:***导师姓名:王春霞职称:讲师焦作大学机电工程学院2012年 12 月中图分类号:密级:UDC:单位代码:基于单片机控制的电子时钟设计Based on single-chip microcomputer control the design of the electronic clock焦作大学机电工程学院摘要现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确显示到秒。
所以数字电子钟的精度、稳定度远远超过老式机械钟。
而机械式的依赖于晶体震荡器,可能会导致误差。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,并在数码管上显示相应的时间。
关键词:单片机 AT89S51 电子时钟ABSTRACTModern life people pay more and more attention to up the concept of time, can say time and money off the equal sign. For those who grasp of time is very strict and accurate person or thing, it is not accurate time will bring very big trouble, so to digital tube for display clock than pointer clock showed a lot of advantages. Digital tube display time simple and fast reading, time accurate display to seconds. So the digital clock accuracy, stability is far more than the old mechanical clock. And mechanical dependent on the crystal oscillators, may lead to error. In this design, we adopt LED digital tube display, points, SEC to 24 hours time way, according to the principle of dynamic display of digital tube to show that AT89S51 chip as the core, with the necessary circuit, design a simple electronic clock, it consists of 4.5 V dc power supply, through the digital tube can accurately display the time, adjusting time, and in the digital tube display the corresponding time.Key word:SCM AT89S51 electronic clock目录第一章引言 (1)1.1数字电子钟的背景 (1)1.2数字电子钟的意义 (1)1.3数字电子钟的应用 (1)第二章设计方案 (3)2.1数字时钟方案 (3)2.2数码管显示方案 (3)第三章系统设计 (4)3.1总体设计 (4)3.2单片机外围控制电路 (4)3.2.1单片机的选择 (4)3.2.2控制电路 (6)3.2.3电源部分 (7)3.2.4复位电路 (8)3.2.5程序下载接口 (8)3.2.6位选部分 (9)3.2.7数码管的连接电路 (9)第四章软件设计 (11)4.1程序流程图 (11)4.2源程序 (13)第五章使用调试 (20)第六章设计总结 (21)参考文献 (22)附录 (23)致谢 (24)第一章引言1.1数字电子钟的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
单片机电子时钟课程设计设计报告

单片机电子时钟设计一、作品功能介绍该作品是个性化电子钟设计,技术上主要用单片机(AT89S52)主控,6位LED数码显示,分别显示“小时:分钟:秒”。
该作品主要用于24小时计时显示,能整时报时,能作为秒表使用,能定时闹铃1分钟。
功能介绍:(1)上电以后自动进入计时状态,起始于00:00:00。
(2)设计键盘调整时间,完成时间设计,并设置闹钟。
(3)定时时间为1/100秒,可采用定时器实现。
(4)采用LED数码管显示,时、分,秒采用数字显示。
(5)采用24小时制,具有方便的时间调校功能。
(6)具有时钟和秒表的切换功能。
使用方法:开机后时钟在00:00:00起开始计时。
(1)长按进入调分状态:分单元闪烁,按加1,按减1.再长按进入时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。
(2)(2)按进入设定闹时状态: 12:00: ,可进行分设定,按分加1,再按为时调整,按时加1,按调闹钟结束.在闹铃时可按停闹,不按闹铃1分钟。
(3)按下进入秒表状态:再按秒表又启动,按暂停,再按秒表清零,按退出秒表回到时钟状态。
二、电路原理图如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模块、按键模块等组成。
电子时钟原理图各个模块设计1.单片机系统 AT89S52 AT89S52概述:是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。
AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
数字时钟_89C52_单片机C语言程序

uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */
简易电子钟设计范文

简易电子钟设计范文电子钟是一种通过电子技术实现时间显示的设备。
它通常由一个数字显示屏,一个控制电路和一个电源组成。
其主要功能是显示小时、分钟和秒钟等时间信息,可以准确地显示时间,并可以根据需要设置闹铃功能。
设计一款简易电子钟可以使用Arduino等开发板或单片机来实现。
首先,我们需要选择一块合适的数字显示屏。
常见的数字显示屏有数码管和液晶显示屏两种类型,它们的显示原理和控制方式有所不同。
如果选择数码管作为显示屏,可以考虑使用常见的7段数码管,它由八个LED灯组成,可以显示0-9的数字以及一些字母和特殊符号。
数码管的控制方式是通过控制每个LED灯的亮灭来实现显示,可以使用数字输出口来控制。
Arduino的数字输出口可以输出高电平(5V)和低电平(0V),通过控制输出口的电平,就能够控制数码管的亮灭。
如果选择液晶显示屏作为显示器,可以选择字符型液晶显示屏或者图形型液晶显示屏。
字符型液晶显示屏通常可以显示一些字符或者数字,它的控制方式是通过并行或者串行接口来控制,可以使用开发板的GPIO口来实现。
图形型液晶显示屏可以显示更多的信息,它的控制方式是通过SPI接口或者I2C接口来控制,这需要相应的驱动库或者芯片来实现。
无论选择数码管还是液晶显示屏,我们都需要编写程序来控制显示。
程序的核心是一个循环,其中使用时钟模块来获取当前的时间,并使用相应的控制方式将时间信息显示在显示屏上。
如果需要设置闹铃功能,可以在循环中判断当前时间和设置的时间是否相等,如果相等则触发闹铃。
设计一个简易电子钟的完整步骤如下:1. 选择适合的开发板或者单片机,例如Arduino。
2.选择合适的显示屏,例如7段数码管或者液晶显示屏。
3.连接显示屏到开发板,根据显示屏的类型选择合适的引脚连接方式。
4.编写代码来控制显示屏显示时间信息。
5.添加时钟模块,用来获取当前的时间信息。
6.根据需要添加闹铃功能。
7.测试电子钟的功能和性能,不断优化改进。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序简洁的单片机6位数字钟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位共阳极动态扫描数码管,数码管的段位并联接在51单片机的p0口,控制位分别由6个2N5401的PNP三极管作驱动接在单片机的p2.1,p2.2,p2.3,p2.4,p2.5,p2.6口。
从标号star开始把这些位全部清除为0,从而保证了开始时显示时间为0时0分0秒。
然后是程序的计算部分: inc a_bit(秒位),这里用到了一个inc指令,意思是加1,程序运行到这里自动加1。
然后把加1后的数据送acc:mov a,a_bit (秒位),这时出现了一个问题,如果不断往上加数字不会加爆?所以有了下面的一句话cjne a,#10,stlop; 如果秒位到10那么转到10秒处理程序。
cjne是比较的意思,比较如果a等于10 就转移到10秒处理程序,实际上也就限定了在这里a的值最大只能为9,同时 mov a_bit,#00h,这时 a_bit(秒位)被强行清空为0,又开始下一轮的计数。
秒位处理完了到下面10秒的处理程序:inc b_bit,把10秒位b_bit加1,由于程序开始对各位的寄存器已经清0,这时10秒位就变成1 ,然后同样送到累加器ACC:mov a,b_bit 现在开始新一轮的10秒位计数cjne a,#6,stlop ;如果10秒到了6那么到分位处理程序。
也就限定了10秒位最多显示5。
下面的部分分位,十分位,小时位,十小时位的计算方法与上面的类似,应当不难领会。
计算部分完成后,最终要把结果送到数码管显示,这一部分电路上采用最简洁的并联型动态扫描接法。
其基本原理是利用人眼的视觉暂留效应,在6个数码管上依次送需要显示的数字,然后依次打开各个数码管,并不断循环,如果速度足够快,我们看到就是一串连续的数字,而不是各个独立的数字。
但是必须注意,实际上单片机是逐个往各个数码管送数据的。
明白了这个原理,我们就不难理解下面的程序。
首先看秒位的显示程序:dplop: mov a,a_bit ;把秒位(a_bit)送到寄存器A。
MOVC A,@A+DPTR 根据取到的值到指定的地址取数,意思是假如此时a_bit (秒位)的值是2,那么到数据表的第三个位置去取数,取到的值则是0a2h。
这里或者有人会问为什么不是第2个位置呢?没错,因为开始程序就已经把各个位清0,第一次运行时显示的是0,第二次运行显示1,第3次运行则为2。
而mov p0,a (送出个位的7段代码)硬件上数码管的段位接在P0口。
0A2H也就是数码管显示2的代码了。
这时,数码管还没有显示。
由于他们是并联的,我们必须指定哪一个数码管亮。
clr p2.6把P2.6端口打开也就是秒位,此时秒位的数码管亮了。
亮了以后,是不是不管他了呢?当然不是,还要指定他亮多长的时间。
假定是1毫秒,后面就有了acall d1ms(调用1毫秒时间);完成后再关闭这个数码管:setb p2.6。
程序进行到这里,然后继续扫描10秒位b_bit,过程也是先查表,取数,送显示,开十秒位数码管,延时1毫秒,关闭显示。
下面的部分分位,十分位,小时位,十小时位的显示方法与上面的相同。
大家自行领会。
可能大家会问程序漏了一个地方没有讲,r0,r1寄存器在这里器什么作用?这里还是要从动态扫描讲起。
我们是以1秒位为基准的,但是整个显示部分每秒钟轮流扫描一次,显然就不能达到要求。
视觉暂留特性告诉我们,至少每秒显示30次以上人眼睛才不会有闪烁感,所以我们在这里把显示程序的首位段使用了r0,r1作扫描次数的计数器,分别送4,和250,相乘得1000,然后再显示程序的尾段加上以下代码 djnz r1,dplop ;100次没完循环djnz r0,dpl1 ;4个100次没完循环,这样总共显示1000次,人眼就不会感觉到显示闪烁的问题了。
程序的最后是1毫秒的延时子程序和7段数码管各划的数字排列表,如果走时的时间不准,可以适当调整1毫秒的延时子程序的数值,直到准确。
程序的扩展1:改动计算部分 cjne a,#6,stlop全部改为cjne a,#10,stlop,那么就变成了一个6位的计数器。
所有位都是从0到9依次显示。
程序的扩展2:改动的计数器不能受外界的控制,因此没有实际意义。
那么可已通过一个按键来进行控制,每按一次按键数字加一,那么可以在程序的计算部分增加几行判断按键的代码:stlop: acall display ;调用显示jb p3.2,stlop ;监测键盘,如果p3.2按下那么执行显示we: acall display ;显示保持!acall d1ms ;延时1ms避免键盘误动作jnb p3.2,we ;如果p3.2还没有放开继续延时那么就可以通过按键来实现计数显示的功能了,由p3.2端口作控制,每按键一次程序加1。
完整的程序清单:org 00ha_bit equ 30h ;秒寄存器b_bit equ 31h ;10秒寄存器c_bit equ 32h ;分寄存器d_bit equ 33h ;10分寄存器e_bit equ 34h ;小时寄存器f_bit equ 35h ;10小时集存器org 0000hajmp starorg 0030hstar:mov a,#00h ;把各个位全部清0mov a_bit,amov b_bit,amov c_bit,amov d_bit,amov e_bit,amov f_bit,astlop: acall display ;程序的计算部分inc a_bit ;秒位加1mov a,a_bit ;送acjne a,#10,stlop;如果秒到10那么转到10秒处理mov a_bit,#00h ;秒位清0inc b_bit ;10秒位加1mov a,b_bit ;送acjne a,#6,stlop ;如果10秒到了6那么到分处理mov b_bit,#00h ; 10秒位清0inc c_bitmov a,c_bitcjne a,#10,stlopmov c_bit,#00hinc d_bitmov a,d_bitcjne a,#6,stlopmov d_bit,#00hinc e_bitmov a,e_bitcjne a,#10,stlopmov e_bit,#00hinc f_bitmov a,f_bitcjne a,#3,stlopmov f_bit,#00hajmp stlop ;重新开始计算display: ;显示子程序mov dptr,#numtab ;指定查表启始地址mov r0,#4dpl1: mov r1,#250 ;显示1000次dplop: mov a,a_bit ;取秒位的值MOVC A,@A+DPTR ;查秒位数的7段代码mov p0,a ;送出到P0口显示clr p2.6 ;开个位显示acall d1ms ;显示1mssetb p2.6 ;关闭显示mov a,b_bit ;取10秒位的值MOVC A,@A+DPTR ;查10秒位的7段代码mov p0,a ;送出10秒位到P0口显示clr p2.5 ;开10秒位显示acall d1ms ;显示1mssetb p2.5mov a,c_bit ;取分位MOVC A,@A+DPTR ;mov p0,a ;clr p2.4 ;acall d1ms ;setb p2.4mov a,d_bit ;取10分位MOVC A,@A+DPTR ;mov p0,a ;clr p2.3 ;acall d1ms ;setb p2.3mov a,e_bit ;取小时位MOVC A,@A+DPTR ;mov p0,a ;clr p2.2 ;acall d1ms ;setb p2.2mov a,f_bit ;取10小时位MOVC A,@A+DPTR ;mov p0,a ;clr p2.1 ;acall d1ms ;setb p2.1djnz r1,dplop ;100次没完循环djnz r0,dpl1 ;4个100次没完循环retD1MS: MOV R7,#20 ;1MS延时(按12MHZ算) DJNZ R7,$RET;7段数码管各划的数字排列表numtab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;0 1 2 3 4 5 6 7 8 9end。