51单片机串口中断的问题

#include<AT89x52.H>unsignedcharcount;//==============================================... #include <AT89x52.H>
unsigned char count;
//=================================================
void main ()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xFD; //波特率9600
TL1 = 0xFD;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
TR1 = 1;
ES = 1;
REN = 1;

count=0;
while (1)
{
if(P1_0==0&&P1_1==1)
{
while(P1_1==1&&P1_0==1);
count++;
}
if(P1_1==0&&P1_0==1)
{
while(P1_1==1&&P1_0==1);
count--;
}

}
}
//=================================================

void serial() interrupt 4

{
if(RI==1)
{
RI=0;
if(SBUF==2)
count=0;
SBUF=count;
ES=0;
while(!TI);
TI=0;
ES=1;
}
}

电路无任何问题,RXD用示波器测试有波形。
但就是没有TXD口就是没有输出。
接收数据跟发送数据都是在中断函数内完成的 ,跟主程序没有关系
哪位达人帮忙看下问题出在哪
展开
 我来答
百度网友4309011
推荐于2016-05-27 · TA获得超过7203个赞
知道大有可为答主
回答量:1534
采纳率:66%
帮助的人:1018万
展开全部
我粗看了一下,问题可能出在终端程序里。
void serial() interrupt 4

{
if(RI==1)
{
RI=0;
if(SBUF==2)
count=0;
SBUF=count;//问题在这里
ES=0;
while(!TI);
TI=0;
ES=1;
}
}

按照常理SBUF=count就会启动发送。。但是你要看啊,你在串口的中断程序里写这句什么用都没有的。。串口中断程序里面是自动屏蔽串口中断的。。不然多集嵌套会混乱的。你要把SBUF放到中断程序外面才行。

你如果希望在已收到东西就发送的话可以在中断里设一个标志位abc..
void serial() interrupt 4

{
if(RI==1)
{
RI=0;
if(SBUF==2)
count=0;
if(TI==1)
{
TI=0;
}
abc=1;
}

main()
{
if (abc)
{
SBUF=count;
abc=0;
}
追问
多谢。那么如果写在主程序里的话,
执行到SBUF=count这句的时候,
又会触发中断函数么?
追答
你再刷新一遍。。我的回答更新咯哦
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式