c8051f020串口1UART1发送数据的问题。

bitree2450 2007-12-09 12:15:22
大虾们好,以下是我的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中断
谢谢!
...全文
460 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jmulxg 2007-12-12
  • 打赏
  • 举报
回复
(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


hnhblyc 2007-12-09
  • 打赏
  • 举报
回复
8051的串口中断是自己发生的,程序没有问题.在主程序中通过设置IE将中断开开,当TI=1时中断发生,进入中断服务程序,在中断服务完成后设置IE=0, 清除中断标志位.
bitree2450 2007-12-09
  • 打赏
  • 举报
回复
另外,我是单步执行此程序的,执行时,监测不到进入了中断服务程序,也就是说T1未发生置位,但是数据确实是发送出去了。是不是可能单步执行的时候会出现此问题?会是单步执行程序而造成的么?
bitree2450 2007-12-09
  • 打赏
  • 举报
回复
SCON1=SCON1&0xfd;这一句应该是让串口1准备就绪,将其第一位设置位0
SBUF1= 0x1f;这一句是向subf1写数据从而引发串口1发送数据
根据f020的资料,执行写SBUF1指令就会开始8位数据发送,8位数据发送完毕后会引发SCON1.1置位
所以发送成功的话应该SCON1.1=1,通过串口精灵能够接收到数据,应该说明发送成功。
while((SCON1 & 0x02) == 0);这一句就是等待数据发送完毕。
发送成功的话,SCON1.1置位,则跳出循环,现在不跳出循环,不知道为什么。
txb19872007 2007-12-09
  • 打赏
  • 举报
回复
SCON1 = SCON1 & 0xfd; //第1句
SBUF1 = 0x1f;//通过UART1发送1F;
while((SCON1 & 0x02) == 0);//为什么程序死在这里,不动了,好象一直是在等待 //第2句

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

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧