
关于51单片机的一个简单的中断嵌套问题
程序如下:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitP1_0=P1^0;sbi...
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
sbit P3_2=P3^2;
void main()
{
P1_0=0;//程序用来控制P1—0口的高低变化
IT0=1;
IE=0x83;
IP=0x02;//设置优先级,使内部T0定时中断高于外部INT0中断
}
void zhongduan() interrupt 0 //外部INT0中断
{
TMOD=0x01; //16位定时方式
TH0=0x50;
TL0=0xfe;
EA=1;
ET0=1;
TR0=1; //开定时中断
}
void yixiang() interrupt 1
{
P1_0=!P1_0; //使取反
}
按我的想法应该是有外部中断事件的时候进入外部中断0,然后在interrupt 0里启动定时中断0,等定时中断溢出时使P1_0取反,此时结束,等到外部中断0再次发生时,重复上述动作。但是运行时P1_0在经过一次外部中断后一直不断取反,无限循环,如果说P1_0取反后仍进入INT0中断中,也应该是进入到TR0=1之后吧,此时还是进入到了主程序了应该,不知哪里的问题,求教! 展开
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
sbit P3_2=P3^2;
void main()
{
P1_0=0;//程序用来控制P1—0口的高低变化
IT0=1;
IE=0x83;
IP=0x02;//设置优先级,使内部T0定时中断高于外部INT0中断
}
void zhongduan() interrupt 0 //外部INT0中断
{
TMOD=0x01; //16位定时方式
TH0=0x50;
TL0=0xfe;
EA=1;
ET0=1;
TR0=1; //开定时中断
}
void yixiang() interrupt 1
{
P1_0=!P1_0; //使取反
}
按我的想法应该是有外部中断事件的时候进入外部中断0,然后在interrupt 0里启动定时中断0,等定时中断溢出时使P1_0取反,此时结束,等到外部中断0再次发生时,重复上述动作。但是运行时P1_0在经过一次外部中断后一直不断取反,无限循环,如果说P1_0取反后仍进入INT0中断中,也应该是进入到TR0=1之后吧,此时还是进入到了主程序了应该,不知哪里的问题,求教! 展开
4个回答
展开全部
你main函数中的第一句写的是P0=0;也就是说在执行完中断的时候返回到主函数时会执行P0=0;这时会出现你所说的情况,建议你软件仿真一下,把各个io口和定时器调出来看一下。假如要实现你的思路,在执行完P0=0;一次之后屏蔽掉这个语句,在接下来的时间不执行P0=0;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
主要的问题是!你的定时器问题!你打开定时器了而且定时器的优先级要比外部中断高!
而且你在开启定时器以后就没有关过定时器!那么程序就会一直的执行啊!所以会有波形输出啊!
而且你在开启定时器以后就没有关过定时器!那么程序就会一直的执行啊!所以会有波形输出啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序问题,你把全局中断放在外部中断程序里,就永远没有开启中断,换句话说,你的两个中断程序都没能执行,而且主程序一直在循环,而io口初始为高,你的输出当然就是高低不停在变!
追问
我在主程序中有个IE=0x83;已经定义了EA=1,而且调试时程序也走过了两个中断,。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Main 最后加语while(1);试试
追问
不行,。。
追答
取反后关闭T0,试试
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询