c51两个定时器中断冲突_(六)定时器/计数器

发布者:快乐兔子最新更新时间:2022-01-26 来源: eefocus关键字:c51  定时器  中断  计数器 手机看文章 扫描二维码
随时随地手机看文章

一、简介

定时器和计数器是两个名字,但是原理上来说是一样的,都是对脉冲进行计数,区别在于时钟来源,如果来自内部时钟信号,由于内部时钟通常是比较准确的,所以是定时器,如果来自外部引脚,而外部引脚的信号并一定准确,则只对其进行计数,所以是计数器。接下来主要以定时器为主进行简单介绍,计数器类同。


二、时间计算

顾名思义,定时器肯定是和时间有关系的,那么时间是怎么计算的呢,我们以普通51内核为例。如下图(图片来自百度,我觉得他和51不符,所以改了下),通常一个指令周期=2X机器周期=12X时钟周期。而时钟周期又来自晶振。因此晶振频率确定后,那么各个时间也就确定了。

05a27d4f48b51a7d5eb809abe9b341aa.png

1. 计算内部指令周期

假设晶振频率是12MHz,那么机器周期=1/12MHz=1/12us,指令周期=12*机器周期=1us,也就是说单片机每执行一条指令,最小时间是1us。


2. 计算定时器初值

大多数定时器都可以工作在两种模式,一种是8位(最大计数256次)自动重装模式,一种是16位(最大计数65536次)自动重装模式,由于16位很显然计数或定时的范围是要远远大于8位的,因此,我们以16位模式应用为例,讲解计算方法。定时器在进行计数时是采用向上的方式,也就是说每一个系统信号过来以后,定时器设置的值进行+1,这里就有两个方式:


给定时器设置结束的值,从0开始不断+1,直到达到设置值溢出结束


给定时器设置初始值,从初始值不断+1,直到达到65536溢出结束


我们的51单片机采用了第二种方式,所以给定时器设置值时,我们说设置的是初值。计算公式如下:


初值=65536-定时时长指令周期=65536-定时时长(12*机器周期)            


当晶振取值12MHz时,指令周期最小时间就是1us,因此上式也可以写成 初值=65536-定时时长 定时时长取值范围:1~65536us或1~65.536ms


3. STC-12T系列单片机初值

STC单片机很多系列现在都做到了12T,也就是说指令周期最小可以做到等于机器周期,不需要再除以12。因此除了单片机运行速度加快以外,定时精度也更高,计算公式如下:


初值=65536-定时时长指令周期=65536-定时时长机器周期


当晶振取值12MHz时,指令周期最小时间就是1/12us 初值=65536-定时时长/12 定时时长取值范围:1/12~65536/12us或1/12~65.536/12ms


由于12不能整除,所以计算时会有小数点,精度上比普通51会高一个数量级


三、寄存器设置

举个例子,以定时器0、16位自动重装实现1秒定时,STC的C51定时器,需要使用到的寄存器有如下几个:


AUXR:辅助寄存器

image.png

TCON:定时器/计数器中断控制寄存器,很多中断的控制寄存器都在这里,定时器中断允许等操作在这里

image.png

TMOD:定时器/计数器工作设置寄存器

image.png

TH0:定时器初值高8位 除以上寄存器以外,还有两个隐藏寄存器RLTH0和RLTL0,这两个寄存器和TL0、TH0两个寄存器使用同一个地址,设置初值时会自动给这两个寄存器设置值,也就是溢出后,会将这两个隐藏值重新装入TL0、TH0。


四、代码示例

/*---------------------------------------------------------------------*/


/* --- STC MCU Limited ------------------------------------------------*/


/* --- STC15F4K60S4 系列 定时器0的16位自动重装载模式举例---------------*/


/* --- Mobile: (86)13922805190 -------------- -------------------------*/


/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/


/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/


/* --- Web: www.STCMCU.com --------------------------------------------*/


/* --- Web: www.GXWMCU.com --------------------------------------------*/


/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */


/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */


/*---------------------------------------------------------------------*/


//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译


//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"


typedef unsigned char BYTE;


typedef unsigned int WORD;


//-----------------------------------------------


#define FOSC 11059200L


#define T1MS (65536-FOSC/1000) //1T模式


//#define T1MS (65536-FOSC/12/1000) //12T模式


sfr AUXR = 0x8e; //Auxiliary register


sbit P10 = P1^0;


//-----------------------------------------------


/* Timer0 interrupt routine */


void tm0_isr() interrupt 1


{


P10 = ! P10; //将测试口取反


}


void main()


{


AUXR |= 0x80; //定时器0为1T模式


// AUXR &= 0x7f; //定时器0为12T模式


TMOD = 0x00; //设置定时器为模式0(16位自动重装载)


TL0 = T1MS; //初始化计时值


TH0 = T1MS >> 8;


TR0 = 1; //定时器0开始计时


ET0 = 1; //使能定时器0中断


EA = 1; //使能全部中断


while (1);


}


五、Proteus仿真

由于Proteus只能仿真普通51内核的单片机,所以上述代码还需要进行简单修改,改成普通51代码。示例:led灯隔一秒亮灭一次,GIF录得有问题


//设晶振为12MHz


#include "reg52.h"


sbit P20 = P2^0;


unsigned char count = 0;


void tm0_isr() interrupt 1


{


//定时器设置为10ms,1s=100*10ms


//这里使用count进行计数,100次即1s


count++;


if(count > 100)


{


P20 = ! P20; //将测试口取反


count = 0; //count清零,进行下次计数


}


}


void main()


{


TMOD &= 0xF1; //设置定时器模式,普通51和stc的不一样,模式不同


TL0 = 0xF0; //设置定时初值


TH0 = 0xD8; //设置定时初值


TR0 = 1; //定时器0开始计时


ET0 = 1; //使能定时器0中断


EA = 1;


while (1);


}

49492e67ef29bee730cbe3afa947b261.gif

关键字:c51  定时器  中断  计数器 引用地址:c51两个定时器中断冲突_(六)定时器/计数器

上一篇:C51流水灯 running water lamp
下一篇:C51-定时器/计数器

推荐阅读最新更新时间:2024-11-12 17:06

PIC32MX450 串口4中断
// mplab x IDE V1.7 /********************************************************************* * * UART Interrupt Example * ********************************************************************* * FileName: uart_interrupt.c * Dependencies: * Processor: PIC32 * * Compiler: MPLAB XC32 *
[单片机]
关于51单片机的定时器T0、T1总结
这是我总结的51单片机的中断定时器原理,之后会附上附件。第一次发帖,不足之处请多多包含! 我总结的文稿画面很花,所以给上个参考,各位不习惯的话,请酌情选择。 目录 一、原理: 1、对中断和定时器进行初始化: ①定时器/计数器工作方式寄存器 ②设定初值 ③开启中断和定时器 2、设置中断服务程序: 3、主函数: 二、各个定时器和工作方式: 方式0: 方式2: 方式3: 借鉴:郭天祥《新概念51单片机C语言教程》 一、原理: 51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异,下面我来总结各个定时器的用法。 定时器
[单片机]
关于51单片机的<font color='red'>定时器</font>T0、T1总结
Tiny 6410 按键中断驱动笔记
1. 先查看《Tiny6410SDK-1103 底板原理图》,找到按键部分:   从上图可知,当按键按下时,相当于接地,即低电平,从而产生一个由高电平到低电平的跳变。   Tiny6410的底板有8个按键: 2. 查看《Tiny6410-1170 CPU核心板原理图》,找到EINT0的连接图:   从上图可知:   EINT0 接 GPN0   EINT1 接 GPN1   EINT2 接 GPN2   ENIT3 接 GPN3   EINT4 接 GPN4   EINT5 接 GPN5   EINT19 接 GPL11   EINT20 接 GPL12 知识点: 由s3c6410外部触发的中断就是外部中断,
[单片机]
Tiny 6410 按键<font color='red'>中断</font>驱动笔记
ARM2200下的中断编程一
一. 前言 中断的基本概念: 1. 在ARM中最多有32个中断请求 2. 16个向量IRQ中断(16个向量中断的VIC中断号已经有系统定义好了。在p208中可查看) (16个向量中断有16个优先级,可动态分配给中断请求) 3. 可产生软件中断。 4. 中断的优先级资源:中断的优先级资源就是CPU的中断系统。以ARM7体系的CPU为例,最多可以有32个中断资源。对于每个具体的中断源可以将其设定为FIQ,使其具有最高优先级,但FIQ 最好是分配给唯一的中断源,否则就失去意义;也可以设定为向量IRQ,使其具有中等优先级,但向量IRQ的总数不能超过16个,这些中断源优先级的高低按向量编号从0(最高)到15(最
[单片机]
ARM的三种中断调试方法的介绍
  1 嵌入式软件开发流程   参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。   在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。   对后四种文件的理解很重要,其作用解释如下:   (1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的
[单片机]
ARM的三种<font color='red'>中断</font>调试方法的介绍
MSP430 G2553 Timer 中断总结
目前总共用到了四个中断向量,我觉得已经把G2553的所有定时器中断都用到了。 定时器有两个,TA0与TA1,每个定时器又有两个中断向量 1,CCR0到达时的中断,在计数模式时候很有用,平时定时器的基本功能。 2,CCR1,CCR2,以及 overflow时候的中断向量,这里面又有三个中断标志。 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */ #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */ . . #define TIMER1_A1_VECTOR (12 *
[单片机]
可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套
几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易。 ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ。 先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1时,IRQ和FIQ全部处于禁止状态。无论你在irq pin和fiq pin上面发什么样的中断信号,ARM不会理你,你根本不能打断它,因为它“耳聋”, 眼瞎 了。 当I位和F
[单片机]
STM32_TIM定时- 中断
今天讲解STM32F103定时器定时-中断功能,在昨天定时器延时的软件工程上添加TIM3定时的功能,你们也可以试着将昨天的工程添加修改得到。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPnJ9KYcXbPsP 访问密码 acd8 工程现象:间隔(定时器定时)500ms LED变化一次, 并且串口打印 STM32F103ZE有8个定时器(TIM1 – TIM8), 改工程以TIM3定时为例。 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 关于TIM延时,我把重要的几点在下面分别讲述,工程中没有在这里讲述的都是之
[单片机]
STM32_TIM定时- <font color='red'>中断</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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