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

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

3天内不再提示

单片机开发设计,如何通过指针对16位数进行操作

贸泽电子设计圈 来源:互联网 作者:佚名 2017-09-27 15:21 次阅读

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

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

    关注

    6036

    文章

    44557

    浏览量

    635144
  • 串行接口
    +关注

    关注

    3

    文章

    328

    浏览量

    42613
  • 数据转换
    +关注

    关注

    0

    文章

    87

    浏览量

    18002
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70561

原文标题:8位单片机操作16位INT型数据的方法你想到了几种?

文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机编写的6位数显频率计数器

    本帖最后由 eehome 于 2013-1-5 10:10 编辑 51单片机编写的6位数显频率51单片机编写的6位数显频率计数器计数器
    发表于 08-06 16:36

    如何在KEIL单片机编程环境下实现随机的6位数验证码?

    比如:单片机如何给GSM短信模块发送一个随机的6位数,手机收到这6位数后,通过单片机的矩阵键盘输入,点亮
    发表于 10-22 22:20

    单片机IO口进行定义

    本文将提到以下内容:操作中断printf重定向随机发生器RNGAD/DADMA高性能计算能力加密ART加速一、操作  在学习51
    发表于 07-27 07:49

    基于单片机的单通道16位数据采集系统设计

    基于单片机的单通道16位数据采集系统设计
    发表于 11-10 10:53 12次下载

    6位数显频率计数器

    6位数显频率计数器,单片机源代码分享,下来看看。
    发表于 05-20 15:07 22次下载

    [转载]Freescalenbsp;16单片机

    的原因吧。通常开始学单片机,都是写一些比较小的程序,如果不做项目开发之类的,以飞思卡尔 16 单片机的资源
    发表于 11-23 17:52 649次阅读

    16单片机有哪些

    在实际运用中,很多人使用16单片机16单片机有哪些呢?本文给大家带来
    发表于 12-20 11:41 4.3w次阅读

    89C51单片机16位数据传送指令的执行过程

    这是89C51单片机唯一的一条16立即传递指令,其功能是将一个16的立即
    发表于 01-09 15:13 5277次阅读
    89C51<b class='flag-5'>单片机</b><b class='flag-5'>16</b><b class='flag-5'>位数</b>据传送指令的执行过程

    使用51单片机把416进制转成10进制的方法和程序免费下载

    本文档的主要内容详细介绍的是使用51单片机把416进制转成10进制的方法和程序免费下载。
    发表于 08-23 17:30 23次下载
    使用51<b class='flag-5'>单片机</b>把4<b class='flag-5'>位</b><b class='flag-5'>16</b>进制<b class='flag-5'>数</b>转成10进制<b class='flag-5'>数</b>的方法和程序免费下载

    如何使用8单片机16INT型数据进行操作

    在8单片机中没有16位数操作指令,所有的int型数据都要通过两个字节分开
    的头像 发表于 06-30 10:29 7425次阅读
    如何使用8<b class='flag-5'>位</b><b class='flag-5'>单片机</b>对<b class='flag-5'>16</b><b class='flag-5'>位</b>INT型数据<b class='flag-5'>进行</b><b class='flag-5'>操作</b>

    51单片机4位数简易计算器

    51单片机4位数简易计算器
    发表于 05-06 11:19 30次下载

    单片机开发小程序

    如何使用单片机开发小程序单片机一般都是通过烧写hex或是bin文件来进行程序升级,这个方法是在8、16
    发表于 11-13 12:36 10次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>开发</b>小程序

    816、32单片机中的“XX”指什么?

    处理的数据宽度不同,总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机位数,但称为准多少。比如某CPU是16但总线是
    发表于 11-16 09:21 29次下载
    8<b class='flag-5'>位</b>、<b class='flag-5'>16</b><b class='flag-5'>位</b>、32<b class='flag-5'>位</b><b class='flag-5'>单片机</b>中的“XX<b class='flag-5'>位</b>”指什么?

    816、32单片机(MCU)

    51的CPU一次只能处理8位数据。        在ARM里面,R0和R2是32的,所以ARM的CPU一次能处理32位数据。3、进一步解释         单片机
    发表于 11-18 17:36 11次下载
    8<b class='flag-5'>位</b>、<b class='flag-5'>16</b><b class='flag-5'>位</b>、32<b class='flag-5'>位</b><b class='flag-5'>单片机</b>(MCU)

    一颗8的51单片机是如何处理32位数据的?

    一颗8的51单片机是如何处理32位数据的? 首先,需要明确一点,即51单片机是8的,指的是其数据总线宽度为8
    的头像 发表于 11-06 11:05 2393次阅读