单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了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; 数据定义与前面相同 d = ((unsigned int)dH)《《8 + dL; 或者 d = dH; d 《《= 8; // or: d = d《《8; 但后者编译的代码可能不是最简的 d |= dL; // or: d = d | dL; 后者编译的代码可能不是最简的 unsigned char *cptr; cptr = (unsigned char*)(&d); cptr[0] = dH; cptr[1] = dL; *((unsigned char*)(&d)) = dH; *((unsigned char*)(&d)+1) = dL; 或 ((unsigned char*)(&d))[0] = dH; ((unsigned char*)(&d))[1] = dL; 这两种方式看似相同但由Keil编译出的代码是不用的,前都有一次加法运算,而后者没有,后者生成的代码更简洁,这种方式与用联合成生的代码是完全一样的, 在这几种方法中第(1)与第(4)的第二种生成的代码是最乘洁的,是推荐使用的,从软件工程的角度出发,推荐使用方法(1),这样没有强制类型转换,没有用到指针,更不容易出错。从书写的代码来讲,第(4)的第二种方法是最好的,代码简洁而且效率最高,但语法有点儿复杂。(2) 使用移位指令
(3)使用指针
(4)强制指针类型转换
评论 (0)