51实现定时器定时调整

发布者:TranquilOasis最新更新时间:2018-12-13 来源: eefocus关键字:定时器  定时调整 手机看文章 扫描二维码
随时随地手机看文章

随着学习的深入对51的认识也越来越深,尤其对中断的重要性更是深深体会!如果你是和我一样的初学者,请一定要学好中断!


今天来分享一下有关定时器定时补偿的冷知识。


不知道你是否做过这样的实验,就是当你用定时器来定时1ms来实现数码管的自动加1。随着时间的推移,会发现和真正的时间略有偏差。于是就引出了接下来所要讲的。


到底这些值差在哪里呢?主要在三个方面:


进入中断前要进行压栈,即是进行数据保护,这里要耗费几个机器周期 


进出中断这个过程也要耗费一定的机器周期 


进入中断后的重新赋值也要耗费一定的机器周期


所以累计误差就这么慢慢增加了。


如何补偿呢?


其实思路很简单就是进入debug,看两次中断相差的时间间隔和我们真正的定时相差多少,然后在赋初值的时候进行一个调整即可。


下面来分享一个自己的调试过程。 


(以12M晶振为例)


先上自己的调试代码:


#include


unsigned char T0RH;

unsigned char T0RL;


void ConfigTimer0(unsigned int ms)

{

    unsigned long tmp;


    tmp = 12000000/12;//以12M晶振为例子

    tmp = (tmp*ms)/1000;

    tmp = 65536 - tmp;

    //tmp = tmp + 6;//这里是后面进行的初值补偿

    T0RH = (unsigned char)(tmp >> 8);

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0;

    TMOD |= 0x01;

    TH0 = T0RH;

    TL0 = T0RL;

    ET0 = 1;

    TR0 = 1;

}


void main()

{   

    ConfigTimer0(1);

    EA = 1;

    while(1);   

}


void InterruptTimer0() interrupt 1

{

    TH0 = T0RH;

    TL0 = T0RL;

}


① 设置软件调试的晶振值 


一


②进入debug 


定位两次中断的时间,算出时间间隔 



1
2


注意:程序定时的是1ms但是实际上却是1.006ms多出来了6us! 


即压栈、进出中断、中断的赋值这些过程耗费了6个机器周期 


我们知道12M晶振来说,一个机器周期就是1us,所以当赋初值的时候多上6个机器周期就可以了


③把注释去掉后的 


1
2



怎么样?是不是恰好是1ms? 


哇哈哈~~~~


其实这样在实际应用中也并不是精确的定时,因为我们知道一切都是相对的,没有什么是绝对的,没有什么会是永垂不朽的!所以这样定时虽然已经相当精确了,但也只能说相对!!!别忘了还有很多因素,比如气压,温度,……均会有所影响硬件!

关键字:定时器  定时调整 引用地址:51实现定时器定时调整

上一篇:不用定时器和汇编语言,只用C语言实现精确无误的延时
下一篇:51keil与proteus联调,实现在线仿真

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

51单片机串口接收数据
单片机每次发送或者接受完数据(8位数据将保存在缓冲区中),会自动触发接受或者发送中断。因此只需要中断置位以后再缓冲区中读数据(或者发送数据)。 1 /************************************************* 2 *receive code(HEX) 3 * $ P M T K 1 8 0 * 3 B \n \r 4 * 24 50 4D 54 4B 31 38 30 2A 33 42 0D 0A 5 *************************************************/ 6 7 unsign
[单片机]
51单片机的准备工作
准备工作,首先,你要有一块电路板,无论是学习板还是最小系统板,至少要有一块,因为单片机是实战的技术,没有板子玩不了。就好像你去驾校学开车,教练只跟你说理论,让你看书,不让你上车练习,你能学会开车么?肯定不能。 第二,单片机选型,选择宏晶的STC89C52C,关于宏晶老板姚永平,大家感兴趣的可以在网上搜一下。其实选型的时候,我是用ATMEL的89S52和STC89C52C进行对比了的,因为程序下载的时候89S52还需要一条ISP下载线,而STC89C52C只需要串口线就可以了,而串口线在后面的学习中是会用到的,这样算来,后者貌似成本更低一些。 第三,编译软件,KEIL C,全名是keil uvision,下载地址
[单片机]
学<font color='red'>51</font>单片机的准备工作
c8051f005_DA测试程序
//----------------------------------------------------------------------------- // Includes //----------------------------------------------------------------------------- #include c8051f000.h // SFR declarations #include stdio.h //-----------------------------------------------------------------------------
[单片机]
Redmi K50发布后联想陈劲祝贺:一起加入512俱乐部
3月17日晚,在Redmi K50系列发布之后,联想集团中国区手机业务部总经理陈劲发声:“祝贺友商一起加入512俱乐部”。 陈劲意指Redmi和摩托罗拉都推出了512GB大存储手机,其中Redmi K50 Pro 512GB版本售价3999元,摩托罗拉edge S30 512GB版本售价2499元(该版本命名为edge S30冠军版)。 核心配置上,Redmi K50 Pro采用6.67英寸三星AMOLED柔性直屏,分辨率为2K+,搭载天玑9000处理器,后置一亿主摄、800万超广角、200万微距三摄,电池为5000mAh,支持120W秒充。 Redmi K50 Pro 摩托罗拉edge S30冠军版采用6.8英寸LCD全
[手机便携]
Redmi K50发布后联想陈劲祝贺:一起加入<font color='red'>51</font>2俱乐部
STM32单片机的通用定时器定时时间的计算
STM32中的定时器有多种,按功能分成2个高级控制器定时器,4个普通定时器,2个基本定时器,2个看门狗定时器,1个系统滴答定时器SysTICk。 定时器的关键是定时时间的计算。比如用定时器控制继电器的开关的时候,需要延时一段时间才关闭或者开启,这时候离不开定时器定时。 通用定时器定时时间计算。1秒中断的基本实现: 通用定时器模块的入口时钟经过分频得到计数器的时钟,用CK_CNT表示,预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时,表示不分频,=1时,2分频。以此类推。 公式为:CK_CNT=fclk_PSC/(PSC +1),其中PSC最大为65535. 其次是TIM5计数器的计数值的设置
[单片机]
10.80c51外部中断 按键翻转LED
外部中断0 在我理解,外部中断要用的话,首先得开启总中断开关即(EA=1),而后打开外部中断允许(即EX0=1),最后选择外部中断触发方式(IT0,为0则为低电平触发,为1则为下降沿触发),以下为外部中断0的实现按键按下LED灯状态翻转的作用。 外部中断0实现代码如下(已注释) #include reg52.h typedef unsigned char u8; typedef unsigned int u16; sbit k3=P3^2;//开始以为随便一个按键都有用,没用后发现得把按键接在中断端口上,用外部中断 // 0则需接在P32口上 sbit led=P2^0; void delay(u16
[单片机]
10.80c<font color='red'>51</font>外部中断 按键翻转LED
采用51单片机的共阳数码管流动显示数据实现
本程序是采用51单片机实现共阳数码管流动显示数据,蛮好看的,所以把程序写出来和大家一起分享一下!! 电路图在下面 下面是汇编程序代码: D0 BIT P2.0 D1 BIT P2.1 D2 BIT P2.2 D3 BIT P2.3 D4 BIT P2.5 ORG 0000H SJMP START ORG 0040H START:MOV SP,#60H MOV R0,#00H MOV R1,#20 MOV DPTR,#TABLE SETB D4 MOV A,R0 MOVC A,@A+DPTR //1 MOV P0,A CLR D0 LCALL DELAY MOV R
[单片机]
采用<font color='red'>51</font>单片机的共阳数码管流动显示数据实现
基于C8051F单片机的标签打印机接口设计
  随着信息化技术的高速发展,各行业对于数据打印的需求日益增加。为了能够更加直观的浏览数据,微型标签打印机在智能仪器仪表、电子收款机、计价器等系统中几乎成为标准配置。本课题来源于常州市扬子电子有限公司,主要是针对一款程控耐压绝缘测试仪开发的打印机驱动设备,实现了对检测数据的实时打印功能。   系统采用斑马公司生产的888-TT桌面式微型标签打印机,基于美国Silicon Labs公司生产的SoC单片机C8051f020作为主控制芯片,通过RS 232串行接口与标签打印机进行串行通信,采取单片机向标签打印机发送打印指令和数据的方法实现单片机对打印机的控制。   1 单片机与打印机的串行接口设计   大多数单片机应用系统不是高速
[单片机]
基于C80<font color='red'>51</font>F单片机的标签打印机接口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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