打印
[51单片机]

串行口通讯发送采用中断的方式软件清TI怎么不对

[复制链接]
978|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liyaohua|  楼主 | 2016-4-20 11:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在下面的程序中,我设置的发送数据时也采用中断为什么不可以呢?而如果在红色的部分加以改动那运行就正常了,(即把注释了的TI=0变成不注释的,把中断程序中的红色部分删去),请问大神这是为什么呢




#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code zifu[]={'l','i','y','a','o','h','u','a','\0'};
sbit p14=P1^4; //p14对应的是一个按键


delay1ms(uint i)         //延迟1ms函数
{
uchar j;
while(i--)
{
for(j=0;j<115;j++)
{}
}
}

void csh()     //串行口初始化
{
TMOD=0X20;      //定时器1工作方式2
TH1=TL1=0XFD;         //产生9600的波特率
SCON=0X50;                  //串行口工作在方式1,并且可以接受数据
PCON=0X00;                //smod=0,即不加倍
EA=1;                         //开总中断
ES=1;                        //开串行口中断
ET1=0;                        //定时器1关中断
TR1=1;                        //运行定时器1
}


void send_zfc()                                   //发送一个字符串
{
uchar j;
for(j=0;zifu[j]!='\0';j++)
{
SBUF=zifu[j];
while(!TI);
//TI=0;
}
}

void send_char(uchar i)                   //发送1个字节
{
SBUF=i;
while(!TI);
//TI=0;
}

void main()
{
csh();                                   //串行口初始化
while(1)
{
if(p14==0)                           //当按下按键时(p14=0),发送字符串的内容
{delay1ms(20);
if(p14==0)
{send_zfc();
delay1ms(1000);
}}
}
}

void cxk(void) interrupt 4                 //中断函数
{
uchar i;
if(TI==1)                                                 //发送中断,使TI清0
{
TI=0;
}

if(RI==1)                                        //接受中断,使接收到的数据再发送出去
{
RI=0;
i=SBUF;
send_char(i);
}
}

相关帖子

沙发
ningling_21| | 2016-4-20 11:30 | 只看该作者
查询和中断两者选其一,否则就矛盾,不能正常工作

使用特权

评论回复
板凳
liyaohua|  楼主 | 2016-4-20 21:26 | 只看该作者
ningling_21 发表于 2016-4-20 11:30
查询和中断两者选其一,否则就矛盾,不能正常工作

没有明白到底什么意思,是不是TI和RI是独立的,就是说TI用了查询RI也可以用中断。
那么如果这样的话,程序中的while(!TI)就是查询吗?
不知道我的理解是否正确,我也没有看到有教材上详细的讲解,望大神多多知道。

使用特权

评论回复
地板
ningling_21| | 2016-4-21 08:26 | 只看该作者
liyaohua 发表于 2016-4-20 21:26
没有明白到底什么意思,是不是TI和RI是独立的,就是说TI用了查询RI也可以用中断。
那么如果这样的话,程 ...

TI和RI是独立的,TI用了查询RI也可以用中断

但查询TI前需关串口中断,发送完成再打开串口中断

使用特权

评论回复
5
liyaohua|  楼主 | 2016-4-21 15:42 | 只看该作者
ningling_21 发表于 2016-4-21 08:26
TI和RI是独立的,TI用了查询RI也可以用中断

但查询TI前需关串口中断,发送完成再打开串口中断 ...

大神您好,我还是不太明白,原谅我这新手哈
在开始我发的那个程序中,如果把前两个红色的TI=0;加上(即把注释标号去掉),然后把中断程序中的if(TI==1)这部分红色的删掉,那么这个程序还是可以正常运行的。
也就是说如果中断程序中没有TI,也是不需要在查询TI时关闭中断的吧。
希望大神不嫌麻烦,我真的在串行口通讯这儿比较迷茫,谢谢了

使用特权

评论回复
6
ningling_21| | 2016-4-21 16:25 | 只看该作者
liyaohua 发表于 2016-4-21 15:42
大神您好,我还是不太明白,原谅我这新手哈
在开始我发的那个程序中,如果把前两个红色的TI=0;加 ...

这样也可以运行,但不建议

使用特权

评论回复
7
泰山特曲123| | 2016-4-21 16:36 | 只看该作者
因为你在中断把TI的标志位清掉了,所以sendchar这个函数一直while死等

使用特权

评论回复
8
liyaohua|  楼主 | 2016-4-21 16:45 | 只看该作者
泰山特曲123 发表于 2016-4-21 16:36
因为你在中断把TI的标志位清掉了,所以sendchar这个函数一直while死等

终于明白了,原来是先中断然后TI清0,使while一直死等的原因呀
我从网上买的资料就是TI不关中断的程序,也就是我说得改一下红色部分就可以使程序运行,看来还有不太完善的地方,我再研究下关中断的程序,太谢谢您了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝