1.定时器与延时的区别

大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。

而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。

所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。

2.定时器中断函数

与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。

还记得外部中断这个图吗

同样定时器0的中断函数使能如下

至于“interrupt”后面的数字为什么是1,请再看我们以前给过大家的这个图的中断函数编号就明白了

这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。

使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。

如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。

这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。

在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。

3.代码#include

#include //详见第六章第8讲

void main()

{

LED_Init();  //初始化LED硬件模块

EA = 1;      //闭合总中断开关

TMOD = 0x01; //设置定时器0为工作模式1

TH0  = 0x94; //设置定时时间为30ms

TL0  = 0x00;

ET0  = 1;    //闭合定时器0中断的开关

TR0  = 1;    //启动定时器0

while(1);

}

void TIM0_IRQHandler() interrupt 1

{

static u8 i;

TH0  = 0x94;  //重新设置定时时间为30ms

TL0  = 0x00;

P0=~(0x80>>i);//这一次让流水灯向右移

i++;

if(i>=8)i=0;

}

觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下void TIM0_IRQHandler() interrupt 1

{

static u8 i,cnt;

TH0  = 0x94;      //重新设置定时时间为30ms

TL0  = 0x00;

cnt++;

if(cnt>=10)

{

cnt=0;

P0=~(0x80>>i);//这一次让流水灯向右移

i++;

if(i>=8)i=0;

}

}

定时器中断程序 c语言,定时器中断函数的使用相关推荐

  1. c语言定时器实验程序,C语言定时器实验.doc

    C语言定时器实验 实验三 C语言定时器实验 一.实验目的 1.进一步熟悉DSP的中断机制 2.在掌握中断服务程序编写的基础上进一步熟悉定时器的运用 3.进一步掌握如何编写DSP中断服务子程序 二.实验 ...

  2. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  3. 子程序与中断程序的异同_中断是什么意思?和子程序有什么区别?

    展开全部 中断程序是在中断事件发生时调用,程序也不知道什62616964757a686964616fe59b9ee7ad9431333365643536么时候有中断事件发生.子程序是在需要的时候调用, ...

  4. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)

    EA     是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断; ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发 ...

  5. stm8s跳出中断程序c语言,stm8s103 利用中断判断长按短按,长按可以实现进入低功耗 短按1-2s跳出低功耗进入工作,实际情况是短按立马跳出低功耗,请各位大侠帮忙看看。附程序...

    声明 #include  "STM8S103F2P.h" #define uint  unsigned int #define uchar unsigned char #defin ...

  6. 定时器自动装载c语言,定时器初始化新写法

    1.书写优化 我们所写过的下面这些 TH0=0XB8; TL0=0X00; 或者 TH0=0X4C; TL0=0X00; 如果代码没有注释我们根本不知道这是要定时多长时间,所以为了增加程序的可读性,我 ...

  7. 两个字符串连接程序C语言,写一个函数,将两个字符串连接。 C语言

    写一个函数,将两个字符串连接. 以下是此题的[c源代码],需要[c++源代码]请点击进入 #include int main() {void concatenate(char string1[],ch ...

  8. M40 定时器 中断程序形象化理解

    框架与要点 编写单片机类的程序,最核心.最重要的是上面的框架. 硬件支持:单片机 软件框架 初始化代码 时钟配置 定时器配置 中断配置 功能代码 通过此框架我们会明白,初始化代码是重中之重.实际初始化 ...

  9. 四,中断:中断程序(汇编和C语言)、idt、IDTR、8259A、8253以及发生中断时候的压栈细节和特权级保护

    中断: 由于CPU获知了计算机中发生的某些事,CPU暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后,CPU继续执行刚才的程序,整个过程称为中断处理,也称为中断.没有中断,操作系统 ...

最新文章

  1. js中match、replace方法中使用正则表达式
  2. Scrapy -- 05
  3. 【学习笔记】35、定义自己的异常类
  4. linux系统怎么访问u盘文件系统,linux如何挂载U盘和文件系统
  5. linux中快捷脚本,Linux下Shell编程快捷键大全(日常整理)
  6. python学习之小说爬虫
  7. Python3.5(十三)迭代器生成器
  8. 【文献翻译】基于CVSS的IT系统网络安全风险定量评估方法-A Quantitative CVSS-Based Cyber Security Risk Assessment Methodology
  9. 从 6 万用户评论中,选出 23 门全世界最好的 CS 免费课!
  10. wangeditor上传本地视频的方法
  11. 关于iPhone 6S你想知道的一切
  12. 用php如何写后台数据,PHP后端接口怎么写
  13. C1认证学习三(数据校验)
  14. 以亲身经历解读经典的定律或法则
  15. MySQL表中的联合查询
  16. 图的连通,连通图,连通分量,强连通分量
  17. ——廖一梅《像我这样笨拙地生活》经典语录
  18. ModelAndView绑定数据模型配合Thymeleaf渲染数据用法学习
  19. Tableau已经安装且重装时提示试用期结束了怎么办?(该方法已经过期!请到官网下载免费版,谢谢!)
  20. DELL服务器修改SN号流程

热门文章

  1. 笑喷---买过的最离谱的东西
  2. 《未来绽放的篇章》——毕业季征文,展望充满希望的前方
  3. 【物联网】20.物联网传感器信号处理 - 数模转换(DA)
  4. 华为注册了整本山海经?这是专属于中国人的终极浪漫!
  5. android中Mms学习笔记
  6. 《微软:DirectShow开发指南》第12章 Writing DirectShow Source Filters
  7. 我,19岁,在校大学生,学编程每月赚2000多外快。。。
  8. 每个黑ke必须学习的9大技能
  9. 医院导诊图怎么做?目前比较好用的医院导航地图是哪一款?
  10. 通过ajax将数组或list集合传到后台的方法