#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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |