C8051F320-时钟和4in1八段管

发布者:BlissfulHiker最新更新时间:2015-07-24 来源: 51hei关键字:C8051F320  时钟  八段管 手机看文章 扫描二维码
随时随地手机看文章
       C8051F320包含一个内部振荡器,也可以采用其他方式提供振荡。手头没有任何元器件,所以只考虑使用内部振荡器。

一、时钟设定

       系统复位时,默认使用内部振荡器作为系统时钟,出厂前已经将基频定为12MHZ,可以根据需要对其进行分频操作。 

分频方法: 寄存器OSCICN 最低两位 D1D0的值决定了分频数,00~11分别为8分频、4分频、2分频、不分频。

                   此外,D7=1表示内部振荡器使能,反之禁止内部振荡器

                           D6=1内部振荡器频率准备好标志

                           D5=1强行挂起内部振荡器

       寄存器OSCICL 内部振荡器校准,D4~D0的数值决定了校准后的频率偏差,计算方法由如下公式决定:


                                            
 

                     第二项的分母为基准频率,第三项为D4~D0,浮动范围0~31,根据这个公式,当基准设置为12M时,能够设置的偏差很小。

                                          △T=0.0025×0.083us×(0~31)=0 ~ 0.0064325 us

                     以12Mhz为例,12M对应的周期为0.0833us,加上该偏差为0.0897625us,对应频率为11.14M。

                     也就是说,当基准频率为 12 Mhz时,最多可以调整为11.14M

                     以此类推。2分频时,6Mhz,最多可以5.57M

                                       4分频时,3Mhz,最多可以2.78M

                                       8分频时,1.5Mhz,最多可以1.39M

 

 

二、八段管的一点小收获

       偶然发现自己以前写显示程序实在是太老土了,display()铁打不动就是选一个管,送个段码,延时,选下一个管,段码,延时,再选下一个管。。。  这样一来显示程序必定要消耗大量的时间在显示程序上。当系统时序要求高时,这种写法根本就是自杀行为。

      正确方法应该是,设置定时器在一个足够小的时间上,比如10ms,利用一个变量保存中断的次数。每次进入中断,根据(变量%4)的值,来驱动一个管显示数字,下一次中断时切换下个管,以此类推。。

 

 

三、F320内部定时/计数器的使用

       芯片内部有4个定时计数器,其中T0T1与51兼容,T2T3只能定时不能计数,但可以实现16位自动重装计数值。

       寄存器TMOD TH0 TL0 TH1 TL1 以及T0T1相应的启停位中断位不变。

新增部分:

       1、CKCON 时钟控制器 复位值00H

            D7D6控制T3高低位的时钟源,1为选择系统时钟,0为用户设定。

            D5D4控制T2高低位的时钟源,1为选择系统时钟,0为用户设定。

            *如果设置为单个16位定时器,则D5D7无效

           D3D2作用类似,分别控制T1T0的时钟源,1为系统时钟,0为分频时钟,默认为分频时钟。其分频系数由D1D0决定,

            00——12分频  01——4分频 10——48分频 11——8分频

      2、定时器T2

           和T0做个对照:

            TH0 —— TMR2H        TL0 —— TMR2L  

            TMOD —— TMR2CN (D4D3决定T2工作方式)

            TF0 —— TF2H(16位时,H起作用)/TF2L   ET0 —— IE.5  TR0 —— TR2(双8位时,只能控制高八位定时器,低八位永远工作)

            TF2LEN =1  低八位时钟中断允许位

            TMR2RLH   TMR2RLL 专用于高低八位的计数值重载

            设为2个八位时钟时,共用一个中断,必须在中断程序中检查对应的标志位才能确定是哪一个时钟计数到,且标志位必须手动清零

            另有usb起始帧捕捉模式,暂时不研究

 细节: TMR2H 控制字  D7D6  为TF2H 、TF2L ,中断标志

                                      D5       为 TF2LEN,定时器2低字节中断允许位

                                      D4       为T2SOF 没研究那部分,应该给0,表示禁用

                                      D3       为T2SPLIT  1表示双8位,0表示单16位,均可自动重载计数值

                                      D2       为TR2,高八位时钟启动(16位时钟不知道怎么启动。。。。)

                         D1无用 D0        为T2外部时钟选择,需要与上面的CKCON对应,没研究。

 

         小结:T2可以工作在3种方式下,单个16位时钟,2个8位时钟,USB起始帧捕捉。使用前,必须设置TM2RCN控制字的D4D3决定工作方式。还必须设置时钟源,在CKCON和TMR2H都有涉及。

                   对于16位时钟,计数值存放在TMR2H和TMR2L,有专门的重载寄存器TMR2RLH和TMR2RLL。启动时可能是用TR2,开中断用IE.5(ET2),计数到标志位叫TF2H,另有TF2L,必须专门在控制字的D5进行设置才能使用。[page]

                   对于8位时钟,和上面基本差不多,共用一个中断。

                    

                  T3和T2没啥区别,名字数字改改,中断允许叫ET3,但位置不在IE,无所谓。

 

四、程序实测

1、T2   单16位,16位中断实测

     初始化: 

   CKCON=0x00;             //D1D0定了分频数,就是在系统分频振荡器后,定时器还能分频一次。
                                    //D3D2比较爽,写个0x0c,不分频直接给时钟用,很快。。。 
  TMR2CN=0x00;         //D5不允许低8位中断 D4禁止SOF D3单16位 D2暂不启动 D0使用12分频时钟      
  TMR2L=0x78;
  TMR2H=0xEC;
  TMR2RLH =0xEC;
  TMR2RLL =0x78;
  EA=1;
  ET2=1;

    启动:TR2=1; 

   中断号 :5

   中断里面必须加 TF2H=0;

    结果,成功

2、T2 单16位,允许低八位中断,尝试根据中断标志决定处理或者不处理低八位。

    上面的初始化改一句 TMR2CN=0x20;             由于低八位计数到就中断,且低八位中断没清除,分针又跑得飞快了

    中断多一句清除指令 TF2L=0;                        秒针走很快,合理。因为每255就中断一次

    中断最前面多一段       if(TF2L==1){TF2L=0;return;}     忽略低八位时钟中断,秒针正常了

3、T2双8位,实在懒得测试了。    测试一下T3的中断号 

      悲剧了,T3的寄存器都没有定义!查资料。。。

 修正1  : 在头文件里把TMR2CN的位定义复制一份,改成3,成功

 修正2  : 在头文件里手动编写EIE1的位定义

/*  EIE1  */
sbit ET3           = EIE1 ^ 7; 
sbit ECP1        = EIE1 ^ 6; 
sbit ECP0        = EIE1 ^ 5; 
sbit EPCA0      = EIE1 ^ 4; 
sbit EADC0C   = EIE1 ^ 3; 
sbit EWADC0  = EIE1 ^ 2; 
sbit EUSB0       = EIE1 ^ 1; 
sbit ESMB0      = EIE1 ^ 0;

失败,提示该地址无效?(invalid base address)

修正3: 直接用 EIE1 |= 0x80;  编译通过

运行后还是不走,估计是中断号有错!!!

直接在main函数中查询T3中断标志位,手动跳转到中断程序,可以运行,但是速度慢得没天理。

可见T3中断确实不是这么用的,待查。。。。

还有一个猜测,是不是keil对interrupt 14不支持??

又多了个疑点,改回T2,同样用查询方式,手动跳转,速度非常正常!看来T3的PDF没有看是个严重错误!

关键字:C8051F320  时钟  八段管 引用地址:C8051F320-时钟和4in1八段管

上一篇:基于18B20和单片机89C52的测温程序
下一篇:AD9850(DDS)驱动程序

推荐阅读最新更新时间:2024-03-16 14:26

S3C2440系统时钟
MINI2440开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,也就是说CPU,内存,UART等需要用到时钟频率的硬件都工作12MHz下,而S3C2440A可以正常工作在400MHz下,两者速度相差可想而知,就好比牛车和动车。如果CPU工作在12MHz频率下,开发板的使用效率非常低,所有依赖系统时钟工作的硬件,其工作效率也很低,比如,我们电脑里面经常提到的超频,超频就是让CPU工作在更高的频率下,让电脑运算速度更快,虽然频率是越高越好,但是由于硬件特性决定了任何一个设备都不可能无止境的超频,电脑超频时要考虑到CPU或主板发热过大,烧坏的危险,同样开发板的主板上的外设和CPU也有一个频率限度,ARM920T内
[单片机]
DS12887(时钟日历芯片) c语言驱动程序
****************DS12887 时钟日历芯片调试******************/ 管脚配置: MOT: 接地 CS: 接地 地址:0xFF00 AS: 接单片机 ALE R/W: 接 RW DS: 接 RD RESET: 接高 IRQ: 空 SQW: 空 */ #i nclude REG51.h #i nclude absacc.h /*************************/ #define TM_SEC XBYTE #define TM_MIN XBYTE #define TM_HOU XBYTE #define DAY XBYTE #define DATE XBYT
[单片机]
通讯手持设备的参考时钟设计
参考时钟概述   在通讯手持设备当中,参考时钟的贡献就像心脏对人体的作用一样,丝毫的差异都将导致系统功能的紊乱。之所以定义它为参考,是因为这类产品能否正常工作完全依赖于该时钟的精确度;而且一旦有误差存在,该误差就会随着倍频的增加而介入应用端的工作频段,无论是基带的数字和模拟部分还是射频的上变频和下变频都会受到影响。通常参考时钟所采用的中心频点都在10MHz~30MHz,而且目前大多数都采用13MHz,20MHz,或26MHz,尤其是当射频和基带共用参考时钟时以13MHz和26MHz最多。   为什么要采用13MHz和26MHz作为参考时钟呢?客观上对射频RF而言,目前手持设备话务通信的频率资源主要集中在以1GHz和2GHz为中心
[应用]
STM8与汇编语言(13)--修改CPU的时钟
在有些单片机的应用系统中,并不需要CPU运行在多高的频率。在低频率下运行,芯片的功耗会大大下降。因此希望单片机能提供这个功能,STM8单片机确实有这个功能,并且修改也非常方便。 下面的实验程序首先将CPU的运行时钟设置在8MHZ,然后快速闪烁LED指示灯。接着,通过修改主时钟的分频系数和CPU时钟的分频系数,将CPU时钟频率设置在500KHZ,然后再慢速闪烁LED指示灯。通过观察LED指示灯的闪烁频率,可以看到,同样的循环代码,由于CPU时钟频率的改变,闪烁频率和时间长短都发生了变化。 同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。 stm8/ #inc
[单片机]
STM32RTC实时时钟
我用的是STM32库函数:两个知识点: 一、RTC时钟框图分析(重要) 二、时间是怎样显示出来的(简析) 一、RTC时钟框图分析(重要) 先熟悉一下几个知识点: 1、STM32的实时时钟(RTC)是一个独立的定时器! 2、RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位火从待机模式唤醒后RTC的设置和时间维持不变。 RTC这章中,对RTC相关的寄存器的操作特别重要,我在这里不解释了,请查阅手册。。 先上图! RTC时钟框图分为完全独立的两个部分:1、APB1接口部分(用来RTC相关的寄存器);2、RTC核心; 第一部分:APB1接口。注意:这里涉及到寄存器RTC_
[单片机]
STM32RTC实时<font color='red'>时钟</font>
中断及定时器实现时钟功能
中断及定时器实现24时 时钟,程序如下: #include reg52.h #define PORTLEN P0 sbit bit_select = P2^0; sbit seg_select = P2^1; unsigned char src = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char qrc = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char second1 ; unsigned char shi
[单片机]
调整单片机时钟精度的解决方案
单片机应用中,常常会遇到这种情况,在用单片机制作电子钟或要求根据时钟启控的控制系统时,会突然发现当初校准了的电子时钟的时间竟然变快或是变慢了。 于是,尝试用各种方法来调整它的走时精度,但是最终的效果还是不尽人意,只好每过一段时间手动调整一次。那么,是否可使时钟走时更精确些呢?现探讨如下: 一、误差原因分析 1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟计时的准确性。 2.单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中断请求
[电源管理]
调整单片机<font color='red'>时钟</font>精度的解决方案
dsPIC30F6010单片机的原理及应用
1 前言 随着电子技术的发展以及集成电路规模的不断扩大,工业等各应用领域对于核心芯片的要求越来越苛刻。因而,计算机芯片也朝着高速化、专业化、模块化、功能化、低功耗、低电压工作等方向不断地发展、更新。 Microchip公司的PIC系列单片机以其内置Flash以及精简指令集等技术特点成为中低档8位单片机的主流产品,但是在一些复杂系统应用中,它仍存在一些缺陷和不足。为此,Microchip公司新推出了dsPIC30F系列16位单片机。它是一种具有单片机和DSP综合功能的16位CPU,不但保留了单片机的基本性能、丰富了外围模块,还兼具DSP的高速运算能力,是嵌入式系统设计的最佳解决方案之一。由于集多种功能于单一芯片,从而大大节省了电
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved