52单片机的外部中断和定时器中断同时的问题 20

我想让我的timer2一直运行,而不被外部中断0影响,我就设置了PT2=1;高优先级,但程序的timer2不能正常运行,timer2的工作方式为自动重装,迷惑中,或者别的... 我想让我的timer2一直运行,而不被外部中断0影响,我就设置了PT2=1;高优先级,但程序的timer2不能正常运行,timer2的工作方式为自动重装,迷惑中,或者别的方法。
主程序是
EA = 1; //开总中断
EX0 = 1; //使能外部中断
ET0=1; //开中断
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
TMOD=0x01;//定时器0工作方式2,TH0是重装值,TL0是初值
TR0=0;
PT2=1;
PT0=0;
展开
 我来答
cczm1
2010-08-06 · TA获得超过860个赞
知道小有建树答主
回答量:212
采纳率:0%
帮助的人:105万
展开全部
这个好办,我帮你
一. timer2中断处理时,你不能处理太多事,占用太长时间,尽量短,否则将出问题。
二. 单独试验一下timer2,里面作最简单的处理,比如让某个灯翻转,便于观察是否正常,你的中断时间较短,需要用示波器观察才行。
三. 单独试验一下外部中断,是否有效。
四. 上面没问题了,再往下进行,把外部中断优先级设低,timer2优先级设高,中断后加入一个死循环,目的是看看进入外部中断后,定时器中断还能不能进入。
五. 若可以进入,没问题,再往timer2中断里加东西,恢复外部中断程序。
这样出现问题就知道到哪找解决办法了。
祝你顺利!
murexster
2010-08-06 · TA获得超过386个赞
知道小有建树答主
回答量:394
采纳率:0%
帮助的人:167万
展开全部
可以考虑进TIMER2中断时关中断,等中断执行完开中断
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lyzyyd
2012-04-26
知道答主
回答量:7
采纳率:0%
帮助的人:1.1万
展开全部
你定时器0工作方式应该是方式1,TMOD=0x02;//才是方式2。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wwwpapertiger
2010-08-06 · 超过14用户采纳过TA的回答
知道答主
回答量:58
采纳率:0%
帮助的人:0
展开全部
是89s52吗?

优先级一般不调 单片不是靠改变优先级来确定工作顺序的 而是靠关闭打开允许控制位

timer工作在自动重装 是因为你吧他的工作方式设成2了
tmod的设置不对

领补充一点 和你的问题无关也有关 中断子程序中的程序运行时间要短才不会出错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhaoyanchina
2010-08-07
知道答主
回答量:46
采纳率:0%
帮助的人:12.8万
展开全部
#include<reg51.h>
sbit P20=P2^0;
sbit P22=P2^2;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P21=P2^1;
sbit P23=P2^3;
sbit P32=P3^2;
int a=0;

int tab[]={ 0x28,0x12,0x28,0x12};

void delay(unsigned int i)
{
while(--i)
{;}
}

void init0(void)
{
EA=1;
EX0=1;
IE0=1;
IT0=1;
//PX0=1;
}

void init(void)
{
EA=1;
EX1=1;
IE1=1;
IT1=1;
PX1=1;
}

void tiem0(void)
{
EA=1;
// TMOD=0x01;
TR0=1;
ET0=1;
TF0=1;
PT0=1;

}

main()
{
while(1)
{

P2=0x3a;

if(P32==0)
{
// a=a+1;
// while(1)
// {

init0();
// P2=tab[a];
// if(P32==0) break;
// }
}

if(P10==1)
{

tiem0();

}

if(P11==1)
{

init();
}

}

}

void IN_0(void) interrupt 0
{
a++;
while(1)
//while(P32==0)
{ //int a=0;
// a++;
P2=tab[a];
delay(1000);
if(P32==1) break;
}

}
void IN_1(void) interrupt 2
{
// while(P11==1)
while(1)
{
P25=0;
if(P11==0) break;

}

}

void t0(void) interrupt 1
{
while(1)
//while(P10==1)
{
P24=0;
if(P10==0) break;
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式