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

电子常识

2595人已加入

描述

  单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

  单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。

  单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等

  16位INT型数据

  16位只2进制是16位,也就是2个字节。

  补充:所谓“位”就是bit 的意思:一个 “位”/bit 代表一个 “0”或一个“1”二进制16位就是代表 16个 0/1二进制

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

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分