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

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

3天内不再提示

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

j4AI_wujianying 来源:未知 2019-06-30 10:29 次阅读

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

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

    关注

    6049

    文章

    44684

    浏览量

    641140
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1380

    浏览量

    115474
  • EEPROM
    +关注

    关注

    9

    文章

    1048

    浏览量

    82351

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

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

收藏 人收藏

    评论

    相关推荐

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

    8单片机中没有16数的操作指令,所有的int
    的头像 发表于 09-27 15:21 9175次阅读

    一文看懂8,16和32单片机的区别

    8单片机 16 32区别? 指CPU处理的数据
    的头像 发表于 07-15 11:07 12.4w次阅读

    16单片机有哪些

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

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

    过串行口接收数据,或者从串行的EEPROM中读取的数据,或者从大于8的A/D读取的数据,由于8
    的头像 发表于 12-27 06:02 1.3w次阅读

    单片机816是怎么区分的

    本文开始介绍了单片机的概念和单片机的硬件特性,其次介绍了单片机的种类及介绍了8单片机
    的头像 发表于 04-10 16:00 2.7w次阅读

    8单片机和32单片机的应用

     现在在单片机应用市场,仍然是以8单片机和32单片机为主导。在产品应用上,当然是物尽其用。那
    发表于 06-26 14:31 6539次阅读

    816、32单片机的xx含义

    816、32是指单片机的“字长”,也就是一次运算中参与运算的
    发表于 04-30 10:04 2次下载

    8OTP IO单片机PMS154C系列数据手册

    8OTP IO单片机PMS154C系列数据手册
    发表于 06-21 09:32 27次下载

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

    处理的数据宽度不同,总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数,但称为准多少。比如某CPU是
    发表于 11-16 09:21 29次下载
    <b class='flag-5'>8</b><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)

    1、 816、32是什么?         指CPU处理的
    发表于 11-18 17:36 11次下载
    <b class='flag-5'>8</b><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单片机做多位乘除操作

    8单片机做多位乘除操作今日在8单片机中做乘除运算
    发表于 11-18 19:51 12次下载
    <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>单片机</b>做多位乘除<b class='flag-5'>操作</b>

    8单片机中对16int数据操作技巧

    如何把两个8位数据合在一起变成16位数据呢?
    发表于 02-08 16:22 0次下载
    <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>单片机</b>中对<b class='flag-5'>16</b><b class='flag-5'>位</b><b class='flag-5'>int</b><b class='flag-5'>型</b><b class='flag-5'>数据</b>的<b class='flag-5'>操作</b>技巧

    8单片机的优缺点有哪些?

    单片机自上世纪70年代问世以来,在电子设备现代化中发挥了巨大作用。单片机也从最初的4发展到8单片机
    的头像 发表于 08-08 16:58 1926次阅读

    8单片机16单片机的区别

    的4单片机发展到如今的32单片机,其中8单片机
    的头像 发表于 08-12 13:50 3648次阅读

    8单片机和32单片机如何选择?8单片机和32单片机的区别

    8和32单片机如何选择适合,以及主要区别!
    的头像 发表于 09-16 10:51 1609次阅读