历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2021年10月25日 | 51单片机的定时中断(三)

发布者:心有归属 来源: eefocus关键字:51单片机  定时中断  周期 手机看文章 扫描二维码
随时随地手机看文章

周期:


振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)


状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。


机器周期:1个机器周期含6个状态周期,12个振荡周期。


指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。


(1M=1000000,所以在晶振频率为12MHZ时,一个机器周期=1/12M=1us)


(指令周期的长短不一,如果不知道一些指令周期的长度,即使定时中断,也不能理论上绝对准确的中断。因为函数的调用等也需    要时间)(这目前我还不会,但是感觉应该可以更精确延时,因为可以在计时中剪掉相应的操作时间)


IT0/IT1:


51单片机有两组定时器/计数器IT0/IT1,因为既可以定时又可以计数,故称之为定时器/计数器。


定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。


51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。


有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。


定时/计数器的工作原理

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。


51单片机定时/计数器结构

定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

图一:定时计数器结构

 

定时/计数器的控制

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。


工作方式寄存器TMOD

图二:TMOD

1、高四位用来控制T1,低四位用来控制T0


2、GATE是门控位。GATE=0时,用于控制定时器的启动不受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。


3、C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。(T上有个非)


4、M1M0:工作方式设置位。定时/计数器有四种工作方式。(8位自动重装,指的是将初始化值装在高位,然后赋值给低位。低位进行计数或计溢出后,高位的数重新赋值给低位,重复)

图三


控制寄存器TCON


制定时/计数器的启动和中断申请。其格式如下:

图四

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。


TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。


TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。


TR0(TCON.4):T0运行控制位,其功能与TR1类同。


定时/计数器的工作方式

这里仅仅提及方式一(我目前只用过这两种)


方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。

计数个数与计数初值的关系为:X=216-N

图五


定时器的使用

对TMOD赋值,以确定T0和T1的工作方式。


计算初值,并将其写入TH0、TL0或TH1、TL1。


中断方式时,则对EA,ET0/1赋值,开放定时器中断


使TR0或TR1置位,启动定时/计数器定时或计数。(这个最后设置,因为一旦设置,计时或计数就开始)


代码:

定时器0


#include

 

sbit led=P2^0;//LED接在P2^0引脚上

 

int i=0;

 

void Timer0Init()

{

TMOD|=0X01;//这样写是非常好的,仅仅设置定时器0,不影响定时器1的工作状态。在多文件编程中,这一点能更好的体现

TH0=(65536-1000)/256;

    TL0=(65536-1000)%256;

//TH0=0xFC;//晶振频率为12M

//TL0=0X18;

TH0=0xFC;//我板子上晶振频率为11.05926M

TL0=0X66;//这差别很小的

ET0=1;//定时器0的中断允许

EA=1;//打开总终端

TR0=1;

}

 

void main(void)

{

Timer0Init();

while(1);

}

 

void Timer0() interrupt 1//尽量减少中断中的操作,提高精度

{

   i++;

   TH0=0xFC;//重新赋初值

   TL0=0X66;

   if(i==1000)

   {

    led=~led;

i=0;

   }

}


1、TMOD|=0X01;//这样写是非常好的,仅仅设置定时器0,不影响定时器1的工作状态。在多文件编程中,这一点能更好的体现


2、尽量减少定时中断中的操作,提高精度。


3、这个定时中断是1ms,中断中的操作应该是不到1000的1/10,所以这个中断在ms级别中,可能还是相对准确的。可以用于以后的实验。但是在s级别误差逐渐变大,下面是我简单测量的方法和结果。


测量:


在灯灭下的瞬间,手机开始计时。如果要测10s,在第五次灯灭的时候结束计时。(因为点亮和熄灭各一秒)


下面用上述方法测量了10s,30s,50,70s,各三次。结果如下


1ms延时的测量

image.png

 上表可见,误差越来越大。当然也可能我的晶振不是11.0592MHz,上面没标注,问的淘宝客服。


好奇万年历是怎么做出来的,回头好好查查。


 


定时器1(普中科技的代码)


/**************************************************************************************

*               定时器1实验   *

实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。   

***************************************************************************************/

 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 n=0;

/*******************************************************************************

* 函 数 名         : Timer1Init

* 函数功能    : 定时器1初始化

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Timer1Init()

{

TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

 

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

TR1=1;//打开定时器

}

 

/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

LSA=0;

LSB=0;

LSC=0;

Timer1Init();  //定时器1初始化

while(1);

}

 

/*******************************************************************************

* 函 数 名         : void Timer1() interrupt 3

* 函数功能    : 定时器0中断函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Timer1() interrupt 3

{

static u16 i;

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

i++;

if(i==1000)

{

i=0;

P0=smgduan[n++];

if(n==16)n=0;

}

}


在定时中断函数中,为了不断定时,进行了重装载(重新赋值)。当溢出的时候ET0置一,中断标志。


TR0=1,为打开计时器;ET0=1是打开定时器1中断允许。我咋感觉这两个有点重复呢?


 


补充:

来自百度百科:晶体振荡器


石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特定系统提供基准信号。


石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的

关键字:51单片机  定时中断  周期 引用地址:51单片机的定时中断(三)

上一篇:单片机的中断系统(一)
下一篇:C51单片机LED灯的控制

推荐阅读

        芯科技消息,日前传出美国第二大叫车服务公司Lyft 将在2019 年IPO ,预估市值上看150 亿美元,而现在该公司决定要为自家的自驾车计划多添上一笔助力。根据外媒报导,Lyft 准备收购英国研究虚拟现实的新创公司Blue Vision Labs ,并推出首款测试车,推动其自驾车愿景的发展。        根据TechCrunch报导,此次收购是lyft ...
  本文研究的内容是基于LabviEW的便携式汽车仪表测试系统。所以首先要对仪表的种类和构造进行研究,了解和分析汽车中车速表、转速表、水温表、燃油表、里程表、各种LED报警灯、LCD等的结构原理以及他们的显示原理,分析它们工作时的参数以及这些表的国家标准等,然后搭建硬件平台,设计软件程序,再让软件和硬件连接,进行参数设置,进行测试。  本文...
尽管有报道称 Redmi K30S 即将在国内正式上市,但 Redmi 仍未官宣。今天在微博上出现的几张图片表明,Redmi K30S 至尊纪念版将于 10 月 27 日正式发布。微博上(来源见图)出现的海报证实了 Redmi K30S 的名称。另外,从图像中可以明显看出,它是9月份在全球市场上发售的小米 10T 的国行版本。海报显示,Redmi K30S 的主要功能包括骁龙...
新一代小金刚Redmi Note 11系列已官宣定档10月28日发布。距离发布会越来越近,官方预热不断有干货曝出。作为同价位的标杆产品,其游戏性能自然不容忽视。Redmi Note 11打游戏表现如何?据官方最新爆料,Redmi Note 11运行知名MOBA手游,90帧流畅运行,游戏体验有保障了。一般来说,是否支持游戏高帧率,是性能分水岭,通过知名大型MOBA游戏,高帧率模...

史海拾趣

问答坊 | AI 解惑

单片机开发资料

单片机开发资料,很实用的一本书…

查看全部问答∨

2010年视频监控系统中主角:五种技术化

随着网络化进程的加速,视频监控未来的发展方向正在变得越来越清晰:一是用户体验的持续提升,二是客户应用的不断丰富。     用户体验主要集中在感官层面,包括观看和使用。对于观看,清晰度是影响体验的最直接的因素,而对于使用,便 ...…

查看全部问答∨

usb无线网卡问题?

我用的RT2501 usb无线网卡系统开机后不能自动识别,必须重插下才能识别,请问是什么原因,该如何解决?谢谢…

查看全部问答∨

100分求助wince驱动问题 求助

在串口驱动中有这样一段程序:          EnterCriticalSection(&(pHWHead->RegCritSec));         try {                 CLEARREG(pHWHead, r ...…

查看全部问答∨

5000比2000难在哪里?

实验室买了两套开发板子 一个是5509的,一个是2812的,都是新出的芯片。 从性能来说,5509要强大一些; 看了很多前辈的贴,都说5000的开发有难度(甚至有人说5000是最麻烦的,比6000都难) 但我尚不清楚5000较之2000和6000难在哪里? 是因为 ...…

查看全部问答∨

求IAR Embedded Workbench for ARM 520 开发环境软件

各位朋友 小弟是刚刚接触M3系列处理器的 紧急需要一套开发环境软件 希望大家谁有的话  能够发给我 我的QQ:811651854  邮箱:13851900253@163.com 谢谢~  急用…

查看全部问答∨

28BYJ48步进电机的步距角到底是多少

各位大神 求助啦 28BYJ48步进电机的步距角到底多大啊 有的说是1.8°(整步时) 有的说是 5.625/64 (1/64是减速比) 到底是多少啊?…

查看全部问答∨

限制垃圾的方法:“单位时间最大发帖量”限制法

限制垃圾的方法:“单位时间最大发帖量”限制法 这个标题出来了,意思也就不用说了…

查看全部问答∨

dsp28335ecap

有个疑问 CEVT1 CEVT2 CEVT3 CEVT4 这4个触发是要同一个信号接四个ECAP引脚的吗(我的光电编码器只有一路信号输出),如果是一路PWM要同时接4个ecap输入引脚的话,可那些程序在I/O口初始化时却只初始一个ecap的i/o , 如果说不用多个ecap的I/O引脚 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved