51单片机的串口中断过问题

#include<stdio.h>#include<reg52.h>#include<INTRINS.H>voidDelay(intTime);voidSendDate(... #include<stdio.h>
#include<reg52.h>
#include <INTRINS.H>
void Delay(int Time);
void SendDate(int Date);

sbit P3_3=P3^3;
sbit P1_0=P1^0;
sbit P1_3=P1^3;
unsigned char code LED_Code[16]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x07f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管的数据码值
int Cishu=0;
int PP=0;
int ReceviDate=0;
void Delay(int Time)
{int i;
while(Time--)
{
for(i=0;i<100;i++);
}
}

void Inti() interrupt 2 //外部中断1
{
PP++;
if(PP==16)
PP=0;
P0=LED_Code[PP];
//SendDate(PP);
}
void Time()interrupt 1 //定时器0
{
TH0=0x3c;
TL0=0xb0;
Cishu++;
if(Cishu>20)
{Cishu=0;
P1_0=~P1_0;
P3_3=~P3_3;
}
}

void SendDate(int Date) //发送数据
{ SBUF=Date;
while(TI==0)
TI=0;

}

void Recevide() interrupt 4 //接收数据
{
if(RI)
{
RI=0;
ReceviDate=SBUF;
P1_3=~P1_3;
// P1=ReceviDate&0xff;
// P0=LED_Code[ReceviDate];
}
}

void main()
{

TMOD=0x21; //T0工作于方式1 ,16位定时
SCON=0x50;
EA=1;
ET0=1;
EX1=1;
ES=1;
IT1=1; //下降沿触发
TR1=1;
TR0=1;
TH0=0x3c; //50ms
TL0=0xb0;
TH1=0xFD;
TL1=0xFD;
// PS=1;

while(1)
{SendDate(5);
Delay(20);
}

}
为什么这个程序不能开PS=1,一使PS=1,定时器0就不能工作。各位大神帮忙看看啊!
展开
 我来答
jinfahua
2013-10-10 · TA获得超过590个赞
知道小有建树答主
回答量:285
采纳率:0%
帮助的人:232万
展开全部
在接收函数的末尾加一句 TI = 0; 就行了。可能是串行中断标志位TI绝大部分时间为1,而它的优先级最高,屏蔽了定时器0和外部中断1。
追问
关键是我在发送函数里已经清0了啊。为什么还要在中断函数里请0呢。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2013-10-10 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
PS是优先级寄存器,PS=1,设为高优先级后,定时器0会受到影响,但是不至于不能工作。
更多追问追答
追问
但是定时器0的确就不工作了啊,我也觉得奇怪啊。
追答
void SendDate(int Date)      //发送数据
{
SBUF=Date;
while(TI==0)   //这里少写了一个分号。
TI=0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fatbobwang
2013-10-10 · TA获得超过523个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:87.7万
展开全部
PS是什么寄存器来着,忘记了,你看看是不是这个东西和定时器0有什么关联
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-10-10
展开全部
没看见你定义ps 啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式