欢迎来到天天文库
浏览记录
ID:38654493
大小:17.52 KB
页数:5页
时间:2019-06-17
《定时器中断原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、定时器中断原理#define_1231_C_#include"reg51.h" //sbitOE=P2^3;unsignedintSystemTime;voidtimer0(void)interrupt1using3//中断部分代码,见下文的释疑{ TH0=0xdb; TL0=0xff;// TF0=0; SystemTime++;}voidmain(){ TMOD&=0xF0; TMOD
2、=0x01;//TMOD的值表示定时器工作方式选择 TH0=0xdb;//写入初始值,初始值可以决定定时多久 TL0=0xff;//根据下文的木桶比喻的话,如果TH0=0x0
3、0;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=
4、1;//允许定时器0中断 EA=1; //开总中断//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0=0xff;TL0=0xff;//单片机会从死循环里退出,去执行中断部分的代码,即开始运行voidtimer0(void)interrupt1using3{}//运行完中断部分的代码后,接着继续执行死循环里的代码。//注意:当TH0=0xff;TL0=0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。//如把ET0=1;和EA=1;注释掉,当TH0=0xff;TL0=0xff;再运行,TF0会变为1,此时不会再执行中断部分代码
5、。 while(1) { if((SystemTime%100)<50) //SystemTime除以100,余数小于50为真 { …………; } else { …………; } };}释疑:voidTimer0()interrupt1using1Timer0 是函数名,随便取的interrupt xx using y跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中0 外部中断0 1 定时器02 外部中断1
6、3 定时器14 串行中断实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址using y 这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组 r0 -- r7寄存器,一共有32个,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间初始值算法:定时器是当总数达到FFFFH后产生中断吧!那你要让它计数10000,是不是用FFFF(16进制)减去10000(十进制)的数当计数初值啊?TH0=-(10000/256);TL0=-(10000%256)跟FFFF(16进制)减去10000(十进
7、制)的数是一样的。从TH0=-(10000/256);TL0=-(10000%256)开始计数,计数到10000刚好满。跟用FFFF(16进制)减去10000(十进制)的数一样!!!写起来更简单,不用算!!!看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样我们学习了用指令延时闪灯,但是用指令方式闪灯有cpu不能做其他工作的缺点。这一课,我们将学习如何使用定时器方式使灯闪烁。中断的理解。这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中(主
8、程序),可能会有其它的更紧急的需要做的事情(中断服务程序),需要cpu暂时停止当前的程序(主程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;定时在每个机器周期不断自动加1,最后溢出了;水
此文档下载收益归作者所有