关于51单片机进制转换字符串转换成16进制

51单片机串口程序,字符串/16进制发送与接收 - 推酷
51单片机串口程序,字符串/16进制发送与接收
这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。
字符串发送与十六进制发送,参考:
程序皆由PC串口工具发送,由单片机接收,并返回接收值给PC机。
一:单个字符的发送与接收
#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
//定义接收 字符
//串口初始化函数
URATinit( )
TMOD=0x20;
SCON=0x50;
//中断函数
void receive() interrupt 4
Buffer=SBUF;
while(!TI);
URATinit( );
在中断函数中,如果接收到数据则RI由硬件置1,这时候把SBUF缓冲区的数据赋值给Buffer,并将RI置0,等待下次接收。同时,将接收到的数据再放入缓冲区,发送给PC机。当发送完毕的时候TI会被硬件置1,这时候需要将TI置0,以待下次发送。
运行效果:
发送数据1,则返回1。
二.字符串接收
#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
//定义接收 数组
uchar Buffer[5]={0};
uchar i=0,j=0;
//串口初始化函数
URATinit( )
TMOD=0x20;
SCON=0x50;
//中断函数
void receive() interrupt 4
Buffer[i]=SBUF;
SBUF=Buffer[i];
while(!TI) ;
URATinit( );
在中断函数当中用Buffer[]接收收到的数据,同时将Buffer[]再发送给上位机。这里要注意变量i的定义。
如果定义为全局变量则Buffer[0-5]都可以接收到数据,需要对i计数,防止大于5溢出。
运行效果:
#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
//定义接收 数组
uchar Buffer[5];
uchar i=0,
//延时函数
delay(uint
while(ms--)
for(i=0;i&123;i++);
//串口初始化函数
URATinit( )
TMOD=0x20;
SCON=0x50;
//中断函数
void receive() interrupt 4
Buffer[i++]=SBUF;
uchar k=0;
for(k;k&5;k++){
Buffer[k]=0;
URATinit( );
if(flag) {
uchar j=0;
for(j;j&5;j++){
SBUF=Buffer[j];
while(!TI) ;
delay(50);
这时不是从中断函数中发送接收到的字符串,而是在主函数中发送接收到的字符串。于是需要flag标志位来判断是否接收到数据,并且用while(1)循环来不断判断并输出接收到的字符串。
运行效果:
其实方法(1)优于方法(2),现在来发送字符串&1234&与“123456”来看看效果:
发送“1234”(发送3次)
发送“123456”(发送3次):
可以看出(1)方法总是可以正确传输回并显示所发送的字符串,而(2)方法则有一定的局限性,只有当传输5个字符的字符串时才可以出现想要的显示效果。
分析发现:(1)中在中断中直接发出收到的字符,接收一个发送一个,为实时效果。(2)则在主程序中整体发送接收到的Buffer数组,例如接收“1234”,当“1234”发过来的时候由于Buffer为5位数组,因此第一次发送会给Buffer[0-3]赋值,Buffer[4]未赋值,返回给上位机第一次输出为“1234”,但第二次发送时候会给Buffer[4]赋值,同时溢出把i归为0。再次输出Buffer时造成了传输字符串的重叠与混乱。其实(1)也有这个现象,只是(1)的返回为及时返回。
三. 字符串发送与十六进制发送:
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
//申明U1锁存器的锁存端
sbit wela=P2^7;
//申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint xms)
for(i=i&0;i--)
//i=xms即延时约xms毫秒
for(j=110;j&0;j--);
void display(uint value)
//显示子函数
uchar wan,qian,bai,shi,
//定义万千百十个位
wan=value/10000;
qian=value%;
bai=value%;
shi=value%100/10;
ge=value%10;
P0=table[wan];
P0=table[qian];
P0=table[bai];
P0=table[shi];
P0=table[ge];
void init()
//初始化函数
TMOD=0x20;
//设置定时器1工作方式
void main()
display(num);
void ser() interrupt 4
//串口中断函数
//置RI为0以便接收下一个数据
while(!TI);
这个程序可以在数码管上显示接收到的字符/数据,同时将接收到的数据返回给上位机显示。
先发送字符‘a’,即默认的字符串发送方式:
发送字符‘a’,这时单片机返回给上位机的也为‘a’(默认的字符串显示方式)。但是数码却显示97,为‘a’的ASCII码。这说明在传输过程中,始终为ASCII码传输。数码管之所以没显示‘a’,因为数码管为十进制显示方式,故显示97。(‘a’(ASCII显示)——&97(十进制显示)——&'a'(ASCII码显示))
发送字符‘a’,选择16进制发送,16进制显示:
这时发送端为16进制‘a’,即10进制的10。数码管显示10,而返回的值用16制显示为0A。
由文章开始的参考文章知道16进制发送时每次发送两位数据,如:发送十进制20,即16进制的14,这时数码管会显示20。(14(16进制显示)——&20(10进制显示)——&14(16进制显示))。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致51单片机接受什么指令16进制代码 还是字符串_百度知道
51单片机接受什么指令16进制代码 还是字符串
提问者采纳
所有的单片机只接受1和0的指令.也就是16进制代码表示的指令.硬件只认1和0,也只有1和0.
提问者评价
其他类似问题
为您推荐:
51单片机的相关知识
其他1条回答
二进制代码
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。
CEPARK 助学开发板在线订购二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
百度背信弃义,毫无理由的,关闭了所有的百度博客空间。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'16位二进制数转换成BCD码的的快速算法-51单片机',
blogAbstract:' 在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。程序可见:
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}char型字符转16进制,该怎么处理 - 单片机当前位置:& &&&char型字符转16进制,该怎么处理char型字符转16进制,该怎么处理&&网友分享于:&&浏览:5次char型字符转16进制假如我有一串字符串,s=“abcd123&abcd&123&”里面包括了空格等等的,我现在想把他转成“313233”,这个字符串里面没有包含回车等等,只要对端给我穿过来的数据,我都要转成对应的hex值,这个有现成的函数没?或者说有方法没?&我想过如果定义一个a[127]={"1""2""3""4"、、、、、}等等,就是把每个字符都弄进去,然后我再定义一个b[127]={“31”“32”“33”“34”、、、、、、},然后把字符串s中的每一个字符,都逐一用for循环来对比
void&SendStr(uchar&array[n])
for(i=0;i&=n;i++)&&//检测是否字符串末尾,&'\0'表示字符串结束标志,
for(x=0;x&127;i++)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{if&(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a[x]==array[i];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&array[i]=b[x];&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SendByte(array[i])&&;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
void&SendByte(uchar&dat)
while(!TI);
------解决方案--------------------本帖最后由 wangfan027 于
10:02:39 编辑
char&buf[128];
char&*&hextodstr(char&*&src)
&&&&unsigned&char&i=0;
&&&&while(*src!=0)
&&&&&&&buf[2*i]=*src/16+'0';
&&&&&&&buf[2*i+1]=(*src%16)+'0';
&&&&&&&src++;
&&&&&&&i++;
&&&&&&&if(i&=64)
&&&&&&&&&&&&//缓冲区不够
&&&&&&&&&&&return&
&&&&return&
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 16进制转换字符串 的文章

 

随机推荐