博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51单片机 | 定时器中断应用实例
阅读量:4512 次
发布时间:2019-06-08

本文共 1256 字,大约阅读时间需要 4 分钟。

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

定时器中断应用实例

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

设计要求:

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

 

实现思路:

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

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

模块设计

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

实现代码

1 #include 
2 #include
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; //初始化LED20 TMOD = 0x01; //初始化TMOD,定时器0,方式121 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 }

 

转载于:https://www.cnblogs.com/hughdong/p/6877973.html

你可能感兴趣的文章
Dynamic CRM 中修改实体中主字段的长度
查看>>
更新ruby
查看>>
[Angular] Create a custom validator for template driven forms in Angular
查看>>
[React] Make Controlled React Components with Control Props
查看>>
[Python] Indexing An Array With Another Array with numpy
查看>>
css写的手机网站页面如何使网页左右固定不动?
查看>>
解析 Linux 中的 VFS 文件系统机制
查看>>
互联网网海无边,我精力有限
查看>>
P1531 I Hate It
查看>>
ecshop调用指定商品分类下的商品
查看>>
springmvc+json 前后台数据交互
查看>>
NPOI 模板 下载
查看>>
js 常用代码
查看>>
module.js:550 throw err; ^ Error: Cannot find module 'portfinder' at Function
查看>>
tar打包压缩命令
查看>>
objc反汇编分析,block函数块为何物?
查看>>
CSS概念【记录】
查看>>
Hibernate 实体关联关系映射(转载)
查看>>
isNotEmpty 与 isNotBlank 的区别
查看>>
HTML特效代码大全
查看>>