历史上的今天
返回首页

历史上的今天

今天是:2024年11月20日(星期三)

正在发生

2018年11月20日 | 8位单片机中如何对16位INT型数据进行操作?

2018-11-20 来源:eefocus

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


推荐阅读

史海拾趣

Harwin公司的发展小趣事

Harbour Industries成立于1965年,起初主要专注于电缆的生产与销售。在20世纪60年代末和70年代初期,随着全球航空航天市场的迅速增长,Harbour敏锐地捕捉到了这一机遇。为了服务这一市场,公司进行了大规模的工厂扩建,并引入了先进的生产设备和技术。这一举措不仅提升了公司的产能,还确保了产品质量能够满足航空领域的高标准。通过不懈努力,Harbour逐渐在航空电缆市场中占据了一席之地。

Anderson Power Products公司的发展小趣事

随着通讯技术的快速发展,射频微波电缆的需求日益增长。Harbour Industries凭借其深厚的电缆制造经验和先进的技术实力,成功研发出了一系列高性能的射频微波电缆。这些电缆在微波射频领域展现出了优异的性能,广泛应用于通讯网络、广播电视、卫星通信等领域。Harbour的射频微波电缆不仅在国内市场占有一席之地,还远销海外多个国家和地区,进一步提升了公司的国际影响力。

Bytes公司的发展小趣事

随着市场规模的扩大,Bytes公司意识到供应链管理和成本控制的重要性。公司不断优化供应链结构,提高采购效率和质量,降低生产成本。同时,公司还通过精细化管理,降低运营成本,提高盈利能力。这些措施使得Bytes公司在激烈的市场竞争中保持了良好的财务状况。

BAE Systems公司的发展小趣事

BAE Systems公司一直致力于技术创新,不断推动电子行业的发展。公司投入大量资源进行研发,开发出了一系列先进的电子系统和产品。这些技术成果不仅提升了公司的竞争力,也为全球电子行业的技术进步做出了贡献。例如,公司在军事通信、雷达系统、导弹技术等领域都取得了重要的突破,为国家的安全和防御提供了强有力的支持。

AAC [American Accurate Components]公司的发展小趣事

进入21世纪,AAC公司继续加大市场拓展力度。2003年,AAC成功拓展了台湾市场,与明基、仁宝电脑和华宇电脑等知名企业建立了合作关系。为了满足这些客户对高品质耳机的需求,AAC开始生产制造耳机产品。这一创新举措不仅丰富了AAC的产品线,也进一步提升了其在电子消费产品市场的竞争力。

广州基安彼(GMB)公司的发展小趣事

进入21世纪,AAC公司继续加大市场拓展力度。2003年,AAC成功拓展了台湾市场,与明基、仁宝电脑和华宇电脑等知名企业建立了合作关系。为了满足这些客户对高品质耳机的需求,AAC开始生产制造耳机产品。这一创新举措不仅丰富了AAC的产品线,也进一步提升了其在电子消费产品市场的竞争力。

问答坊 | AI 解惑

FPGA设计流程简介及设计注意事项

FPGA设计流程简介及设计注意事项…

查看全部问答>

ADM7001网络接口电路图

ADM7001网络接口电路图 …

查看全部问答>

小功率mi-ni电脑插电时,偶然不能开机

在小功率电脑开机时,先插入Adapter,在按开机键,怎么有时会开不了机?是电源问题吗?高手帮忙给点意见,谢谢!!!!…

查看全部问答>

[教训分享] 一分钱的疏忽造成数万元的损失

声明:这是别人的帖子,看了颇有感触,故转帖于此。 电子设计中,细节问题往往会导致严重的后果,所以我们一定要注意细节, [教训分享] 一分钱的疏忽造成数万元的损失 小弟去年给外面公司设计了一台智能型阀门伺服控制器,在本地几个小站现场工作都 ...…

查看全部问答>

求助:H桥电路中桥臂直通的问题!

求助:H桥电路中桥臂直通的问题! 在H桥电路中,即使驱动电路设置了死区,但如果工作频率很快,也会引起H桥的桥臂直通,进而烧坏mos管。请问哪位大侠知道解决的办法,小弟在这里谢了先!…

查看全部问答>

【EEWORLD带你DIY】示波器V2.0信号板及人机界面板打样归来~~

活动介绍:使用Altera Cyclone III FPGA Stater 进行DIY示波器进程: https://www.eeworld.com.cn/zhuanti/20100703altera/20100703altera.html   信号板及人机界面板打样归来,上图     …

查看全部问答>

一个简单程序(UART),不晓得问题出在那里,请大家帮哈忙!

以下代码是UART0操作:收到上位机的字符然后转送回去。结果是能收到,但是是错误的,如发 01 收到 C0,请大家看看是那里出错了,小弟刚开始用430。 /**************************************************** 说明:串口测试程序 波特率:9600bps ...…

查看全部问答>

Hercules DIY 五:对中断的疑感

Hercules DIY 五:对中断的疑感                                按照计划这周应是解决程序,由于我的项目是报警器我想用管脚中 ...…

查看全部问答>

印制电路板设计经验分享

  对于电子产品来说,印制线路板设计是其从电原理图变成一个具体产品必经的一道设计工序,其设计的合理性与产品生产及产品质量紧密相关,而对于许多刚从事电子设计的人员来说,在这方面经验较少,虽然已学会了印制线路板设计软件,但设计出的印制 ...…

查看全部问答>

EEWORLD大学堂----无线网络协议

无线网络协议:https://training.eeworld.com.cn/course/372…

查看全部问答>