zoukankan      html  css  js  c++  java
  • 51单片机 | 定时器中断应用实例

    ————————————————————————————————————————————

    定时器中断应用实例

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    设计要求:

    每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果

     

    实现思路:

    • 通过定时/计数器,每秒触发一次P1.0取反
    • 涉及到的功能模块:定时器,中断,LED操作
    • 定时器装填:

      需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式265536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填

    模块设计

    • 初始化
      • LED(上拉输入模式)
      • 定时器(T0,工作方式1,装填初值,启动(在中断初始化后启动))
      • 中断(开放中断,开放T0中断)
    • while(1)
    • 中断
      • 重置定时器(溢出位复位,重新装填计时)
      • 判断溢出次数(到达20次时LED改变状态,计数清零。未到达20次时溢出次数加一)

    实现代码

     1 #include <reg52.h>
     2 #include <intrins.h>
     3 typedef unsigned char uchar;
     4 sbit LED = P1 ^ 0;
     5 uchar count = 0;
     6 void Interrupt() interrupt 1
     7 {
     8     TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时
     9     TL0 = (65536 - 46080) % 256;
    10     if (count == 20)
    11     {
    12         LED = ~LED;
    13         count = 0;
    14     }
    15     else ++count;
    16 }
    17 void main(void)
    18 {
    19     LED = 0xff; //初始化LED
    20     TMOD = 0x01; //初始化TMOD,定时器0,方式1
    21     TH0 = (65536 - 46080) / 256; //装填计数
    22     TL0 = (65536 - 46080) % 256;
    23     EA = 1; //开放所有中断
    24     ET0 = 1; //开放定时器0中断控制位
    25     TR0 = 1; //定时器0开始计时
    26     while(1)
    27     {
    28         _nop_();
    29     }
    30 }
  • 相关阅读:
    什么是多线程中的上下文切换?
    什么是基本表?什么是视图?
    什么是存储过程?用什么来调用?
    随意写文件命令?怎么向屏幕输出带空格的字符串,比如” hello world”?
    NULL 是什么意思 ?
    Mock 或 Stub 有什么区别?
    什么叫视图?游标是什么?
    什么是微服务中的反应性扩展?
    什么是线程组,为什么在 Java 中不推荐使用?
    Java 中用到的线程调度算法是什么?
  • 原文地址:https://www.cnblogs.com/hughdong/p/6877973.html
Copyright © 2011-2022 走看看