1、登峰杯论文题 目:一种基于 C8051F410 芯片带校时功能的时钟 班 级: _09 电科_ 姓 名:_胡科迪_学 号:_一种基于 C8051F410 芯片带校时功能的时钟胡科迪(温州大学物理与电子信息工程学院,09 电科)摘要:本文主要介绍一种通过微处理器 C8051F410 来实现的、带有校时功能的时钟的设计和实现。它借助四个 8 段数码管来显示当前时间,包括分、秒以及分隔符号。该时钟工作稳定,误差较小。关键词:单片机,C8051F410,时钟,校时A Clock with the Function of Timing Based on Chip C8051F410Kedi Hu(Phy
2、sics and electronic information Engineering College of Wenzhou University, Electronic Information Science and Technology of 09)Abstract:This paper mainly introduce the design and realization of a clock with function of timing which is based on MCU C8051F410.It displays current time including minute,
3、second and separator with four eight-segment nixietubes.This clock works steadily with a low error.Keywords: single chip microcomputer,C8051F410,clock,timing.引言C8051F41x 器件是完全集成的低功耗混合信号片上系统型 MCU,它具有一下主要特性:1、 高速、流水线结构的8051兼容的微控制器核(可达50MIPS) 2、 高精度可编程的24.5MHz内部振荡器 3、 4个通用的16位定时器 4、 硬件实时时钟(smaRTClock),
4、工作电压可低至1V,带64字节电池后备RAM和后备稳压器 由于它内部有高精度可编程的振荡器,我们可以通过对其特殊功能寄存器(SFR)的配置,完成计数定时,配合中断系统,设计出一个可以校正时间的电子时钟。.硬件设计A 数码管及数字显示数码管是一种半导体发光器件,其基本单元是发光二极管,是单片机系统中最常用的一种显示输出,主要用于单片机控制中的数据输出和状态信息显示。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示) ,如图 1 所示;按能显示多少个“8”可分为 1 位、2 位、4 位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数
5、码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极 COM 接到+5V,当某一字段发光二极管的阴极为低电平时,3相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。 。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极 COM 接到地线 GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。图 1.八段数码管及其显示方式按照本设计要求,我们需要掌握数字 09 以及小数点的显示段码,参考图 2图 2.8 段 LED 数码
6、管字型字段编码表B 单片机电路原理图这里着重介绍单片机副板的原理图,如图 3 所示。8 脚的排针 J1 接入的八个电阻这里起到限流的作用,防止电流过大而烧坏数码管上的 LED 灯泡。4 个数码管的位置通过 CON4的四个引脚接入 C8051F410 的 I/O 端口来被单片机控制。图左下部分的 4 个按键这里用来校时。图 3. 副板电路原理图图 4 是整个单片机的连接实物图。图 4. 实物连接图5.代码设计A. 定时器 T0、T1C8051F41x 内部有 4 个 16 位计数器/定时器:其中两个与标准 8051 中的计数器/定时器兼容,另外两个是 16 位自动重装载定时器,可用于其他外设或作
7、为通用定时器使用。这些定时器可以用于测量时间间隔,对外部事件计数或产生周期性的中断请求。定时器0和定时器1有5个可选择的时钟源,由定时器时钟选择位(T1M-T0M)和时钟分频位(SCA1-SCA0)决定。时钟分频位定义一个分频时钟,作为定时器0和/或定时器1的时钟源。 定时器0和定时器1可以被配置为使用分频时钟或系统时钟。定时器2和定时器3可以使用系统时钟、系统时钟/12或外部振荡器时钟/8作为时钟源。 定时器 0 和定时器 1 可以工作在计数器方式。当作为计数器使用时,在为定时器所选择的输入引脚(T0 或 T1)上出现负跳变时计数器/定时器寄存器的值加 1。对事件计数的最大频率可达到系统时钟
8、频率的四分之一。输入信号不需要是周期性的,但在一个给定电平上的保持时间至少应为两个完整的系统时钟周期,以保证该电平能够被正确采样。计数器/定时器 T0、T1 都是一个 16 位的寄存器,在被访问时以两个字节的形式出现:一个低字节(TL0 或 TL1)和一个高字节(TH0 或 TH1) 。计数器/定时器控制寄存器(TCON)用于允许定时器 0 和定时器 1 以及指示它们的状态。通过将 IE 寄存器中的 ET0 位置 1 来允许定时器 0 中断,通过将 ET1 位置 1 来允许定时器 1 中断。这两个计数器/定时器都有四种工作方式,通过设置计数器/定时器方式寄存器(TMOD)中的方式选择位 T1M
9、1-T0M0 来选择工作方式,每个定时器都可以被独立配置。定时器 0 和定时器 1 几乎完全相同,有四种工作方式。在方式0,定时器0和定时器1被作为13位的计数器/定时器使用。图24.1给出了定时器0工作在方式0时的原理框图。下面介绍对定时器0的配置和操作。由于这两个定时器在工作上完全相同,定时器1的配置过程与定时器0一样。 TH0 寄存器保持 13 位计数器/定时器的 8 个 MSB,TL0 在 TL0.4-TL0.0 位置保持 5 个LSB。TL0 的高 3 位(TL0.7-TL0.5)是不确定的,在读计数值时应屏蔽掉或忽略这 3 位。作为 13 位定时器寄存器,计到 0x1FFF(全 1
10、)后再计一次将发生溢出,使计数值回到0x0000,此时定时器溢出标志 TF0(TCON.5)被置位并产生一个中断。方式 1 的操作与方式 0 完全一样,所不同的是计数器/定时器使用全部 16 位。用与方式 0 相同的方法允许和控制工作在方式 1 的计数器/定时器。这里我们选择工作方式 1,即16 位重载的方式。图 4 显示了工作方式 0 的原理。图 4.工作方式 0B. 按键问题经常会产生按键控制不稳定的现象,如显示为“5”时,按下K1 键一次,应该加一显示“6”,但显示“7”或“8”,甚至更多,为了保证工作稳定,我们添加代码来消去按键的抖动。其原理如图5所示。图5.消除按键抖动通常的按键所用
11、开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU 对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。7软件延时消抖:如果按键较多
12、,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms 的延时,待后沿抖动消失后才能转入该键的处理程序C 运行在Keil环境下的程序代码这里我们借助Keil uVision4的环境在实现本设计的功能。主要代码如下:下面是前面的宏定义部分,增加整个程序的可读性。#include code unsigned char led_710=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/LED显示代码c
13、ode unsigned char position4=0xfe,0xfd,0xfb,0xf7; /显示位置(改成4段)char time2,time_set2; / 时、分、秒计数和设置单元char dis_buff4; / 显示缓冲区,存放要显示的4 个字符的段码值char time_counter,key_stime_counter; / 时间计数单元,char clock_state = 4,return_time;bit point_on,set_on,time_1s_ok,key_stime_ok; /point_on秒显示标志#define SYSCLK /8 /时钟8分频#de
14、fine TIMER_TICKS_MS 2#define T2_RELOAD_CLOCKS SYSCLK/500 /2ms由前面宏定义的变量T2_RELOAD_CLOCKS可知,定时长度为1/500s,即2ms。定时部分程序,:void Timer2_Init(void)TMR2CN / Enable Timer2 in 16 auto-reload modeCKCON |= 0x10; / Timer2 uses SYSCLKTMR2RL = -T2_RELOAD_CLOCKS; TMR2 = TMR2RL; TMR2CN |= 0x04; /Start Timer2ET2 = 1; / T
15、imer2 interrupt enabled这里,posit以扫描的方式隔一定时间使4个数码管顺序轮流显示,但是扫描时间超出了人肉眼的分辨时间,所以它们看起来是处于常亮状态。P0来控制数码管的显示顺序,P1来控制单个数码管的显示字码。数码管显示程序如下:void display(void) static char posit=0;P0 = 0xff;P1 = led_7dis_buffposit;if (set_on / 校时闪烁if (point_on / 秒闪烁P0 = positionposit;if (+posit =4 )posit = 0;下段代码作用是把一个二位的十进制数的十位
16、和个位通过除10的取整取余得到十位数和个位数,再利用display(void)这个函数把它们转换成数码管上的显示段码。void time_to_disbuffer(char *time) / 时钟时间送显示缓冲区函数char i,j=0;for (i=0;i=5)key_stime_counter = 0;key_stime_ok = 1; / 10ms 到if (!(+time_counter % 25)9set_on = !set_on; / 设置校时闪烁标志if (time_counter = 100)time_counter = 0;time_1s_ok = 1; / 1s 到TF2H
17、 = 0;主程序主要部分:time_to_disbuffer(time);while (1)if (time_1s_ok) / 1 秒到time_1s_ok = 0;point_on = point_on; / 每1秒小数点闪烁标志if (+time0 = 60) / 秒加1,以下为时间调整time0 = 0;if (+time1 = 60)time1 = 0;if (+return_time = 10) if (clock_state = 4) time_to_disbuffer(time);if (clock_state != 4) if (clock_state = 1) time_se
18、t0 += 10;if (clock_state = 2) time_set1 += 1;if (clock_state = 3) time_set1 += 10;if (time_set0 = 60) time_set0-= 60; / 以下设置时间调整if (time_set1 = 60) time_set1-= 60;/以下省略时的调整time_to_disbuffer(time_set); / 设置时间送显示缓存.结果及结论通过C8051F410的仿真器,把在Keil 4下得到的代码载入芯片,实现了可以校正时间的电子时钟。每隔1S中间的分秒分隔小数点都会经历变暗或变灭,从而达到闪烁的效果。整个电子时钟工作稳定,按键校时功能可以按照预定地得到实现。但是由于指令周期考虑不全和硬件自身的原因易引起定时误差,该电子时钟存在着一定的误差,不过基本可以满足我们的设计要求。参考文献:1 潘琢金译.C8051F410/1/2/3 混合信号 ISP FLASH微控制器数据手册2 杨卫波.单片机原理与应用实践课程实验指导书.温州大学,20113 翟流顺.80C51单片机定时误差的分析.临沧师范高等专科学校学报,Vol.21 No.1 Apr.2011