
你的问题是没理解中断的含义。
中断,字面上意思就是(当有更紧急的事情出现的时候)终止现在手头上的事情去忙更紧急的事情。在程序里,就相当于当某个条件成立时,停止正在运行的代码(手头上的事情),去执行另一段代码(更紧急的事情),只是这个过程是硬件自动完成的,而不是像你平时调用函数那样显式的去调用它。
你的程序里用到了定时器0(自己去看定时器的工作原理),那你只要将定时器0初始化,并且在函数void exter() interrupt 1里写下你希望当定时器0中断的时候执行的代码就行了。当你启动定时器0的时候,它有点像后台运行的一个程序,当它归0的时候,就会置相应的中断标志为1,而CPU会不时的检测这些中断标志位,当发现某个标志位为1的时候,表明有中断请求,CPU会自动转到相应的中断服务程序中去。
#include <reg51h>
void InitTimer1(void)
{
TMOD = 0x10;
TH1 = 0x3C;
TL1 = 0x0B0;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void main(void)
{
InitTimer1();
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x3C;
TL1 = 0x0B0;
//add your code here!
}
外部中断信号接到P33口,为INT0中断,程序如下
#include<reg51h>
sbit X0=P1^0; //用X0表示P10
sbit X1=P1^1; //用X0表示P11
sbit X2=P1^2; //用X0表示P12
void main(void)
{
P1=0x00; //将P1口初始化位高电平,如果没有这句,初始化为低电平,这里可根据需要选择
EA=1; //中断允许
IT1=1; //触发方式为下降沿触发
EX1=1; //外部中断允许
while(1); //这里可以随便写你需要的主程序,我用了个死循环,目的是等待中断
}
void counter1(void) interrupt 2 //INT1中断
{
EX1=0; //禁止外部中断
ET0=1; //计时器中断0允许
ET1=1; //计时器中断1允许
TMOD=0x21; //T1用模式2、T0用模式1
IP=0; //T1、T0为高优先级
X2=~X2; //每次中断就取反P12引脚
X1=1; //P11输出低电平03ms
X0=1; //P10输出低电平15ms
TH0=0xfd; //T0用模式1,16位计时器,在15ms后执行时间中断0
TL0=0x12;
TH1=0x6a; //T1用模式2,8位计时器,在03ms执行时间中断1
TL1=0x6a;
TR1=1; //启动计时器T1
TR0=1; //启动计时器T0
while(X0==1); //等待中断响应完成
EX1=1; //允许外部中断
}
void counter2(void) interrupt 1 //定时器0中断
{
X0=0;
}
void counter3(void) interrupt 3 //定时器1中断
{
X1=0;
}
程序已经经过仿真调试,可以完成你的要求,等待加分中。。。。
外部中断和定时器中断互补干涉,你的51单片机外部中断1和外部中断0都被使用了,不会对你使用定时器中断产生影响的,设置很简单,程序代码附后,要想是定时器中断1的优先级低于外部中断,你可以将外部中断优先级设置为高优先级,而定时器中断设置为低优先级。这样就可以了。初始化程序为:
init()
{
TMOD=0x10;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=1;
PT1=0;
TR1=1;
ET1=1;
TH1=xxxxx;
TL1=xxxxx;
EA=1;
}
//sbit zd=P3^2; //外部中断口//unsigned char a;void main(void)//主函数{TCON=0x01;EX0=1; //外部中断允许EA=1;//开总中断while(1){//其他程序}}void int0(void) interrupt 0 //外部中断0 中断子程序{//这里面可以写中断子程序/a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //开关计时器else TR0=0;/}由于对你的要求“按下INTO接的按键,使单片机执行间隔四灯轮流闪烁的中断子程序”不够理解,只能给你这样一个程序框架了进入中断要执行中断子程序,不同的中断源要进入不同的中断子程序。对于51的C编程,可以用中断标号,如‘interrupt 0’来使中断进入不同的中断。中断标号与它们的中断优先级一致,即外部中断0 interrupt 0定时器中断0 interrupt 1外部中断1 interrupt 2定时器中断1 interrupt3
用主程序入口地址替换掉外部中断服务程序保存的原返回地址就可以实现了。具体实现方法如下:
EXT1:
MOV DPTR,#MAIN
POP A ;d出原返回地址
POP A
PUSH DPH ;将主程序入口地址压入
PUSH DPL
RETI
以上就是关于51单片机中的中断程序到底是怎么运行的全部的内容,包括:51单片机中的中断程序到底是怎么运行的、AT89C51单片机,定时器1,50ms中断,用c语言写出初始化程序和中断函数程序、51单片机编程,用中断做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)