当前位置:首页 > 单片机 > 单片机
[导读]  这里主要是对使用keil环境下,提高51单片机软件精度的问题给出自己的一点小看法,参阅了文章利用 Keil Cx51实现T0的精确定时,使用文章中的方法的确是可以提高软件精度,可是一碰到中断函数中语句较多,且main函

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

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

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

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

 

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

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

1C:0x017974E1MOVA,#0xE1
2C:0x017B258AADDA,TL0(0x8A)
3C:0x017DF58AMOVTL0(0x8A),A

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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

采用51单片机最小开发板,由8位自制独立按键控制。单片机芯片为STC89C52RC,晶振为@12.000 mhz。8X8LED点阵屏模块由MAX7219驱动,MAX7219包含一个自动扫描电路。你只需要把要显示的数据发送...

关键字: 51单片机 MAX7219 寄存器

在嵌入式系统开发的广阔领域,51单片机和STM32无疑是两种极具代表性的微控制器。对于初学者而言,选择学习路径时往往会面临一个抉择:是直接跨越51单片机,挑战更高层次的STM32,还是从51开始,逐步进阶?本文旨在探讨直...

关键字: 51单片机 STM32

在嵌入式系统开发中,特别是在使用8051系列单片机(简称C51)进行编程时,数据类型的选择与定义对程序的性能和可读性至关重要。C51语言在标准C语言的基础上进行了扩展,以适应单片机特有的硬件结构和操作需求。本文将深入探讨...

关键字: C51数据 51单片机

在嵌入式系统领域,51单片机作为一种经典的微控制器,广泛应用于各种自动化控制系统中。其外部引脚作为单片机与外界交互的接口,承载着数据传输、控制信号输出等重要功能。本文将通过对51单片机外部引脚的案例分析,结合实际代码,深...

关键字: 51单片机 单片机

在电子技术的浩瀚星空中,LED(发光二极管)以其独特的魅力成为了一颗璀璨的明星。而结合51单片机这一经典的嵌入式开发平台,LED的应用更是被赋予了无限可能,其中,花样流水灯便是一个生动而富有创意的实例。本文将带您深入探索...

关键字: 51单片机 LED

在现代嵌入式系统设计中,51单片机作为一种经典的微控制器,凭借其丰富的功能和广泛的应用领域,仍然受到工程师们的青睐。定时器中断是51单片机中一个非常实用的功能,它可以在特定的时间间隔内自动触发中断,执行预设的操作,从而提...

关键字: 51单片机 定时器

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在嵌入式系统开发中,单片机是不可或缺的重要组成部分。其中,STM32单片机和51单片机是两种常见的单片机芯片。本文将对比分析这两种单片机的区别,并探讨STM32单片机的优势。

关键字: stm32单片 51单片机

51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了许多品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基...

关键字: 51单片机 串行通信
关闭