登峰杯论文
题 目:一种基于C8051F410芯片带校时功能的时钟
班 级: _________09电科___________
* *:________***_____________
学 号:________***********________
一种基于C8051F410芯片带校时功能的时钟
胡科迪
(温州大学物理与电子信息工程学院,09电科)
摘要:本文主要介绍一种通过微处理器C8051F410来实现的、带有校时功能的时钟的设计和实现。它借助四个8段数码管来显示当前时间,包括分、秒以及分隔符号。该时钟工作稳定,误差较小。
关键词:单片机,C8051F410,时钟,校时
A Clock with the Function of Timing Based on Chip C8051F410
Kedi Hu
(Physics 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,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),工作电压可低至1V,带字节电池后备RAM和后备稳压器
由于它内部有高精度可编程的振荡器,我们可以通过对其特殊功能寄存器(SFR)的配置,完成计数定时,配合中断系统,设计出一个可以校正时间的电子时钟。
Ⅱ.硬件设计
A.数码管及数字显示
数码管是一种半导体发光器件,其基本单元是发光二极管,是单片机系统中最常用的一种显示输出,主要用于单片机控制中的数据输出和状态信息显示。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),如图1所示;按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
图1.八段数码管及其显示方式
按照本设计要求,我们需要掌握数字0~9以及小数点的显示段码,参考图2
图2.8段LED数码管字型字段编码表
B.单片机电路原理图
这里着重介绍单片机副板的原理图,如图3所示。8脚的排针J1接入的八个电阻这里起到限流的作用,防止电流过大而烧坏数码管上的LED灯泡。4个数码管的位置通过CON4的四个引脚接入C8051F410的I/O端口来被单片机控制。图左下部分的4个按键这里用来校时。
图3. 副板电路原理图
图4是整个单片机的连接实物图。
图4. 实物连接图
Ⅲ.代码设计
A.定时器T0、T1
C8051F41x内部有4个16位计数器/定时器:其中两个与标准8051中的计数器/定时器兼容,另外两个是16位自动重装载定时器,可用于其他外设或作为通用定时器使用。这些定时器可以用于测量时间间隔,对外部事件计数或产生周期性的中断请求。
定时器0和定时器1有5个可选择的时钟源,由定时器时钟选择位(T1M-T0M)和时钟分频位(SCA1-SCA0)决定。时钟分频位定义一个分频时钟,作为定时器0和/或定时器1的时钟源。
定时器0和定时器1可以被配置为使用分频时钟或系统时钟。定时器2和定时器3可以使用系统时钟、系统时钟/12或外部振荡器时钟/8作为时钟源。
定时器0和定时器1可以工作在计数器方式。当作为计数器使用时,在为定时器所选择的输入引脚(T0或T1)上出现负跳变时计数器/定时器寄存器的值加1。对事件计数的最大频率可达到系统时钟频率的四分之一。输入信号不需要是周期性的,但在一个给定电平上的保持时间至少应为两个完整的系统时钟周期,以保证该电平能够被正确采样。
计数器/定时器T0、T1都是一个16位的寄存器,在被访问时以两个字节的形式出现:一个低字节(TL0或TL1)和一个高字节(TH0或TH1)。计数器/定时器控制寄存器(TCON)用于允许定时器0和定时器1以及指示它们的状态。通过将IE寄存器中的ET0位置1来允许定时器0中断,通过将ET1位置1来允许定时器1中断。这两个计数器/定时器都有四种工作方式,通过设置计数器/定时器方式寄存器(TMOD)中的方式选择位T1M1-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)后再计一次将发生溢出,使计数值回到0x0000,此时定时器溢出标志TF0(TCON.5)被置位并产生一个中断。
方式1的操作与方式0完全一样,所不同的是计数器/定时器使用全部16位。用与方式0相同的方法允许和控制工作在方式1的计数器/定时器。这里我们选择工作方式1,即16位重载的方式。
图4显示了工作方式0的原理。
图4.工作方式0
B.按键问题
经常会产生按键控制不稳定的现象,如显示为“5”时,按下K1 键一次,应该加一显示“6”,但显示“7”或“8”,甚至更多,为了保证工作稳定,我们添加代码来消去按键的抖动。其原理如图5所示。
图5.消除按键抖动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU 对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。
软件延时消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序
C.运行在Keil环境下的程序代码
这里我们借助Keil uVision4的环境在实现本设计的功能。主要代码如下:
下面是前面的宏定义部分,增加整个程序的可读性。
#include code unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//LED显示代码 code unsigned char position[4]={0xfe,0xfd,0xfb,0xf7}; //显示位置(改成4段) char time[2],time_set[2]; // 时、分、秒计数和设置单元 char dis_buff[4]; // 显示缓冲区,存放要显示的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 25400000/8 //时钟8分频 #define TIMER_TICKS_MS 2 #define T2_RELOAD_CLOCKS SYSCLK/500 //2ms 由前面宏定义的变量T2_RELOAD_CLOCKS可知,定时长度为1/500s,即2ms。定时部分程序,: void Timer2_Init(void) { TMR2CN &= ~0x08; // Enable Timer2 in 16 auto-reload mode CKCON |= 0x10; // Timer2 uses SYSCLK TMR2RL = -T2_RELOAD_CLOCKS; TMR2 = TMR2RL; TMR2CN |= 0x04; //Start Timer2 ET2 = 1; // Timer2 interrupt enabled } 这里,posit以扫描的方式隔一定时间使4个数码管顺序轮流显示,但是扫描时间超出了人肉眼的分辨时间,所以它们看起来是处于常亮状态。P0来控制数码管的显示顺序,P1来控制单个数码管的显示字码。数码管显示程序如下: void display(void) { static char posit=0; P0 = 0xff; P1 = led_7[dis_buff[posit]]; if (set_on && (posit==clock_state)) P1= 0x00; // 校时闪烁 if (point_on && (posit==2)) //改成4段 P1 |= 0x80; // 秒闪烁 P0 = position[posit]; if (++posit >=4 ) posit = 0; } 下段代码作用是把一个二位的十进制数的十位和个位通过除10的取整取余得到十位数和个位数,再利用display(void)这个函数把它们转换成数码管上的显示段码。 void time_to_disbuffer(char *time) // 时钟时间送显示缓冲区函数 { char i,j=0; for (i=0;i<=1;i++) { dis_buff[j++] = time[i] % 10; dis_buff[j++] = time[i] / 10; } } Timer2 比较匹配中断服务,通过记2ms的个数来达到闪烁、记1s的功能。 代码如下: void Timer2_ISR (void) interrupt 5 { display(); // LED 扫描显示 if (++key_stime_counter >=5) { key_stime_counter = 0; key_stime_ok = 1; // 10ms 到 if (!(++time_counter % 25)) set_on = !set_on; // 设置校时闪烁标志 if (time_counter >= 100) { time_counter = 0; time_1s_ok = 1; // 1s 到 } } TF2H = 0; } 主程序主要部分: time_to_disbuffer(time); while (1) { if (time_1s_ok) // 1 秒到 { time_1s_ok = 0; point_on = ~point_on; // 每1秒小数点闪烁标志 if (++time[0] >= 60) // 秒加1,以下为时间调整 { time[0] = 0; if (++time[1] >= 60) { time[1] = 0; } } if ((++return_time >= 10) && (clock_state != 4)) clock_state = 4; if (clock_state == 4) time_to_disbuffer(time); } if ((clock_state != 4) && (key_temp == key_k2)) // K2 键按下 { if (clock_state == 0) time_set[0] += 1; if (clock_state == 1) time_set[0] += 10; if (clock_state == 2) time_set[1] += 1; if (clock_state == 3) time_set[1] += 10; if (time_set[0] >= 60) time_set[0]-= 60; // 以下设置时间调整 if (time_set[1] >= 60) time_set[1]-= 60;//以下省略时的调整 time_to_disbuffer(time_set); // 设置时间送显示缓存 } Ⅳ.结果及结论 通过C8051F410的仿真器,把在Keil 4下得到的代码载入芯片,实现了可以校正时间的电子时钟。每隔1S中间的分秒分隔小数点都会经历变暗或变灭,从而达到闪烁的效果。整个电子时钟工作稳定,按键校时功能可以按照预定地得到实现。但是由于指令周期考虑不全和硬件自身的原因易引起定时误差,该电子时钟存在着一定的误差,不过基本可以满足我们的设计要求。 参考文献: [1]潘琢金译.C8051F410/1/2/3混合信号ISP FLASH微控制器数据手册 [2]杨卫波.《《单片机原理与应用实践课程》实验指导书》.温州大学,2011 [3]翟流顺.80C51单片机定时误差的分析.临沧师范高等专科学校学报,Vol.21 No.1 Apr.2011下载本文