0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串行口接收数据,如何对16位INT型数据进行操作?

j4AI_wujianying 来源:互联网 作者:佚名 2017-12-27 06:02 次阅读

吴鉴鹰单片机开发板地址

在8位单片机中没有16位数的操作指令,所有的int型数据都要通过两个字节分开操作,使用的方法不用,生成的代码也不相同,当然效率也不一样,通过指针对16位数进行操作可以得到高效的代码。

比如通过串行口接收数据,或者从串行的EEPROM中读取的数据,或者从大于8位的A/D读取的数据,由于8位单片机的数据线是8位的,高于8位的数据都要分成两个字节分别读取,然后写入到RAM中去再进行计算,或者把16位的int型数据从RAM中读出再分别把高低字节存到EEPROM或者送到D/A,或者通过串行口发送出去,方法有很多种,下面用多种方法进行实现该操作,这里只演示写入到16位的情况,读取的情况非常相似,不赘述。

(1)使用联合 (union)

typedef union{

unsigned int i;

unsigned char c[2];

}u_int;

unsigned char dH = 0x11, dL=0x22;

unsigned int d;

u_int ud;

ud.c[0] = dH;

ud.c[1] = dL;

d = ud.i;

此时d = 0x1122;

(2) 使用移位指令

数据定义与前面相同

d = ((unsigned int)dH)<<8 + dL;

或者

d = dH;

d <<= 8; // or: d = d<<8; 但后者编译的代码可能不是最简的

d |= dL; // or: d = d | dL; 后者编译的代码可能不是最简的

(3)使用指针

unsigned char *cptr;

cptr = (unsigned char*)(&d);

cptr[0] = dH;

cptr[1] = dL;

(4)强制指针类型转换

*((unsigned char*)(&d)) = dH;

*((unsigned char*)(&d)+1) = dL;

((unsigned char*)(&d))[0] = dH;

((unsigned char*)(&d))[1] = dL;

这两种方式看似相同但由Keil编译出的代码是不用的,前都有一次加法运算,而后者没有,后者生成的代码更简洁,这种方式与用联合成生的代码是完全一样的,

在这几种方法中第(1)与第(4)的第二种生成的代码是最乘洁的,是推荐使用的,从软件工程的角度出发,推荐使用方法(1),这样没有强制类型转换,没有用到指针,更不容易出错。从书写的代码来讲,第(4)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54860
  • 数模转换
    +关注

    关注

    3

    文章

    106

    浏览量

    28535

原文标题:8位单片机中如何对16位INT型数据进行操作?

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32L162与ADS8320进行16数据转换,如何读取ADS的转换数据

    求助:STM32L162与ADS8320进行16数据转换,fAHB = 16M, IO方式
    发表于 04-18 08:19

    配置SPI一次收发一个16位数据,但抓的数据波形显示,数据连续发送和接收了4次为什么?

    我配置SPI一次收发一个16位数据,但抓的数据波形显示,数据连续发送和接收了4次,这个情况有碰到的吗?
    发表于 04-18 07:52

    51单片机的四种串行口工作模式介绍

    串行口工作模式设置,这样两可以对应进行四种模式的设置。串行口工作模式设置。      波特率在使用串口做通讯时,一个很重要的参数就是
    发表于 04-08 06:49

    STM32WLE5JC SPI数据长度设置为8,但接收数据缓存却是16,为什么?

    在STM32WLE5JC单片机中SPI数据长度设置了8,并且相应的接收FIFO也设成了8,但最后收发数据是却是
    发表于 04-07 07:32

    嵌入式操作教程:2-12 RS232串通信实验(查询方式)

    一、实验目的 了解UART 的功能和结构,学习RS232串通信协议,并实现通过查询方式进行 RS232 串口通信收发。 二、实验原理 RS232 RS232接口是现在主流的串行通信接口之一,被广泛
    发表于 02-07 14:37

    xc2000同步串行口发送和接收数据错误怎么解决?

    接收两次就会陷入接收函数里的while死循环。主函数里有好几条发数的指令,我在每一个主发从收函数后面都写上从发主收函数,在示波表里看发送的数据没错,但最后主机接收到的
    发表于 02-06 07:35

    如何实现AD9970 LVDS串行输出数据的字边界对齐?

    目前正在做一个AD9970+CCD的项目,通过FPGA接收并解析AD9970输出的LVDS差分串行数据。由于AD9970输出的是串行比特流,FPGA首先需要判断一个data word
    发表于 01-01 06:36

    AD7794只能接收16位数据,还有8接收不到是哪里出了问题?

    AD7794是24精度的ADC转换芯片,现在的问题是:我只能接收16位数据,还有8接收不到
    发表于 12-19 07:56

    如何将一个INT数据转换成2个CHAR数据

    如何将一个INT数据转换成2个CHAR数据
    发表于 11-03 06:20

    单片机串口的初始化都有哪些必需的步骤呢?

    SCON=0x50; //REN RI TI,RI为0,TI为0 //串行口1方式1 SCON是串行口1的串行控制寄存器,REN为1,允许接收 PCON=0x00;//各工作方式波特
    发表于 09-28 06:35

    【verilog每日一练】拼接符的应用:如何实现串行数据接收与输出

    若1bit串行信号data_in按高位先发的顺序传输一个8bit的数据,data_en为使能信号,请用拼接符实现串行数据接收并输出
    发表于 08-07 16:05

    串行口的工作方式(1)#单片机

    单片机串行口
    未来加油dz
    发布于 :2023年08月01日 20:37:54

    串行口的功能与内部结构(2)#单片机

    单片机串行口
    未来加油dz
    发布于 :2023年08月01日 20:37:06

    串行口的功能与内部结构(1)#单片机

    单片机串行口
    未来加油dz
    发布于 :2023年08月01日 20:36:25

    硬件串行GPS接收器,可以使用硬件Rx接收GPD数据,同时使用Tx向PC发送调试信息吗?

    传入。我需要 在串行设置上进行特定设置才能使其正常工作吗? 可以使用硬件 Rx 接收 GPD 数据,同时使用 Tx 向 PC 发送调试信息吗? 我在网上找的关于GPS的例子都是用Sof
    发表于 05-29 07:22