视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
一种基于C8051F410芯片带校时功能的时钟
2025-09-30 19:48:15 责编:小OO
文档


登峰杯论文

   题    目:一种基于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下载本文

显示全文
专题