1 单片机实验箱16位数操作开发设计实验 - 上海开航科教设备有限公司

联系我们

联系电话:021-56421756 56422182

联系邮箱:shkaihang@126.com

生产地址:上海市嘉定区鹤友路336弄43号

单片机实验箱16位数操作开发设计实验

来源:教学设备发布时间:2017-10-16 11:01:45

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

单片机实验箱支持国内最流行8051系列和80C196系列单片机。能进行全速仿真、单步执行、跟踪仿真、断点运行等操作,可对多种型号的EPROM固化。配备80C1968031ROMRAM8255827982508155825582790809DAC0832等微机常用接口,以及键盘、数码显示、发光二极管显示、逻辑电平开关等电路。具有单机运行、PC联机运行等多种工作方式。

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

首 页企业简介新闻动态产品介绍开航方案技术文章配置标准企业博客成功案例售后服务联系我们
产品列表页
返回顶部

客服中心