51单片机(STC89C52RC) keil软件精确定时 浅析

发布者:Bby1978最新更新时间:2017-01-22 来源: eefocus关键字:51单片机  STC89C52RC  keil软件  精确定时 手机看文章 扫描二维码
随时随地手机看文章

  这里主要是对使用keil环境下,提高51单片机软件精度的问题给出自己的一点小看法,参阅了文章利用 Keil Cx51实现T0的精确定时,使用文章中的方法的确是可以提高软件精度,可是一碰到中断函数中语句较多,且main函数其它任务的时候,总是觉得力不从心,因为要计算中断执行时间就够我受的了。我可是很懒的,研究之下发现了一些东西。

51误差主要是来自两个方面:晶振和单片机中断系统的误差

 

  1. 晶振:我们的晶振一般误差都是20PPM的,百万分之二十。想提高精度,只能选择误差更小的晶振,但它毕竟不是为精确定时设计的,很难达到时钟芯片晶振的精度。

  2. 中断系统的误差:定时器产生中断请求以后,并不一定能马上响应这个中断。单片机至少要把当前的指令执行完。51的指令是1到4个周期。如果赶上两周期指令,就会延误一个指令周期。最慢的情况会延误3个周期响应中断。这里是没有办法预测的,因为中断是随机的。如果使用上述文章中的方法,这里就比较难计算了。如果单片机正处理其他的中断(同级或更高级)。要等其执行完其他中断,再执行一条主程序指令,才会响应定时器0中断。因为程序千差万别,所以其他中断占用的时间,就没准儿了。这类影响是随机的,一般会提升相应的优先级别。那么如何解决呢?我们知道定时器只要开着,TH0和 TL0就会不断的增一,增到FF FF,再增一就溢出(不自动重载),这时TF0被硬件置1(也就是中断请求)。我们要注意的就是不管定时器中断是否被响应,TH0和 TL0仍然会不断增一,FF FF增一00 00 再增一 00 01 再增一 00 02 。定时器在溢出产生中断以后,不论响应还是不响应,TL0并不停止计数。虽然中断响应有可能被延 迟,但是延迟的时间仍然被计算。那么我们就完全有可能将下一次中断“补上”。

 

 1 #include "reg51.h"
 2 #include "delay.h"
 3 #include "stdlib.h"
 4 #define uchar unsigned char
 5 uchar  MScond=0; 
 6 uchar  Seond=0;  
 7 uchar  Minute=0;  
 8 uchar  Hour=0; 
 9 sbit P1_0 = P1^0;
10 
11 bit is_arrive_time(void)
12 {
13 
14      int a = rand()%10;
15      if(a>5)
16      {
17          return 1;
18      }
19      return 0;
20 }
21 void main(void){
22 EA=1; 
23 ET0=1;
24 TMOD &= 0xf0 ;
25 TMOD |= 0x01 ;  
26 TH0=0xb1;
27 TL0=0xdf;
28 TR0=1;
29 P1_0 = 0;
30 while(1)
31 {
32     if( is_arrive_time() == 1)
33       {
34           P1_0 = ~P1_0;
35       }
36 }
37 }
38 void Time0Isr(void) interrupt 1 
39 {
40        TH0  =  0xb1 ;            //定时器重新赋初值
41    // TL0  =  0xeb;
42    TL0 +=  0xe1;           //测试点
43 MScond=MScond+1;
44 if(MScond==50)
45 {
46 MScond=0;
47 Seond=Seond+1 ;
48     if(Seond==60)
49     {Seond=0;
50         Minute=Minute+1;
51         if(Minute==60)
52         {
53             Minute=0;
54             Hour=Hour+1; 
55             if(Hour==24)
56             {Hour=0;
57             }
58         }
59     }
60 }
61 } 

复制代码

 我们可以看到我将TL0的赋值累加了,其结果将等待和初始化的时间也给算上了,解决了上面预测计算的问题,那么为什么负的初值不是0xdf而是0xe1呢?我们查看一下这个语句的汇编就知道了 TL0 +=  0xe1

1 C:0x0179    74E1     MOV      A,#0xE1
2 C:0x017B    258A     ADD      A,TL0(0x8A)
3 C:0x017D    F58A     MOV      TL0(0x8A),A

 可以看出,TL0(0x8A)的值在C:0x017B 这里就记录到了A寄存器当中去了。也就是C:0x017B语句本身和C:0x017D两条语句没有记录进去,这两条都是一个周期的指令,故要加上2。这条语句后面的代码执行也就算下一次中断执行的了。从理论上说,真正是一个微秒都不差。中断中代码的执行时间可以扩展到中断周期那么大,比如我这里是50ms,12MHZ的话就是约50000行代码。哟,要计算执行周期不得累死。这个用法的好处显而易见了吧。


关键字:51单片机  STC89C52RC  keil软件  精确定时 引用地址:51单片机(STC89C52RC) keil软件精确定时 浅析

上一篇:Proteus通过虚拟串口程序仿真51单片机串口的实现
下一篇:51单片机(STC89C52RC) IO扩展实验

推荐阅读最新更新时间:2024-03-16 15:32

基于51单片机的多通道数据采集范围控制系统
1 引 言   在实际应用中,对被控对象的物理参数(温度、湿度、位移、电流、电压等)在一定的范围内进行控制,是单片机的典型应用之一。很多宏观要求精确控制的场合,其微观控制过程,仍可归结为是对某些参数变化范围的控制。如,传统的三相异步电机从启动到正常运行,其电流、电压和温度的变化;抽水塔水位的变化;机床刀具的行程变化及数字电表的自动量程变换等。这些控制过程最显著的特点是:被控物理量都是一个变化范围,而非某一个精确的“点”。有效控制物理量变化范围的方法很多,本文重点介绍利用C8051F000单片机片内8路高性能的12位ADC数据采集系统和可编程窗口检测器,实现对多路参数变化范围控制的硬件组成和软件设计方法。 2 C8051Fxxx系列
[单片机]
基于<font color='red'>51单片机</font>的多通道数据采集范围控制系统
8051单片机基本操作
1. P0   1.1 构成   1.2 做输入端口   1.3 做输出端口 2. P1   2.1 构成   2.2 做输入端口   2.3 做输出端口 3. P2   3.1 构成   3.2 做输入端口   3.3 做输出端口 4. P3   4.1 构成   4.2 做输入输出端口 5. 总结 51单片机并行GPIO,按其特性分为 单一的准双向口 多功能复用准双向口 地址总线输出准双向口 地址/数据总线口的三态双向 P0 ~ P3口都有各自的用法: P0:常作系统数据或低8位地址复用口,第二功能:用于系统扩展 P1:常作通用I/O口使用 P2:常作系统高8位地址,第二功能:用于系统扩展 P3:常用第二功能 1. P0
[单片机]
80<font color='red'>51单片机</font>基本操作
59-基于51单片机的非接触式无线红外测温
具体实现功能 具体功能: (1)采用红外温度传感器测温并用LCD1602显示; (2)按键为启动按键、保存按键、显示数据按键,可以实现对温度数值的控制; (3)温度可以通过蓝牙模块发送到手机上实时显示; (4)温度测量范围0到99.9摄氏度,精度为0.1摄氏度,测温系统稳定,精度高。 设计背景 随着经济的发展,社会生活水平的提高,人们对自身身体情况愈来愈重视。体温是人体生命活动最基本的特征,也是观察人体机能是否正常的重要指标之一。现在各种流行病比较多,传染性比较强,传统的接触式测温系统有很大的局限性,特别是在高发病的场所诸如学校或者客运中心等等。目前,传统的测温仪器存在的缺陷开始被人们所认识,测量准确度低,等待
[单片机]
59-基于<font color='red'>51单片机</font>的非接触式无线红外测温
51单片机C语言编程》学习
因为公司有一部分设备生产年代久远,用的PLC也是比较古老的,有一款东芝EX20/40的用的单片机是P8051AH,其CPU板的图片如下。 因此想尽可能的的了解一下8051系列单片机,适逢活动中有《51单片机C语言编程》,遂报名参加。 因为以前对51单片机做过了解,拿到书后直接跳到流水灯章节阅读,按照书上的位操作例程弄了一个比较繁琐的控制数码管显示0-9的程序: #include #define unit unsigned int sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sb
[单片机]
《<font color='red'>51单片机</font>C语言编程》学习
基于51单片机的程控放大器
仿真图: 基于 数码管显示 ,具有方波 正弦波 三角波 锯齿波放大功能,放大倍数支持1倍20倍30倍50倍放大 程序设计 #include reg52.h #include intrins.h sbit sbF1 = P2 ^ 0; //不进行放大处理 sbit sbF20 = P2 ^ 1; //放大20倍 sbit sbF30 = P2 ^ 2; //放大30倍 sbit sbF50 = P2 ^ 3; //放大50倍 sbit sbDIN = P3 ^ 0; //MAX7219的数据引脚 sbit sbLOAD = P3 ^ 1; //MAX7219的控制引脚 sb
[单片机]
基于<font color='red'>51单片机</font>的程控放大器
基于51单片机设计的用电故障控制系统
1 引言   对于电网短路和线路故障检测保护已有不少研究。市面上的电器短路、过载、超压的保护器功能单一。容易损坏,没用提示功能,不够人性化。但随人们生活水平的不断提高。用电设备也不断增加,产生了肓目用电现象。这给人们造成极大的安全隐患。其中危害性最大的用电故障有三种:输入电压过高、室内线路严重过载、用电器短路。本文设计的单片机AT89C5l用电故障控制系统的目的就是为了防止这三种故障带来的危害。   2 硬件的组成   单片机用电故障控制系统的硬件分别是:由降压变压器、2个相瓦串联的感应线圈、升压变JK器、电磁开关、5V稳压电源、超压过流信号获取比较电路、可编程接门扩展芯片8255、HD44780字符液晶显示模块、ISD26
[单片机]
基于<font color='red'>51单片机</font>设计的用电故障控制系统
基于AT89C2051单片机的全自动化导游机
电子导游系统发展有个过程,最开始时是一种半自动化系统,功能是把景点信息以语音文件格式存储在导游机里,一般通过键盘直接键入景点代码,选择播放。这种类型的导游机,缺点是要输入景点代码,很不方便。发展到现在,出现了全自动化的导游机,它在景点先安放无线发射模块,这些发射模块可以控制工作范围,这样在各个景点就有不同的编码信号。游客到达景点后,游客手上的导游机会自动接收编码信号,经过解码后,由控制中心控制语音播放即可。本文介绍了这一全自动化导游机的设计,采用了miniC-A101FS和单片机AT89C2051配合使用。 1 miniC-A101FS和SC2272的介绍   1.1 miniC-A101FS   miniC-A100FS是串口控
[单片机]
51单片机入门——控制LED灯
1. LED 1.1.什么是LED? LED(light-emitting diode),即发光二极管,俗称LED小灯,是一种由磷化镓(GaP)等半导体材料制成的、能直接将电能转变成光能的发光显示件。当LED内部有一 定电流通过时,它就会发光,不同LED能发出不同颜色的光,常见的有红色、黄色等,如图: 关于LED外形特征主要说明下列几点。 (1)单色LED的外壳颜色表示了它的发光颜色。LED的外壳是透明的。 (2)单色LED只有两根引脚,这两根引脚有正、负极之分。多色的LED为 3 根引脚。 (3)LED外形很有特色,所以可以方便地识别出LED。 1.2.LED的种类 1.3.LED的主要参数 电参数: (1)正向工
[单片机]
<font color='red'>51单片机</font>入门——控制LED灯
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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