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-17 02:26

MSP430学习笔记-看门狗
WDTCTL 看门狗控制寄存器 WDTCTL 由两部分组成: 高 8 位是对 WDT 操作的控制命令。要写入操作 WDT 的控制命令,出于安全原因必须先正确写入高字节 看门狗口令。口令位 5AH,如果口令写错将导致系统复位。 读 WDTCTL 时,不需要口令,可直接读取地址 120H 中的内容,读出数据低字节位 WDTCTL 的值,高字 节始终位 69H。WDTCTL 除了看门狗定时器的控制位之外,还有两个用于设置 NMI 引脚功能。 WDTISx:选择看门狗定时器的计时输出 其中 T 是 WDTCNT 的输入时钟源周期。 0 T×2的15次方 1 T×2的13次方 2 T×2的9次方 3 T×2的6次方 WDTSSEL:选择
[单片机]
MSP430学习笔记-看门狗
频率计数器测量功能介绍
一、频率计数器简介 电子工程师经常需要测量频率、时间间隔、相位和对事件计数,精确的测量离不开频率计数器或它的同类产品,如电子计数器和时间间隔分析仪。这些仪器为研发提供高精度和分析能力,为大批量生产提供高效率并为维修提供低成本和便携性。 最早的电子计数器是为了对诸如原子现象之类的事情进行计数而设计出来的。在发明计数器之前,频率的测量都是用频率计(一种精度很低的协调装置)完成。频率计数器是以数字方式对信号参数进行精密测量的首批仪器之一。 衡量频率计数器主要指标是测量范围、测量功能、精度和稳定性,这些也是决定价格高低的主要依据。随着电子测试技术的发展,频率计数器日趋成熟。目前,频率计数器已经能轻松测量射频、微波频段信号。除频率测量外,大多
[测试测量]
频率<font color='red'>计数器</font>测量功能介绍
STM32定时器中断设置方法
今天调试了STM32的定时器功能,STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿TIM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习 首先定义定时器头文件,也就是定义寄存器以供操作: //************************************************************************* // // TIM2-Register // //***********************
[单片机]
STM32空闲中断+DMA解决接收不定长数据问题
串口的中断类型: #define USART_IT_PE ((uint16_t)0x0028) #define USART_IT_TXE ((uint16_t)0x0727) #define USART_IT_TC ((uint16_t)0x0626) #define USART_IT_RXNE ((uint16_t)0x0525) #define USART_IT_IDLE ((uint16_t)0x0424) #define USART_IT_LBD ((uint16_t)0
[单片机]
C51中如何实现软复位?
可以定义一个指向复位向量(0x0000)的函数指针,然后在C程序中需要软复位的地方调用该函数: ((void (code *) (void)) 0x0000) (); 例如,以下程序不断地复位: void reset (void) {   ((void (code *) (void)) 0x0000) (); } void main (void) {   reset (); } 也许你会注意到前面所提到的复位程序并不恢复8051的中断系统,它也不去复位任何的8051外设。若上述代码在一个中断例程中执行,则8051 会阻止同级中断的产生。因此,在中断服务例程中不能使用这个复位程序。 以下的一小段汇编过程同样
[单片机]
C51按键识别,等待释放
#include reg51.h unsigned char val; unsigned char i,j,k; sbit k1=P3^4; void delayms(int ms) // 1ms { unsigned char i,j; for(;ms 0;ms--) for(i=6;i 0;i--) for(j=82;j 0;j--); } void main() { val=0xff; while(1) { if(k1==0) { delayms(10); if(k1==0) { P0=val; val--; } while(k1==0); //等待按键释放,要按信一直减,取消这一句即可 } }
[单片机]
数码管0~9的显示,延时1s(没有通过用计数器的延时)
;NAME: 数码管0~9的显示 ;AUTOR: ;TIEE: 2012年3月29日 13:22:22 ;CONTENT: 数码管0~9的显示,延时1s(没有通过用计数器的延时) 6 ORG 0000H 7 SJMP MAIN 8 ORG 0030H 9 MAIN: 10 LOOP1: MOV A, #00H 11 MOV R5,#00H 12 MOV DPTR, #TAB ;首地址即0C0HQA的地址 13 LOOP2: 14 MOV A, R5 15 MOVC A, @A+DPTR 16 MOV P1, A 17 CALL DELAY 18 CJNE R5, #0AH , FLAG ;比较R5是否等于10,若
[单片机]
数码管0~9的显示,延时1s(没有通过用<font color='red'>计数器</font>的延时)
嵌入式实时操作系统ARTs-OS的中断管理
ARTs-OS是一个基于微内核的嵌入式实时操作系统。ARTs-OS中的中断管理应该提供的基本功能包括:管理中断处理设备、中断服务例程的管理、中断嵌套的管理、中断栈的维护、线程/进程切换时的现场保护和恢复等。但是ARTs-OS作为嵌入式实时操作系统,上述基本功能不能满足所有的要求,它还必须拥有更多体现嵌入和实时特性的功能。ARTs-OS在实现中必须采取一些措施将中断分配时间(IDT)和中断服务时间(IST)减到最小,并使用户能够很容易地在ARTs-OS上开发、调试驱动程序。 1 ARTs-OS的I/O特点 ARTs-OS的I/O体系结构的主要特点有:(1)基于微内核构架。(2)支持动态加载。(3)核内/核外驱动。(4)进程/
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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