51单片机定时器中断服务程序
51单片机定时器中断服务51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁。#include"reg_c51.h"intnn;//中断次数变量...
51单片机 定时器 中断服务
51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁。
#include "reg_c51.h"
int nn; //中断次数变量
void main(void)
{
TMOD &= 0xF0; //定时器0运行在模式0 ,13位计数器
// GATE0=0; C/T0#=0; M1=0; M0=0;
TH0 = 0x00; //设置初值0x00,所以计数值为8192,若是时钟频率为12MHz
TL0 = 0x00; //则8192μs中断一次
ET0=1; //允许定时器0中断
EA=1; //允许总中断
TR0=1; //启动定时器0
while(1); //无限循环,没有循环体
}
void it_timer0(void) interrupt 1 定时器0中断服务程序
{
nn=nn++; //每次中断nn加1(这里说的每次中断,我想知道第一次中断产生,第二次中断产生,第三次等,是怎么样一步一步走的,非常不明白)
if(nn==10) //当中断10次后,使LED灯闪烁
{ nn=0;
P2_0 = ~P2_0; //引脚P2.0取反
}}
nn=nn++; //每次中断nn加1(这里说的每次中断,我想知道第一次中断产生,第二次中断产生,第三次等,是怎么样一步一步走的,非常不明白) 展开
51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁。
#include "reg_c51.h"
int nn; //中断次数变量
void main(void)
{
TMOD &= 0xF0; //定时器0运行在模式0 ,13位计数器
// GATE0=0; C/T0#=0; M1=0; M0=0;
TH0 = 0x00; //设置初值0x00,所以计数值为8192,若是时钟频率为12MHz
TL0 = 0x00; //则8192μs中断一次
ET0=1; //允许定时器0中断
EA=1; //允许总中断
TR0=1; //启动定时器0
while(1); //无限循环,没有循环体
}
void it_timer0(void) interrupt 1 定时器0中断服务程序
{
nn=nn++; //每次中断nn加1(这里说的每次中断,我想知道第一次中断产生,第二次中断产生,第三次等,是怎么样一步一步走的,非常不明白)
if(nn==10) //当中断10次后,使LED灯闪烁
{ nn=0;
P2_0 = ~P2_0; //引脚P2.0取反
}}
nn=nn++; //每次中断nn加1(这里说的每次中断,我想知道第一次中断产生,第二次中断产生,第三次等,是怎么样一步一步走的,非常不明白) 展开
1个回答
展开全部
定时器定时时间到,则自动进入中断程序,程序程序执行完后又“自动”返回主程序
由于nn是全局变量,所以它可以在原来的基础不断加1 如此反复
如果你看汇编程序:可知,不同的中断源有不同的中断程序入口地址,如定时器0的中断程序入口地址是000BH,一旦中断发生,程序便跳至此处执行,但此处并不是真正的中断程序,而它又是一条跳转指令,指向真正的中断服务程序,中断程序结束有一条返回语句RETI,又回到了中断之前的主程序中去,主程序每执行完一条指令,都要判断有无中断的发生,不需人工乾预
whlie(1)是个死循环,中断程序跳来跳去,还是在这个小圈子里
由于nn是全局变量,所以它可以在原来的基础不断加1 如此反复
如果你看汇编程序:可知,不同的中断源有不同的中断程序入口地址,如定时器0的中断程序入口地址是000BH,一旦中断发生,程序便跳至此处执行,但此处并不是真正的中断程序,而它又是一条跳转指令,指向真正的中断服务程序,中断程序结束有一条返回语句RETI,又回到了中断之前的主程序中去,主程序每执行完一条指令,都要判断有无中断的发生,不需人工乾预
whlie(1)是个死循环,中断程序跳来跳去,还是在这个小圈子里
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询