51单片机中有2个 定时器/计数器 中断,之所以叫定时器/计数器,是因为它既可以当定时器,也可以当计数器,其实本质上都是计数器,如果给一个稳定的时钟源,那么它就是一个定时器的。(下面我说的计数器或定时器都是一回事,不要在意为什么有的地方是定时器,有的地方是计数器)

首先,定时器的计数是加1的,而不是减1的,当加到最大值时,再次加1就会变成0,此时就会触发计数器中断。51中常用的是16位计数器,最大值是65535,如果要计数1000次,那么计数器赋值应该为65535-1000+1(达到最大值后要再加一次才行。)计数器的初值是放在两个8位寄存器中,分别是TH0, TL0(计数器0的高8位和低8位),计数器1使用的是TH1,TL1,原理相同。
65535-1000+1=64536=0xFC18
所以
TH0=0xFC;
TL0=0x18;

上面我们让定时器计数1000次,但是我们要的是固定时长,而不是固定次数,一千次是多长时间呢? 我们需要计算计数器加1需要的时间。

计数器加1需要一个机器周期,而一个机器周期等于6个状态周期,12个震荡周期。如果51芯片的频率是12MHz,那么震荡周期就是1/12M秒,而机器周期就是12×1/12M秒,就是1/1M秒,即1/1000000秒,也就是1微秒。

计数1000次就是1毫秒了;

然后就是如何使用计数器中断了
计数器中断定义和外部中断定义相同格式如下:

void timer0() interrupt 1

定义好了就是如何让他正常工作了

 TMOD=0x11; //这种计数器0和1的工作模式,高4位设置计数器1,低4位设置计数器0,我们都设置在工作模式1上。EA=1;  //中断的全局是能开关,使用任何中断都需要打开ET0=1; //计数器0中断允许控制位ET1=1; //计数器1中断允许控制位TR0=1; //计数器工作开关,1-开始工作; 0-停止工作TR1=1; //同上


TMOD各个字段的含义:
GATE: 为1时,与INT0/1引脚共同控制计数器0/1。我们默认使用0,不受INT0/1控制;
C/T: C为Couter,计数器模式,T为Timer,定时器模式;T上面有横杠,说明是0有效;Timer模式的时候,使用系统内部时钟输入;Couter模式的时候,使用T0/1引脚输入;
M1M0两位组成了4种工作模式:

  • 00 :13位定时器,TL0/1只用低5位;TH0/1全部使用;
  • 01 : 16位定时器, TH0/1,TL0/1都使用
  • 10 : 8位自动重装定时器,当溢出时,将TH0/1存放的值自动装入TL0/1
  • 11 : 计时器1停止计数;计时器0作为两个8位寄存器使用;TL0由计数器0控制位控制,TH0由计数器1控制位控制

下面是完整代码实现,实现每秒种LED状态翻转:

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;sbit LED1=P2^0;
sbit LED2=P2^1;void timerInit()
{TMOD=0x11;EA=1;  ET0=1; ET1=1;TR0=1;TR1=1;TH0=0xFC;TL0=0x6A;TH1=0xFC;TL1=0x6A;
}
void timer0() interrupt 1
{static u16 counter=0;if(counter==1000){LED1=~LED1;counter=0;}counter++;TH0=0xFC;TL0=0x6A;
}
void timer1() interrupt 3
{static u16 counter=0;if(counter==1000){LED2=~LED2;counter=0;}counter++;TH1=0xFC;TL1=0x6A;
}void main()
{timerInit();while(1);
}

代码中我们的计数值不是0xFC18,而是0xFC6A,因为我使用的单片机频率不是12MHz,而是11.018398MHz.

【51单片机】计时器/计数器中断相关推荐

  1. 51单片机定时器/计数器(定时器中断)

    51单片机定时器/计数器(中断系统:定时器中断) 实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1.51单片机定时器原理 定时器实质上就是一个加1 ...

  2. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  3. 【51单片机】外部中断

    51的 外部中断 与 定时器(内部中断) 有一个共同特点,那就是与主程序是并行工作的,就是主程序在运行的时候,中断也在等待触发条件,当中断被触发的时候会暂停主程序转而执行中断服务程序,只有中断服务程序 ...

  4. 51单片机之外部中断拙见

    外部中断需要注意的点 1. 外部中断其实是包含在中断系统中的,STC89Cx系列单片机提供4个外部中断:外部中断0(INT0),外部中断1(INT1),外部中断2(INT2),外部中断3(INT3) ...

  5. 【C 语言实现51单片机计时器】

    C语言实现51单片机计时器 代码如下 接线如下 代码如下 #include <reg51.h>sbit Hc38A=P2^2; sbit Hc38B=P2^3; sbit Hc38C=P2 ...

  6. 51单片机DS18B20与中断冲突解决方式

    51单片机DS18B20与中断冲突解决方式 应用场所 在使用51单片机DS18B20的过程中,总会遇到中断(这里的中断主要是指定时器中断和串口中断)与其时序产生冲突,从而导致读取不稳定的情况发生. 问 ...

  7. 51单片机:外部中断实现流水灯

    51单片机:外部中断实现流水灯 作业要求: 按照给定的实验板电路图编程实现外部中断控制流水灯,初始上电时,实验板右下侧的流水灯区域只有最右侧LED灯亮,其他灯全都熄灭,每按下一次按键,流水灯从右向左流 ...

  8. 51单片机计时器中断

    单片机中,中断算是一个比较重要的部分,在51单片机中有八种中断方式 ,其中常用的的有五种,分别是外部中断0,计时器中断0,外部中断1,计时器中断1,和串口中断.今天主要介绍的是计时器中断. 51单片机 ...

  9. 51单片机c语言中断嵌套,51单片机的中断优先级及中断嵌套

    说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套.现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了. 在说到中断之前,我先来定义一下优先 ...

最新文章

  1. 拿下中科大的计算机课程全靠它了!
  2. Web Dynpro公开课学习
  3. 什么是HTML5?HTML5发展前景如何?
  4. 长链剖分:O(nlogn)预处理O(1)求kth祖先
  5. centos7 批量创建samba用户_蜗牛星际基于centos7的NAS系统配置
  6. postMessage跨域、跨iframe窗口消息传递
  7. grub2配置原理分析
  8. 英国FCA将比特币ATM加入未注册加密业务名单
  9. 最小生成树(hdu1233还是畅通工程)
  10. 亚马逊“不香了”,高管为何频繁离职?
  11. 【C++】accumulate函数的用法(STL)
  12. MySql(16)——Spring data jpa mysql 乐观锁 与 AtomicInteger
  13. Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
  14. 如何去掉暴风影音广告,去掉暴风影音暂停时的广告
  15. 计算机网络---TCP/IP网络编程实验
  16. HTML自动回答,自动回复.html
  17. 从EXCEL的超链接中批量提取图片
  18. Android4.4 状态栏WiFi图标显示流程
  19. WIN10 JDK下载及安装说明
  20. 【Python】pyqt5-----QLabel

热门文章

  1. 根据出生日期自动计算年龄
  2. python程序设计丁亚涛版_Python程序设计
  3. java变量重名问题
  4. 计算机原理【七】之 输入输出系统
  5. C19 the silver doe 银鹿
  6. 信创实际落地如何?详解《2021中国信创产业应用落地研究报告及供应商60强》
  7. Shell脚本语法小全
  8. smba简单设置共享
  9. 最新干货get,手机相机项目的整体测试流程是怎样的?
  10. 乘新能源汽车产业发展东风,智能网联驶入快车道