#include <reg52.h>
#define uc unsigned char
#define ui unsigned int
uc snum,flag;
ui num;
void main()
{
TMOD=0x20;
TH1=0xf4;
TL1=0xf4;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=num;
while(!TI);//这句话的作用
TI=0;
SBUF=snum;
while(!TI);
TI=0;
if(num <256)
{
num++;
}
else
{
num=0;
}
ES=1;
}
}
}
void serial() interrupt 4
{
snum=SBUF;
flag=1;
RI=0;
}
说明一下,变量num是每次发送的序列号,到255自动归0,有两个问题
1.已经注释,就是while(!TI)这句话的作用。。。
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
共4条
1/1 1 跳转至页

while(!TI);//这句话的作用
TI=0;
呵呵,这个是查询方式待等串口发送结束....
串口发送结束后会硬件自动置TI为1
等TI为1后,清除TI....
准备下一次通信...
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
串口以及串口通信助手仅仅是基本的通信功能
要实现显示10进制,那必须得进行转换工作
你可以在上位机实现,如重写一个串口工具,收到数据后转为十进制再显示
你也可以在单片机上进行,先把数据转成十进制的串,然后再通过串口把串发到串口助手,让它以文本方式来显示你的内容就可以了
后一种方法,你可以看一下sprintf()这个函数,呵呵,算是一个提示吧...
TI=0;
呵呵,这个是查询方式待等串口发送结束....
串口发送结束后会硬件自动置TI为1
等TI为1后,清除TI....
准备下一次通信...
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
串口以及串口通信助手仅仅是基本的通信功能
要实现显示10进制,那必须得进行转换工作
你可以在上位机实现,如重写一个串口工具,收到数据后转为十进制再显示
你也可以在单片机上进行,先把数据转成十进制的串,然后再通过串口把串发到串口助手,让它以文本方式来显示你的内容就可以了
后一种方法,你可以看一下sprintf()这个函数,呵呵,算是一个提示吧...

第一个问题:
while(!TI);//这句话的作用 --> TI是发送成功的标志位,当SBUF中的数据发送完毕时
由硬件自动将TI置1,但要手动清零(准备下一次发送),所以后面要跟TI=0;其作用是:等待SBUF中的数据发送完毕。
没发送完--> TI==0;//while(!0) == while(1) --> ;是空语句,条件为真(1)循环执行空语句进行等待。
发送完毕--> TI==1;//while(!1) == while(0) --> ;是空语句,条件为假(0)跳过空语句执行下一条指令。
第二个问题:
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
大哥, 串口调试助手v2.1 里面有设置 ASCII/十六进制 显示 --> 33(ASCII的3)% 10 =3(十进制的3)
如果你要发送16进制 那么 SBUF=0x0A; 发送16进制的10 。 SBUF=3;发送出来是33,即ASCII码。
第三个问题:
请注意 flag 的设置, 还有你的中断接收有问题。请看看书--> SBUF中的 TI/RI 在何时、为什么变0、变1。
while(!TI);//这句话的作用 --> TI是发送成功的标志位,当SBUF中的数据发送完毕时
由硬件自动将TI置1,但要手动清零(准备下一次发送),所以后面要跟TI=0;其作用是:等待SBUF中的数据发送完毕。
没发送完--> TI==0;//while(!0) == while(1) --> ;是空语句,条件为真(1)循环执行空语句进行等待。
发送完毕--> TI==1;//while(!1) == while(0) --> ;是空语句,条件为假(0)跳过空语句执行下一条指令。
第二个问题:
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
大哥, 串口调试助手v2.1 里面有设置 ASCII/十六进制 显示 --> 33(ASCII的3)% 10 =3(十进制的3)
如果你要发送16进制 那么 SBUF=0x0A; 发送16进制的10 。 SBUF=3;发送出来是33,即ASCII码。
第三个问题:
请注意 flag 的设置, 还有你的中断接收有问题。请看看书--> SBUF中的 TI/RI 在何时、为什么变0、变1。
共4条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 |