- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
cpu定时器作用
单片机定时器中断原理和C语言代码详解(转)
来源: ChinaUnix博客 日期: 2009.07.21 08:59 (共有条评论)?我要评论 ? 我之前都是用ARM7,单片机基本不会。但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。废话不说了,上代码。#define _1231_C_#include reg51.h#include 1231.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 ((SystemTime%100)释疑:void Timer0() interrupt 1 using 1Timer0? ?是函数名,随便取的?interrupt? ?xx? ?using? ?y?跟在interrupt? ?后面的xx? ?值得是中断号,就是说这个函数对应第几个中断端口,一般在51中?0? ?外部中断0? ??1? ?定时器0?2? ?外部中断1?3? ?定时器1?4? ?串行中断?实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址?using? ?y? ?这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组? ?r0? ?--? ?r7寄存器,一共有32个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会谈出来节省代码和时间初始值算法:定时器是当总数达到FFFFH后产生中断吧!那你要让它计数10000,是不是用FFFF(16进制)减去10000(十进制)的数当计数初值 啊?TH0=-(10000/256); TL0=-(10000%256)跟FFFF(16进制)减去10000(十进制)的数是一样的。从TH0=-(10000/256); TL0=-(10000%256)开始计数,计数到10000刚好满。跟用FFFF(16进制)减去10000(十进制)的数一样!!!写起来更简单,不 用算!!!?看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样中断的理解。这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中(主程序),可能会有其它的更紧急的需
文档评论(0)