51单片机 串口接收数据 十进制

现在小弟在学单片机,做一个程序,能不能实现PC机用串口调试小助手向MCU发送数据,然后MCU处理之后成为十进制,方便后面的数据处理
比如向单片机发送1234,然后单片机能把这个数显式在数码管上

暂时无悬赏分,能直接解决问题的或者是提供一种思路的,30分奉上,人格保证

要看你发的1234是什么形式的数据了,串口助手可以发十六进制或者是ascii字符(也许你用的有更多形式的)。
可以设一个4个字节的接收缓冲区recebuf[4],每来一次串口中断就把一个值写进缓冲区。有以下两种情况:
十六进制0x01,0x02,0x03,0x04发送:
缓冲区接收到的四个字节即为0x01,0x02,0x03,0x04,就可以把四个字节直接送显(如果要发ABCDEF还要除以10转换成十进制)
ascii格式1234发送:
缓冲区实际接收到的是49,50,51,52.分别把recebuf[]的值减去48再送显,即为十进制结果。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-24
这里有个源码是串口发送接收数据的。

坐等悬赏分。

源码转自:《51单片机C语言创新教程》温子祺等著。

/*实验名称:串口收发数据实验
*描 述:在使用单片机的串口接收数据实验当中,
使用串口调试助手发送什么数据,
单片机采用查询法将接收到的数据返发到PC
*作 者:温子祺
*修改日期:2010/5/4
*/

#include "stc.h" //加载"stc.h"
/****************************************
*函数名称:UARTInit
*输 入:无
*输 出:无
*功 能:串口初始化
******************************************/
void UARTInit(void) //定义串口初始化函数
{
SCON =0x50; //8位数据位,允许接收
T2CON=0x34; //由定时器2作为波特率发生器
RCAP2L=0xD9; //波特率为9600的低8位
RCAP2H=0xFF; //波特率为9600的高8位
}
/****************************************
*函数名称:UARTSendByte
*输 入:byte 要发送的字节
*输 出:无
*功 能:串口发送单个字节
******************************************/
void UARTSendByte(unsigned char byte)//定义串口发送数据函数
{
SBUF=byte; //缓冲区装载要发送的字节
while(TI==0); //等待发送完毕,TI标志位会置1
TI=0; //清零发送完成标志位
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
void main(void) //主函数
{
unsigned char recv; //声明变量recv
UARTInit(); //串口初始化
while(1) //进入死循环
{
if(RI) //检测接收完成标志位置1
{
RI=0; //清零接收完成标志位
recv=SBUF; //读取接收到的数据
UARTSendByte(recv); //返回接收到的数据
}
}
}
第2个回答  2011-08-24
可以这样:
单片机发送非压缩BCD码0x01,0x02,0x03,0x04,或者压缩BCD码0x12,0x34。这样是最简单的,单片机也容易处理。
.追问

可是要求是只能发送ASCII码形式

追答

ASCII码?那相当于字符串“1234”啊,实际就是0x31,0x32,0x33,0x34啊,有什么问题?

本回答被提问者采纳
第3个回答  2011-08-24
即便是发送ASCII码形式的字符,也可以发送数字啊,如1234,MCU将收到4个ASCII值,然后在MCU端判断每个是否>='0'&&<='9'以确保是数字的ASCII码,如果是就将收到的ASCII值减去‘0’,不就得到它的十进制值了么。。。
第4个回答  2011-08-24
建议 去 我的领地 5d6d 的 proteus 论坛看看

那里有很多 单片机仿真实例,包括proteus 仿真图 和 源码
相似回答