单片机定时器中断原理

发布者:落霞与孤鹜最新更新时间:2015-11-02 来源: eefocus关键字:单片机  定时器  中断原理 手机看文章 扫描二维码
随时随地手机看文章
#define _1231_C_

#include "reg51.h"

 

//sbit OE=P2^3;

unsigned int SystemTime;

void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑

{

    TH0 = 0xdb;

    TL0 = 0xff;

//    TF0 = 0;

    SystemTime++;

}

void main()

{

    TMOD &= 0xF0;

    TMOD |= 0x01; //TMOD的值表示定时器工作方式选择

    TH0 = 0xdb; //写入初始值,初始值可以决定定时多久

    TL0 = 0xff;

//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。

//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,

//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,

//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.

    TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;

    TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;

                 //相当于开水龙头,如TR0=0则TH0和TL0不变

    ET0 = 1; //允许定时器0中断

    EA=1;   //开总中断

//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;

//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}

//运行完中断部分的代码后,接着继续执行死循环里的代码。

//注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。

//如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。

    while(1)

    {

        if ((SystemTime0)<50)       //SystemTime除以100,余数小于50为真

        {

          …………;

        }

        else

        {

             …………;

        }

    };

}

释疑:void Timer0() interrupt 1 using 1

Timer0   是函数名,随便取的

interrupt   xx   using   y

跟在interrupt   后面的xx   值得是中断号,就是说这个函数对应第几个中断端口,一般在51中

  外部中断0   

  定时器0

  外部中断1

  定时器1

  串行中断

实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址

using    这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组   r0   --   r7寄存器,一共有32个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会谈出来节省代码和时间

初始值算法:定时器是当总数达到FFFFH后产生中断吧!那你要让它计数10000,是不是用FFFF(16进制)减去10000(十进制)的数当计数初值啊?TH0=-(10000/256); TL0=-(10000%6)跟FFFF(16进制)减去10000(十进制)的数是一样的。从TH0=-(10000/256); TL0=-(10000%6)开始计数,计数到10000刚好满。跟用FFFF(16进制)减去10000(十进制)的数一样!!!写起来更简单,不用算!!!

看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样

我们学习了用指令延时闪灯,但是用指令方式闪灯有cpu不能做其他工作的缺点。

这一课,我们将学习如何使用定时器方式使灯闪烁。

中断的理解。

这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中(主程序),可能会有其它的更紧急的需要做的事情(中断服务程序),需要cpu暂时停止当前的程序(主程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。

单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;定时在每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么了。

单片机的主程序是从0x0000开始运行的,单片机服务程序从哪里开始运行呢?在51里,有多个中断服务程序入口,0号入口是外中断0,地址在0x0003;1号入口是定时器0,在 0x000B;2号入口是外中断1;地址在0x0013,3号入口是定时器2;地址在0x001B,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。

在C51中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。

请看一下相关的51的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以做完试验再了解,因为例程中都已经为您设置好了。

请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的主程序。

在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时间。这里置入的是0x0006,还需要走 0x10000-0x0006个机器周期才溢出。换成10进制也就是每65530个机器周期中断一次。我们仿真的晶振是22118400HZ,每12个时钟一个机器周期。65530×12/22118400=0.036秒。也就是差不多28HZ的闪烁频率。

因为51的定时器最大只有0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这一课就先观察一下这个28HZ左右频率。在下一课我们会用静态变量的办法,做一个长达1秒钟的LED闪烁频率。

另外,由于51从中断发生到进入中断的时间不定,是3至8个机器周期,我们在进入了中断后才重新置新的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果要精确定时,需要使用定时器自动装载方式,也就是在定时器溢出的同时,硬件逻辑就自动把定时器初始值装载进去了,而不是在中断服务程序里赋初始值,这样就可以实现精确定时,误差只出现晶振的频率上。这是下一颗的内容。

现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以看到P10上的LED在快速闪烁。

顺便,也请再练习一下停止,单步,断点等等的调试方法。

一个特殊的地方,使用DX516在单步时运行时,可能无法进入到中断服务函数中。这是因为中断函数可能在单步处理的瞬间已经运行过去了。如果要单步调试中断服务函数,请在中断服务函数内设置断点,再点全速。稍后就会停止在断点上,就可以继续单步运行了。

关键字:单片机  定时器  中断原理 引用地址:单片机定时器中断原理

上一篇:MSP430中断c函数模板大全
下一篇:MSP430单片机ADC模块

推荐阅读最新更新时间:2024-03-16 14:38

单片机上实现动态加载功能的函数库介绍
dynamic_loader介绍 本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的
[单片机]
1wire系统中TM卡的单片机等效替换
  TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button)电池,可镶嵌于卡片、钥匙扣等物体上。   TM卡通过一个多功能器将数据线、地址线、控制线和电源线合并为1根线,实现单线通信。当主机加电时,TM卡通过500 kΩ和50 Ω阻抗之间的切换来响应主机,用信号被拉低的时长(长或短)来表示数字逻辑(长为1,短为0)。由于阻抗切换的幅度为10 000∶1,因此,触点的接触电阻不会影响数字信号的辨识。   2 1wire通信协议   单总线即只
[单片机]
1wire系统中TM卡的<font color='red'>单片机</font>等效替换
一种用于单片机的红外串行通信接口
摘要:阐述红外通信的基本工作原理;结合在单相电度表抄表系统中的具体应用,介绍一种适合单片机系统的红外通信方案,设计具体的硬件接口电路,说明其工作原理,给出应用于红外通信的程序流程,并指出在实施过程中应注意的一些问题。 关键词:单片机 红外通信 串行接口 抄表系统 引言 在很多单片机应用系统中,常常利用非电信号(如光信号、超声波信号等)传送控制信息和数据信息,以实现遥控或遥测的功能。例如在单相电度表抄表系统中,就是使用手持抄表器通过遥控的方式,来完成电度表用电量的抄录、设置表底数、电度表校时等工作。红外通信具有控制简单、实施方便、传输可靠性高的特点,是一种较为常用的通信方式。实现单片机系统红外通信的关键在于红外接口电路的设计以
[单片机]
AVR笔记3:AVRmega单片机熔丝位的设置详解及应用举例
一、正确配置AVR的熔丝位 对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。 (1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态, Unprogrammed 表示熔丝状态为 1 (禁止); Programmed 表示熔丝状态为 0 (允许)。因此,配置熔丝位的过程实际上是 配置熔丝位成为未编程状态 1 或成为已编程状态 0 。 (2)在使用通过选择打钩 方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚 表
[单片机]
单片机实验-利用定时器产生方波
ORG 0000H LJMP MAIN ORG 0003H LJMP TOINT ORG 001BH LJMP TOINT1 ORG 0030HMAIN: MOV SP,#60H SETB IT0 SETB EX0 SETB EA SJMP $TOINT:MOV TMOD,#10H MOV TH1,#0FEH MOV TL1,#0CH SETB ET1 SETB TR1 RETITOINT1:MOV TH1,#0FEH MOV TL1,#0CH CPL P1.0 RETI END
[单片机]
德州仪器2009年度“MCU Day”即将启动
针对多种超低功耗、实时控制以及基于ARM® 的解决方案提供深入培训 德州仪器 (TI) 将于9月初相继在全球超过150个国家与地区启动堪称公司最大规模的全球性培训活动——MCU Day,此举将把在业界深受欢迎的“430 Day”进一步推向深入,同时加入更丰富的内容,为广大客户提供有关 TI 各种创新型、智能化、低能耗 MCU 解决方案系列的技术信息。MCU Day 是一项为期一天的免费技术培训活动,内容不仅涵盖 TI 各种微处理器 (MCU) 产品系列,如 MSP430™ 超低功耗 MCU、TMS320C2000™ 实时 MCU 、基于 ARM® Cortex-M3 的 Stellaris® MCU以及基于 ARM9
[单片机]
STC15W408AS单片机白光T12控制器
自己 设计和制作的stc白光,附上原理图,洞洞板走线图和源代码。 只实现了简单的温控,短按一下编码器快速设定温度为300℃,双击一下编码器快速设定为10℃(相当于短暂休眠 代码注释还是很详细的,适合初学者学习。 单片机源程序如下: /** 布满星星的天空 CZS 编写 */ #include STC15.h #include intrins.h #include math.h sbit t12 = P3 ^ 7; //T12控制 sbit encoderb = P1 ^ 0; //编码器的b脚 sbit encodera = P1 ^ 1; //编码器的a脚 sbit encod
[单片机]
STC15W408AS<font color='red'>单片机</font>白光T12控制器
单片机的指令系统和寻址方式
  单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由CPU执行该程序。程序是由指令组成的,指令的基本组成是操作码和操作数。单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有指令代码也各不相同,因此,必须对所选单片机的全部指令,也就是所谓“指令系统”,有足够的了解。各个系列的单片机虽然有不同的指令系统,但也有其共同性。掌握一种单片机的指令系统,对其它系列单片机可以起到触类旁通的作用。MCS-51单片机应用广泛,派生品种多,具有代表性,所以,这里以MCS-51系列的指令系统为例说明“指令”的组成和应用。   1、MOVA,#20H   这条指令表示把20H这个数送入累加器A中(一个特殊功能寄存器)。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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