51单片机-定时器中断函数的使用

最新更新时间:1970-01-01来源: eefocus关键字:51单片机  定时器  中断函数 手机看文章 扫描二维码
随时随地手机看文章

1.定时器与延时的区别

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


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


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

 

2.定时器中断函数

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


还记得外部中断这个图吗

8.3.png

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

QQ截图20200518195134.png


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

6.11.png

这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“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;

    }

}


关键字:51单片机  定时器  中断函数 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic545700.html

上一篇:51单片机-定时器工作模式2
下一篇:51单片机-定时器初始化新写法

推荐阅读

51单片机DHT11温湿度传感器
;     rec_dat[4]=' ';        rec_dat[5]=' ';        rec_dat[6]='0'+(TH/10);        rec_dat[7]='0'+(TH%10);        rec_dat[8]='C';    }}/*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中
发表于 2022-01-20
<font color='red'>51单片机</font>DHT11温湿度传感器
51单片机AD转换之PCF8591
。AGND:模拟信号地。VREF:基准电源端。2.应用分析AD转换部分电路图:要求:使用LCD1602将电压值显示出来,调节变阻器改变电压值说明:以下代码中用到了LCD1602驱动程序和I2C总线驱动程序,请参考博主51单片机栏目下的博客。#define uint unsigned int#define uchar unsigned char/*查阅pcf8591的资料可知它的都写地址如下*/#define  WRITEADDR 0x90    //写地址#define  READADDR  0x91    //读地址uchar dat[6];void
发表于 2022-01-20
<font color='red'>51单片机</font>AD转换之PCF8591
51单片机汇编语言实验(一)-----数字量输入输出
一、实验目的:   学习单片机IO口的输入输出操作二、实验设备:   PC计算机一台,Dais-52PRO+实验系统一套。三、实验内容:   1. P1口I/O实验   2. P1口流水灯实验四、P1口I/O实验:   1、实验原理:   数字量从P1口的低4位输入,从P1口的高4位输出控制发光二极管的亮灭,输入与输出一一对应。   2、实验步骤:  ①将试验箱IO区的P1.0 到P1.3与拨码开关区的K0~K3按下图连线;  ② 将试验箱IO区的P1.4 到P1.7与LED区的L0~L3按下图连线;  ③ 编写程序,经编译、链接无语法错误后装载到实验;  ④ 运行程序,拨动K0到K3,观察L0~L3的对应显示;  ⑤ 实验完毕后,
发表于 2022-01-20
<font color='red'>51单片机</font>汇编语言实验(一)-----数字量输入输出
51单片机汇编语言实验(三)-----定时/计数器实验
一、实验目的:   学习定时/计数器的工作方式,掌握程序设计方法。二、实验设备:   PC计算机一台,Dais-52PRO+实验系统一套。三、实验内容:   1. 定时器实验   2. 计数器实验四、 定时器实验   1、实验原理:   使用T0进行定时,编写程序,使P1.0控制的发光二极管L0每隔2秒交替点亮或熄灭。   2、实验步骤:  ① 将试验箱IO区的P1.0与LED区的L0按图下图连线;  ② 编写程序,经编译、链接无语法错误后装载到实验系统;  ③ 运行程序,观察发光二极管L0,应每隔2秒交替点亮或熄灭;  ④ 实验完毕后,应使用暂停命令中止程序的运行。   3、参考代码://实验三    定时器实
发表于 2022-01-20
<font color='red'>51单片机</font>汇编语言实验(三)-----定时/计数器实验
51单片机汇编语言实验(四)----串行通信实验
一、实验目的:   学习串行口的工作方式,掌握单片机通信程序编制方法。二、实验设备:   PC计算机一台,Dais-52PRO+实验系统一套。三、实验内容:   与PC进行串行通信四、与PC进行串行通信   1、实验原理:   8051单片机通过MAX232芯片与PC机进行通信,在PC机上运行串口助手软件。PC机通过软件助手发数据给单片机,单片机收到数据后取反发给PC机,可以在PC上观察数据。   2、实验步骤:  ① 将IO口区的P3.0与PACK区扩展板的RXD(P3.0)连接;  ② 将IO口区的P3.1与PACK区扩展板的TXD(P3.1)连接;  ③ 将PACK区模块的DB9通过串口线与PC的DB9连接;  ④ 在PC机
发表于 2022-01-19
<font color='red'>51单片机</font>汇编语言实验(四)----串行通信实验
51单片机汇编语言实验(六)-----8255键盘与显示设计
;   END 五、 实验效果视频演示博文51单片机汇编语言实验8255键盘显示设计效果视频演示.
发表于 2022-01-19
<font color='red'>51单片机</font>汇编语言实验(六)-----8255键盘与显示设计

推荐帖子

TMS320F28035学习记录四
1、F28035_Device.h此文件是常用的宏的定义,里面定义了数据类型,包含了必要的头文件,还有所使用器件的定义.如果使用其它器件,可以在这里更改。2、F28035_Examples.h它是为了设置PLL,系统时钟,而定义的常数。3、F28035_CodeStartBranch.asm控制启动时转向的。它关闭看门狗并转向程序入口。4、F28035_DefaultIsr.c此文件包含外设的ISR例程。在开发过程中,这些ISR例程可以被消除,并与用户自己的ISR例程替换为每个中断。由于这些外
tangxing 微控制器 MCU
f2812官方例程代码在ccs4.24编译错误
安装的ccs4.2.4,,从官网下载了代码sprc097,里面有一个DSP281x_examples_ccsv4文件夹,导入工程到ccs编译提示“thisprojectwascreatedusingaversionofcodegenerationtoolsthatisnotcurrentlyinstalled:5.2.1[c2000].pleaseinstallthecodegenerationtoolsofthisversion,ormigrat
elvike DSP 与 ARM 处理器
DSP2812调试问题
我写的四位数码管显示程序,全速运行是对的,可一单步就不行了,还有数码管闪烁,单步完全没效果,求哪位高手指教,小弟刚入门。。。DSP2812调试问题
逸言 DSP 与 ARM 处理器
F28335 PWM输出只与CMPA有关
我现在想实现A、B两个通道的独立控制,但是现在发现无论怎么配置,输出波形都只与EPWMxA的比较值有关,有大神知道是怎么回事吗? F28335PWM输出只与CMPA有关
281579926 微控制器 MCU
micropython@esp8266没有内置struct模块
import了一下,ImportError:nomodulenamed'struct' 不知道bytes转string还有啥可用的?micropythonbytes本身不支持decode micropython@esp8266没有内置struct模块
johnrey MicroPython开源版块
一个较完整的74HC595显示资料,程序精炼、易懂
74HC595资料,显示电路及汇编程序。 [本帖最后由laobo于2009-7-1010:23编辑]一个较完整的74HC595显示资料,程序精炼、易懂
laobo 单片机
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved