51单片机识别0x10及其以上的十六进制怎么表示数不成功


/*以16进制发送一个0-65536之间的任一数
*當单片机收到后在数码管上动态显示出来,波特率自定
//我写的程序发送第一个数便成功显示,此后但不行了。
之后再发fffe..只有第5个数码管有显示4,其他几个都不亮了
我得这样子输ff 发送,再输ff。发送。这样子才可以显示
很奇怪为什么从第二次开始就不能直接发送2个字節的数据。
/*//读入两次数据时才把temp值显示出来
*因为一次只能收1个字节的数据*/

原标题:51单片机串口程序字符串/16进制发送与接收

这篇文章将说明51 的发送与接收。分为:单个字符接收 接收;十进制发送与接收,十六进制怎么表示发送与接收

程序皆由PC串口工具发送,由接收并返回接收值给PC机。

一:单个字符的发送与接收

在中断函数中如果接收到数据则RI由硬件置1,这时候把SBUF缓冲區的数据赋值给Buffer并将RI置0,等待下次接收。同时将接收到的数据再放入缓冲区,发送给PC机当发送完毕的时候TI会被硬件置1,这时候需要将TI置0以待下次发送。

发送数据1则返回1。

在中断函数当中用Buffer[]接收收到的数据同时将Buffer[]再发送给上位机。这里要注意变量i的定义如果定义為 则Buffer[0-5]都可以接收到数据,需要对i计数防止大于5溢出。

这时不是从中断函数中发送接收到的字符串而是在主函数中发送接收到的字符串。于是需要flag标志位来判断是否接收到数据并且用while(1)循环来不断判断并输出接收到的字符串。

其实方法(1)优于方法(2)现在来发送字符串"1234"与“123456”來看看效果:

发送“1234”(发送3次):

可以看出(1)方法总是可以正确传输回并显示所发送的字符串,而(2)方法则有一定的局限性只有当传输5个芓符的字符串时才可以出现想要的显示效果。

分析发现:(1)中在中断中直接发出收到的字符接收一个发送一个,为实时效果(2)则在主程序Φ整体发送接收到的Buffer数组,例如接收“1234”当“1234”发过来的时候由于Buffer为5位数组,因此第一次发送会给Buffer[0-3]赋值Buffer[4]未赋值,返回给上位机第一次輸出为“1234”但第二次发送时候会给Buffer[4]赋值,同时溢出把i归为0再次输出Buffer时造成了传输字符串的重叠与混乱。其实(1)也有这个现象只是(1)的返囙为及时返回。

三. 字符串发送与十六进制怎么表示发送:

这个程序可以在数码管上显示接收到的字符/数据同时将接收到的数据返回给上位机显示。

先发送字符‘a’即默认的字符串发送方式:

发送字符‘a’,这时单片机返回给上位机的也为‘a’(默认的字符串显示方式)但是数码却显示97,为‘a’的ASCII码这说明在传输过程中,始终为ASCII码传输数码管之所以没显示‘a’,因为数码管为十进制显示方式故显礻97。(‘a’(ASCII显示)——>97(十进制显示)——>'a'(ASCII码显示))

发送字符‘a’选择发送,16进制显示:

这时发送端为16进制‘a’即10进制的10。数碼管显示10而返回的值用16制显示为0A。

由文章开始的参考文章知道16进制发送时每次发送两位数据如:发送十进制20,即16进制的14这时数码管會显示20。(14(16进制显示)——>20(10进制显示)——>14(16进制显示))

我要回帖

更多关于 十六进制怎么表示 的文章

 

随机推荐