找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1013|回复: 6
收起左侧

又是一个奇怪的问题,关于单片机串口的程序

[复制链接]
ID:226798 发表于 2019-8-27 22:52 来自手机 | 显示全部楼层 |阅读模式
是这样的,我想用查询的方式用串口发送数据,结果数据不对,怀疑是发送标志位有问题,我就写了如下测试代码:
SCON |= 0X02;
SCON &= 0XFD;
发送标志位正常清零了,但是!
我写这样:void CF(void){if(SCON&0X02)SCON &= 0XFD; }
SCON  |=0X02;
CF();
这样就不行是为什么
回复

使用道具 举报

ID:235200 发表于 2019-8-28 01:40 | 显示全部楼层
就你这个问题,我亲自加入程序中进行了调式STC15F2K60S2
void cf(void) {if(SCON&0X02)SCON &= 0XFD;}

//主程序
void main()
{
       
SCON|=0X02;     //运行到这步  (0x98)中内容是0x02
cf();                 //运行到这步  (0x98)中内容是0x00


所以不存在你所说的标志位TI不能清除的现象
回复

使用道具 举报

ID:235200 发表于 2019-8-28 01:49 | 显示全部楼层
这是仿真结果
6.png
回复

使用道具 举报

ID:226798 发表于 2019-8-28 10:02 来自手机 | 显示全部楼层
csmyldl 发表于 2019-8-28 01:40
就你这个问题,我亲自加入程序中进行了调式STC15F2K60S2
void cf(void) {if(SCON&0X02)SCON &= 0XFD;}


不好意思,之前代码写错了,之前函数是这样的void CF(void){if(SCON&0X02 !=0)SCON &= 0XFD; },不知道怎样写为什么就清除不了,后来我怀疑是SCON压栈保存了,就又全部使用函数调用也不行,最后我就用贴出来的代码把判断!=0去了就正常了,只是不太理解其中的原因
回复

使用道具 举报

ID:226798 发表于 2019-8-28 10:04 来自手机 | 显示全部楼层
csmyldl 发表于 2019-8-28 01:49
这是仿真结果

感谢回答,代码这样是正确运行的,只是if(SCON&0X02!=0)就无法清除,好尴尬,是不是这个判断有问题
回复

使用道具 举报

ID:235200 发表于 2019-8-29 11:17 | 显示全部楼层
其实这样的逻辑也是可以的,只是语句的优先级未分清,应把if(SCON&0X02!=0)改为if((SCON&0X02)!=0),因为&的优先级低于!=,你那样写是先执行0x02!=0的结果1与SCON进行按位与
回复

使用道具 举报

ID:226798 发表于 2019-8-29 14:27 来自手机 | 显示全部楼层
csmyldl 发表于 2019-8-29 11:17
其实这样的逻辑也是可以的,只是语句的优先级未分清,应把if(SCON&0X02!=0)改为if((SCON&0X02)!=0) ...

刚刚我查了,&作为运算符的优先级是高于逻辑符的优先级的,而且我也试过了加括号,感谢回答
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表