4745|5

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

c8051f020串口1UART1发送数据的问题。 [复制链接]

大虾们好,以下是我的UART1中断函数
void UART1 (void) interrupt 20 using 2
{
  unsigned char xdata tChar=0;
        EIE2 &= 0xBF;
        RI1Flag=(SCON1 & 0x01);
        TI1Flag=(SCON1 & 0x02);
    if (RI1Flag == 0x01)
        {
        tChar = SBUF1;
        SCON1 &= 0xfe;
        }
   if(TI1Flag == 0x02)
        {
                SCON1 &= 0xfd;
                TI1Flag = 0;
        }
            EIE2 |= 0x40;
}
以下为在主程序中发送0x1f
while(1)
{
SCON1 = SCON1 & 0xfd;       
SBUF1 = 0x1f;//通过UART1发送1F;
while((SCON1 & 0x02) == 0);//为什么程序死在这里,不动了,好象一直是在等待
SCON1 = SCON1 & 0xfd;
}
用串口精灵能接受到此数据,但是程序一直停留在while((SCON1 & 0x02) == 0);而且根据跟踪,也没有进串口1中断函数,请问这是为什么?
还有,c8051f020的在什么情况下会引发串口1中断
谢谢!

最新回复

(1)SCON1 & 0x02=1 代表串口正在发送数据   (2)SCON1 & 0x02=0 代表已经发送完毕 (3)while((SCON1 & 0x02) == 0);//为什么程序死在这里,不动了,好象一直是在等待 若(1)(2)成立,那么(3)应该写为 while((SCON1 & 0x02) == 1); 表示等待串口数据发送完毕,继续执行后面的代码。 建议三种方法: A、屏蔽 while((SCON1 & 0x02) == 0);这句话 B、while((SCON1 & 0x02) == 0); 改为 while((SCON1 & 0x02) == 1); C、每次发送串口数据给个延时,可以随便10ms   详情 回复 发表于 2007-12-12 09:43
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
8051的串口中断是自己发生的,程序没有问题.在主程序中通过设置IE将中断开开,当TI=1时中断发生,进入中断服务程序,在中断服务完成后设置IE=0, 清除中断标志位.
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
SCON1   =   SCON1   &   0xfd; //第1句
SBUF1   =   0x1f;//通过UART1发送1F;
while((SCON1   &   0x02)   ==   0);//为什么程序死在这里,不动了,好象一直是在等待 //第2句

你在第一句中已经让SCON1的第1位数据为0,第二句再和0x02&运算后scon1的值就变成0了,满足((SCON1   &   0x02)   ==   0);当然有一直循环哟!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
SCON1=SCON1&0xfd;这一句应该是让串口1准备就绪,将其第一位设置位0
SBUF1= 0x1f;这一句是向subf1写数据从而引发串口1发送数据
根据f020的资料,执行写SBUF1指令就会开始8位数据发送,8位数据发送完毕后会引发SCON1.1置位
所以发送成功的话应该SCON1.1=1,通过串口精灵能够接收到数据,应该说明发送成功。
while((SCON1       &       0x02)       ==       0);这一句就是等待数据发送完毕。
发送成功的话,SCON1.1置位,则跳出循环,现在不跳出循环,不知道为什么。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
另外,我是单步执行此程序的,执行时,监测不到进入了中断服务程序,也就是说T1未发生置位,但是数据确实是发送出去了。是不是可能单步执行的时候会出现此问题?会是单步执行程序而造成的么?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
(1)SCON1 & 0x02=1 代表串口正在发送数据  
(2)SCON1 & 0x02=0 代表已经发送完毕
(3)while((SCON1 & 0x02) == 0);//为什么程序死在这里,不动了,好象一直是在等待

若(1)(2)成立,那么(3)应该写为
while((SCON1 & 0x02) == 1);

表示等待串口数据发送完毕,继续执行后面的代码。

建议三种方法:
A、屏蔽 while((SCON1 & 0x02) == 0);这句话
B、while((SCON1 & 0x02) == 0); 改为 while((SCON1 & 0x02) == 1);
C、每次发送串口数据给个延时,可以随便10ms


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表