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. 调整代码生成工具Database2Sharp的Winform界面生成,使其易于列表工具栏的使用。...
  2. 一款很好用的JQuery dtree树状图插件(一)
  3. mysql 共享表空间存储_MySQL InnoDB共享表空间
  4. 新能源汽车简史——电动汽车沉浮录
  5. Linux Shell 编程实战技巧
  6. 软件设计师的成长之路
  7. MATLAB三维散点图的绘制(scatter3、plot3)
  8. finereport9.0破解版|finereport10.0破解并发数|finereport授权注册|FineBI5.0破解lic
  9. 数学建模:线性规划—投资的收益和风险模型 (Python 求解)
  10. 360全景倒车影像怎么看_最近淘了一个360度全景倒车影像-4路行车记录仪监控录像,和大家分享一下...
  11. BEC higher经验1
  12. ajax的readystate为3,为什么在做ajax时无法获得readyState 3(why can't get readyState 3 when doing a ajax)...
  13. 测试分析与测试用例设计方法
  14. 参考文献标号字体_论文参考文献文字格式
  15. html5 人在星空中,《在星空中》的教学设计
  16. Nginx知识点整理
  17. 让我们来谈谈python中的prettyprint和pprint
  18. 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程...
  19. m4r格式转换器免费版 V3.0
  20. 如何成为一名真正的数据分析师或者数据工程师

热门文章

  1. 观视界Grandvision EDI项目案例
  2. iOS开发者如何分配利用好自己的时间去进阶
  3. 怎么用计算机求称呼,亲戚关系称呼神器 三姑六婆计算器
  4. VIEW PUSHED PREDICATE(谓词推入)引发的惨剧
  5. nrm : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
  6. OpenGL Transform Feedback
  7. Java八个基本数据类型所占字节数
  8. 银行转账java mysql_如何编写一个银行转账案例?
  9. OATS正交表测试策略-Zee
  10. vue中mapGetters函数前面的三个点是什么意思?