单片机定时器中断原理和C语言代码详解_第1页
单片机定时器中断原理和C语言代码详解_第2页
单片机定时器中断原理和C语言代码详解_第3页
单片机定时器中断原理和C语言代码详解_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机定时器中断原理和C语言代码详解我之前都是用ARM7,单片机根本不会。但一个工程要用到51,所以克了一下51还是有点模 糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。废话不说了,上 代码。#define _1231_C_#include reg51.h#include 1231.h/sbit OE=P2A3;unsigned int SystemTime;void timerO(void) interrupt 1 using 3 /中断局部代码,见下文的释疑(TH0 = Oxdb;TLO = Oxff;/ TFO = 0;SystemTime+;void main()

2、(TMOD &= OxFO;TMOD |= OxO1; /TMOD的值表示定时器工作方式选择THO = Oxdb; /写入初始值,初始值可以决定定时多久TLO = Oxff;根据下文的木桶比喻的话,如果THO = OxOO;TLO = OxOO;那么表示从桶底开始装水。/THO = Oxdb;TLO = Oxff;可以这样子理解相当丁木桶里已经有局部液铅在里面,/THO和TLO这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装 水,/TH0 = 0 xff;TL0 = 0 xff;即表示桶的最高位置.TF0 = 0; /计数到时TF0为1,即当TH0 = 0 xff;

3、TL0 = 0 xff;再运行一步TF0 = 1;TR0 = 1; /开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0 xff;TL0 =0 xff ;/相当于开水龙头,如TR0=0那么TH0和TL0不变ET0 = 1; /允许定时器0中断EA=1;/开总中断下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0 xff;TL0 =0 xff ;单片时机从死循环里退出,去执行中断局部的代码,即开始运行void timer0(void)interrupt 1 using 3(运行完中断局部的代码后,接着继续执行死循环里的代码。/注意:当TH0 =

4、0 xff;TL0 = 0 xff;再运行,TF0并没有从0变为1 ,个人猜想TF0=1 ;时触发了中断,并重新被置零。/如把ET0 = 1;和EA=1;注释掉,当TH0 = 0 xff;TL0 = 0 xff;再运行,TF0会变为1 ,此时不会再执行中断局部代码。while(1)(if (SystemTime%100)释疑:void Timer0() interrupt 1 using 1Timer0是函数名,随便取的interrupt xx using y跟在interrupt后面的xx值得是中断号,就是说这个函数对应第几个中断端口,一般在51中0外部中断01定时器02外部中断13定时器1

5、4申行中断实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址using y这个y是说这个中断函数使用的那个存放器组,51里面一般有4组r0 - r7存放器,一共有32个,如果你的终端函数和别的程序用的不是同一个存放 器组那么进入中断的时候就不会将存放器组压入堆栈返回时也不会谈出来节省代码和时间初始值算法:定时器是当总数到达FFFFH后产生中断吧!那你要让它计数10000,是不是用FFFF 16进制减去10000十进制的数当计数初值 啊?TH0=-10000/256;TL0=-10000%256跟FFFF16进制减去10000十进制的数是一样的。从TH0=-10000/256;

6、 TL0=-10000%256开始计数,计数到10000刚好满。跟用FFFF16进制减去10000十进制的数一样! !写起来更简单,不 用算! ! ! 看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对 值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样 中断的理解。这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中主程序,可能会 有其它的更紧急的需要做的事情中断效劳程序,需要cpu暂时停止当前的程序主程序, 做完了中断效劳程序之后,乂可以继续去运行先前的程序主程序。就像你正在吃饭, 一边

7、乂在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶, 再回来吃饭。单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头翻开了;开始装水了;定时在 每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出 时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机乂可以回到 刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么了。单片机的主程序是从0 x0000开始运行的,单片机效劳程序从哪里开始运行呢?在51里,有 多个中断效劳程序入口,0号入口是外中断0,地址在0 x0003 ; 1号入口是定时器0,在

8、0X000B ; 2号入口是外中断1 ;地址在0 x0013 , 3号入口是定时器2 ;地址在0X001B ,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断效劳程序,运行完之后,乂跳回到原来的位置继续运行。在C51中,你不用理会中断效劳程序放在哪里,会怎么跳转。你只要把某个函数标识为几号中断效劳函数就可以了。在发生了对应的中断时,就会自动的运行这个函数 请看一下相关的51的硬件的书,对定时器工作的存放器设置做进一步的了解。也可以做完试 验再了解,因为例程中都已经为您设置好了。请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的主程序。在定时器效

9、劳函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时问。这里置入的是0 x0006,还需要走0 x10000-0 x0006个机器周期才溢出。换成10进制 也就是每65530个机器周期中断一次。我们仿真的晶振是22118400HZ,每12个时钟一个 机器周期。65530X 12/22118400= 0.036秒。也就是差不多28HZ的闪烁频率。因为51的定时器最大只有0 xffff,溢出的速度很快,无法做出更久的闪烁频率来,这一课就先观察一下这个28HZ左右频率。在下一课我们会用静态变量的方法,做一个长达1秒钟的LED闪烁频率。另外,由于51从中断发生到进入中断的时间不定,是3至8个机器周期,我们在进入了中断 后才重新置新的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果要精确定 时,需要使用定时器自动装载方式,也就是在定时器溢出的同时,硬件逻辑就自动把定时器初 始值装载进去了,而不是在中断效劳程序里赋初始值,这样就可以实现精确定时,误差只出现 晶振的频率上。这是下一颗的内容。现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以看到P10上的LED

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论