下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机定时器中断原理和 C语言代码详解(转)来源:ChinaUnix 博客 日期:2009.07.21 08:59(共有条评论)我要评论我之前都是用ARM7,单片机基本不会。但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对 51定时器中断有些心得,拿来和大家共享。废话不说了,上代码。#defi ne _1231_C_#i nclude reg51.h#i nclude 1231.h/sbit OE=P2A3;un sig ned int SystemTime;void timerO(void) in terrupt 1 using 3 /中断部分代码,见下文的释疑T
2、H0 = 0xdb;TL0 = 0xff;/ TF0 = 0;SystemTime+;void mai n()TMOD &= 0xF0;TMOD |= 0x01; /TMOD的值表示定时器工作方式选择TH0 = 0xdb; /写入初始值,初始值可以决定定时多久TL0 = 0xff;/根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。/TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,/TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,/TH0 = 0xff;TL0 = 0x
3、ff;即表示桶的最高位置 TF0 = 0; /计数到时 TF0 为 1,即当 TH0 = 0xff;TL0 = 0xff ;再运行一步 TF0 = 1;TR0 = 1; /开始计数,从这时起,每运行一步TH0和TL0都会增加,直到 TH0 = 0xff;TL0 = 0xff/相当于开水龙头,如TR0=0贝U TH0和TL0不变ET0 = 1; /允许定时器0中断EA=1;/开总中断/下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff ;/单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) inter
4、rupt 1 using3/运行完中断部分的代码后,接着继续执行死循环里的代码。/注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1 ;时触发了中断,并重新被置零。/如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。while(1)if (SystemTime%100)释疑: void Timer0() interrupt 1 using 1Timer0 是函数名 , 随便取的 interrupt xx using y跟在 interrupt后面的 xx
5、值得是中断号,就是说这个函数对应第几个中断端口,一般在51 中0外部中断 01定时器 02外部中断 13定时器 14串行中断实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址using y 这个 y 是说这个中断函数使用的那个寄存器组, 51 里面一般有 4 组 r0 - r7 寄存器,一 共有 32 个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压 入堆栈返回时也不会谈出来节省代码和时间初始值算法:定时器是当总数达到 FFFFH 后产生中断吧!那你要让它计数 10000 ,是不是用 FFFF (16 进 制)减去 10000 (十进制)
6、的数当计数初值 啊? TH0=-(10000/256); TL0=-(10000%256)跟 FFFF( 16进制)减去 10000 (十进制)的数是一样的。从 TH0=-(10000/256); TL0=-(10000%256) 开始计数, 计数到 10000 刚好满。跟用 FFFF( 16 进制)减去 10000 (十进制)的数一样!写起来更简单,不 用 算! 丿 I 看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进 制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用 FFFF 减去它的绝对值一样 中断的理解。这里将涉及到单
7、片机中断的应用,在 cpu 的一步步按照指令运行的过程中(主程序),可能会有其它的更紧 急的需要做的事情(中断服务程序),需要 cpu 暂时停止当前的程序(主程序),做完了(中断服务程序) 之后,又可以继续去运行先前的程序(主程序)。就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水 满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;定时在每个机器周期 不断自动加 1 ,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出时,你就要去做处理了;水 桶的水满了,你也应该处理一下了;处理完后,单片机又可以回
8、到刚刚开停止的地方继续运行;水桶处理了, 先前你在做什么也可以继续去做什么了。单片机的主程序是从 0x0000 开始运行的,单片机服务程序从哪里开始运行呢?在 51 里,有多个中断服务 程序入口, 0 号入口是外中断 0,地址在 0x0003 ;1 号入口是定时器 0 ,在 0x000B ;2 号入口是外中断 1; 地址在 0x0013 ,3 号入口是定时器 2 ;地址在 0x001B ,等等。当中断发生时,程序就记下当前运行的位 置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。在 C51 中,你不用理会中断服务程序放在哪里, 会怎么跳转。你只要把某个函数标识
9、为几号中断服务函数就 可以了。在发生了对应的中断时,就会自动的运行这个函数。请看一下相关的 51 的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以做完试验再了解,因 为例程中都已经为您设置好了。请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的主程序。 在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时间。这里置入 的是 0x0006 ,还需要走 0x10000-0x0006 个机器周期才溢出。换成 10 进制也就是每 65530 个机器周 期中断一次。我们仿真的晶振是22118400HZ ,每12个时钟一个机器周期。65530
10、X 12/22118400=0.036 秒。也就是差不多 28HZ 的闪烁频率。因为 51 的定时器最大只有 0xffff ,溢出的速度很快,无法做出更久的闪烁频率来,这一课就先观察一下这 个 28HZ 左右频率。在下一课我们会用静态变量的办法,做一个长达1 秒钟的 LED 闪烁频率。另外,由于 51 从中断发生到进入中断的时间不定,是 3 至 8 个机器周期,我们在进入了中断后才重新置新 的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果要精确定时,需要使用定时器自动装 载方式,也就是在定时器溢出的同时,硬件逻辑就自动把定时器初始值装载进去了,而不是在中断服务程序 里赋初始值,这样就可以实现精确定时,误差只出现晶振的频率上。这是下一颗的内容。现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以看到 P10 上的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北机场管理集团秋招试题及答案
- 河北地矿集团秋招面笔试题及答案
- 海南水务集团秋招面试题及答案
- 海南粮食和物资储备集团校招试题及答案
- 海南交通投资公司秋招试题及答案
- 海南海洋产业集团校招面笔试题及答案
- 贵州现代物流产业集团秋招面试题及答案
- 团队协作任务分配与执行进度模板
- 商务会议效率提升标准化会议模板
- 2026年国防知识竞赛试卷含答案(共三套)
- 2025-2026学年人美版(2024)小学美术三年级上册教学计划及进度表
- 4.新技术巧应用教学设计-2025-2026学年小学劳动皖教版五年级下册-皖教版
- 灌肠操作并发症及处理
- 市政项目质量培训课件
- 电子信息工程专业毕业论文
- 幼儿园食堂日管控,周排查,月调度工作制度
- 浙江瑞森智能包装材料有限公司年产5万吨食品级可降解无菌包装材料生产线项目环评报告
- 2025年教科版新教材科学三年级上册教学计划(含进度表)
- 2025年初级会计考试资产试题及答案
- 药物研发全流程解析
- 妊娠期糖尿病病例讨论
评论
0/150
提交评论