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)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。

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

    关注

    34

    文章

    1667

    浏览量

    58255
  • 数模转换
    +关注

    关注

    3

    文章

    126

    浏览量

    29800

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MAX9271:16GMSL串行器的详细解析与应用指南

    MAX9271:16GMSL串行器的详细解析与应用指南 引言 在当今电子技术飞速发展的时代,高速数据传输和处理的需求日益增长。对于汽车摄像头系统等应用场景,需要一种高效、可靠的
    的头像 发表于 05-12 14:15 148次阅读

    SGM52001-1616、1MSPS、8通道低功耗串行接口ADC解析

    SGM52001-1616、1MSPS、8通道低功耗串行接口ADC解析 在电子设计领域,模数转换器(ADC)是连接模拟世界和数字世界的关键桥梁。今天,我们来深入了解SGMICRO推
    的头像 发表于 03-12 14:00 333次阅读

    深入解析SGM5353 - 1616串行输入电压输出DAC

    深入解析SGM5353 - 1616串行输入电压输出DAC 在电子设计领域,数模转换器(DAC)是连接数字世界和模拟世界的重要桥梁。今天,我们就来深入了解一下SGMICRO推出的S
    的头像 发表于 03-12 09:45 325次阅读

    单片机中的串口通讯串行同步通信与串行异步通信

    进行传送。串行通信的数据是逐传输的,发送方发送的每一都具有固定的时间间隔,这就要求接收方也
    发表于 01-15 08:06

    嵌入式中的浮点数据转换为字节类型的三种方法

    的时候一般都是以省内存,加快运算速度优先。所以在选择使用浮点时float就可以满足大部分需求,当需要高精度的时候必须使用double进行运算。 浮点数据在嵌入式中的使用 在嵌入式
    发表于 01-07 06:28

    深入剖析DS92LV1616总线LVDS串行器/解串器的卓越性能与应用

    深入剖析DS92LV1616总线LVDS串行器/解串器的卓越性能与应用 在当今高速数据传输的时代,
    的头像 发表于 12-31 14:45 625次阅读

    请问UART内核在接收数据时有哪些具体操作?UART内核在接收数据完成后会进行哪些处理?

    UART内核在接收数据时有哪些具体操作?UART内核在接收数据完成后会进行哪些处理?
    发表于 12-25 07:15

    串行通讯与并行通讯介绍

    16、32及64根或更多的数据线进行传输的通讯方式,并行通讯就像多个车道的公路, 可以同时传输多个数据位数据,而
    发表于 12-11 06:52

    操作的常见错误与应对策略

    溢出或数据丢失。在进行位移操作时,必须确保位移量在数据类型的有效范围内。例如,对于一个 8 的无符号字符
    发表于 11-24 07:50

    并行与串行的基本通信方式

    1、并行通信方式:将数据字节的各位用多条数据线同时进行传输,每位数据都需要一条传输线。 2、串行通信方式:
    发表于 11-24 06:36

    NucleiStudio_IDE_201909串打印浮点数据时无数据输出,软件该如何配置串口才能打印浮点数据

    NucleiStudio_IDE_201909串打印浮点数据时无数据输出,软件该如何配置串口才能打印浮点
    发表于 11-07 07:57

    对UART0输入到串口的char数据转换成16进制的寄存器常用int相关处理

    ascii码了,比如输入0,但接收到转换成int后显示的却是48,输入a显示的是97。 为了方便硬件寄存器得到想要的16进制数据,我们先要
    发表于 10-31 07:58

    UART接口数据线接收和发送数据

    之后便将数据压入FIFO。软件每读一次UART_RDATA寄存器,便会将1字节的表项数据弹出FIFO。 我们应该注意UART接收端采用16倍波特率的采样频率采样
    发表于 10-29 07:37

    使用MCU200T开发板的UART进行数据传输

    我们想要实现从电脑串口调试助手像MCU软核发送一个8bit字节数据例如0xff,并且收到数据软核回传的数据。首先要对MCU的UART进行
    发表于 10-28 08:16

    全面了解串行通信

    串行通信是一种数据传输方式,它将数据按 逐顺序 (bit by bit)在一条传输线上发送和接收,与并行通信(同时传输多位
    的头像 发表于 07-19 14:13 2265次阅读