0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串行口接收數(shù)據(jù),如何對(duì)16位INT型數(shù)據(jù)進(jìn)行操作?

j4AI_wujianying ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-12-27 06:02 ? 次閱讀

吳鑒鷹單片機(jī)開發(fā)板地址

在8位單片機(jī)中沒有16位數(shù)的操作指令,所有的int型數(shù)據(jù)都要通過兩個(gè)字節(jié)分開操作,使用的方法不用,生成的代碼也不相同,當(dāng)然效率也不一樣,通過指針對(duì)16位數(shù)進(jìn)行操作可以得到高效的代碼。

比如通過串行口接收數(shù)據(jù),或者從串行的EEPROM中讀取的數(shù)據(jù),或者從大于8位的A/D讀取的數(shù)據(jù),由于8位單片機(jī)的數(shù)據(jù)線是8位的,高于8位的數(shù)據(jù)都要分成兩個(gè)字節(jié)分別讀取,然后寫入到RAM中去再進(jìn)行計(jì)算,或者把16位的int型數(shù)據(jù)從RAM中讀出再分別把高低字節(jié)存到EEPROM或者送到D/A,或者通過串行口發(fā)送出去,方法有很多種,下面用多種方法進(jìn)行實(shí)現(xiàn)該操作,這里只演示寫入到16位的情況,讀取的情況非常相似,不贅述。

(1)使用聯(lián)合 (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;

此時(shí)d = 0x1122;

(2) 使用移位指令

數(shù)據(jù)定義與前面相同

d = ((unsigned int)dH)<<8 + dL;

或者

d = dH;

d <<= 8; // or: d = d<<8; 但后者編譯的代碼可能不是最簡(jiǎn)的

d |= dL; // or: d = d | dL; 后者編譯的代碼可能不是最簡(jiǎn)的

(3)使用指針

unsigned char *cptr;

cptr = (unsigned char*)(&d);

cptr[0] = dH;

cptr[1] = dL;

(4)強(qiáng)制指針類型轉(zhuǎn)換

*((unsigned char*)(&d)) = dH;

*((unsigned char*)(&d)+1) = dL;

((unsigned char*)(&d))[0] = dH;

((unsigned char*)(&d))[1] = dL;

這兩種方式看似相同但由Keil編譯出的代碼是不用的,前都有一次加法運(yùn)算,而后者沒有,后者生成的代碼更簡(jiǎn)潔,這種方式與用聯(lián)合成生的代碼是完全一樣的,

在這幾種方法中第(1)與第(4)的第二種生成的代碼是最乘潔的,是推薦使用的,從軟件工程的角度出發(fā),推薦使用方法(1),這樣沒有強(qiáng)制類型轉(zhuǎn)換,沒有用到指針,更不容易出錯(cuò)。從書寫的代碼來講,第(4)的第二種方法是最好的,代碼簡(jiǎn)潔而且效率最高,但語法有點(diǎn)兒復(fù)雜。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1601

    瀏覽量

    55235
  • 數(shù)模轉(zhuǎn)換

    關(guān)注

    3

    文章

    106

    瀏覽量

    28914

原文標(biāo)題:8位單片機(jī)中如何對(duì)16位INT型數(shù)據(jù)進(jìn)行操作?

文章出處:【微信號(hào):wujianying_danpianji,微信公眾號(hào):?jiǎn)纹瑱C(jī)精講吳鑒鷹】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    串行口的四種工作方式各有什么特點(diǎn)

    串行通信是計(jì)算機(jī)硬件和外設(shè)之間常用的通信方式之一。串行口(Serial Port)是實(shí)現(xiàn)串行通信的硬件接口。在計(jì)算機(jī)系統(tǒng)中,串行口通常用于連接鼠標(biāo)、調(diào)制解調(diào)器、打印機(jī)等設(shè)備。
    的頭像 發(fā)表于 08-22 17:37 ?297次閱讀

    DAC7731 16電壓輸出串行輸入數(shù)模轉(zhuǎn)換器數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《DAC7731 16電壓輸出串行輸入數(shù)模轉(zhuǎn)換器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-23 09:48 ?0次下載
    DAC7731 <b class='flag-5'>16</b><b class='flag-5'>位</b>電壓輸出<b class='flag-5'>串行</b>輸入數(shù)模轉(zhuǎn)換器<b class='flag-5'>數(shù)據(jù)</b>表

    DAC716帶串行數(shù)據(jù)接口的16數(shù)模轉(zhuǎn)換器數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《DAC716帶串行數(shù)據(jù)接口的16數(shù)模轉(zhuǎn)換器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-23 09:15 ?0次下載
    DAC716帶<b class='flag-5'>串行數(shù)據(jù)</b>接口的<b class='flag-5'>16</b><b class='flag-5'>位</b>數(shù)模轉(zhuǎn)換器<b class='flag-5'>數(shù)據(jù)</b>表

    SN74LVC16373 16透明D鎖存器數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《SN74LVC16373 16透明D鎖存器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 06-04 10:58 ?0次下載
    SN74LVC16373 <b class='flag-5'>16</b><b class='flag-5'>位</b>透明D<b class='flag-5'>型</b>鎖存器<b class='flag-5'>數(shù)據(jù)</b>表

    16恒流LED接收驅(qū)動(dòng)器MBI5026數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《16恒流LED接收驅(qū)動(dòng)器MBI5026數(shù)據(jù)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 04-18 17:13 ?4次下載

    STM32L162與ADS8320進(jìn)行16數(shù)據(jù)轉(zhuǎn)換,如何讀取ADS的轉(zhuǎn)換數(shù)據(jù)?

    求助:STM32L162與ADS8320進(jìn)行16數(shù)據(jù)轉(zhuǎn)換,fAHB = 16M, IO方式
    發(fā)表于 04-18 08:19

    STM32WLE5JC SPI數(shù)據(jù)長度設(shè)置為8,但接收數(shù)據(jù)緩存卻是16,為什么?

    在STM32WLE5JC單片機(jī)中SPI數(shù)據(jù)長度設(shè)置了8,并且相應(yīng)的接收FIFO也設(shè)成了8,但最后收發(fā)數(shù)據(jù)是卻是
    發(fā)表于 04-07 07:32

    16恒流LED接收器驅(qū)動(dòng)器MBI5026數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《16恒流LED接收器驅(qū)動(dòng)器MBI5026數(shù)據(jù)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 03-11 17:08 ?0次下載

    嵌入式操作教程:2-12 RS232串通信實(shí)驗(yàn)(查詢方式)

    一、實(shí)驗(yàn)?zāi)康?了解UART 的功能和結(jié)構(gòu),學(xué)習(xí)RS232串通信協(xié)議,并實(shí)現(xiàn)通過查詢方式進(jìn)行 RS232 串口通信收發(fā)。 二、實(shí)驗(yàn)原理 RS232 RS232接口是現(xiàn)在主流的串行通信接口之一,被廣泛
    發(fā)表于 02-07 14:37

    xc2000同步串行口發(fā)送和接收數(shù)據(jù)錯(cuò)誤怎么解決?

    接收兩次就會(huì)陷入接收函數(shù)里的while死循環(huán)。主函數(shù)里有好幾條發(fā)數(shù)的指令,我在每一個(gè)主發(fā)從收函數(shù)后面都寫上從發(fā)主收函數(shù),在示波表里看發(fā)送的數(shù)據(jù)沒錯(cuò),但最后主機(jī)接收到的
    發(fā)表于 02-06 07:35

    AD7794只能接收16位數(shù)據(jù),還有8接收不到是哪里出了問題?

    AD7794是24精度的ADC轉(zhuǎn)換芯片,現(xiàn)在的問題是:我只能接收16位數(shù)據(jù),還有8接收不到
    發(fā)表于 12-19 07:56

    AT89S52單片機(jī)片內(nèi)串行口的工作原理

    電子發(fā)燒友網(wǎng)站提供《AT89S52單片機(jī)片內(nèi)串行口的工作原理.ppt》資料免費(fèi)下載
    發(fā)表于 12-15 09:07 ?0次下載

    python怎么把浮點(diǎn)轉(zhuǎn)為int

    在Python編程語言中,轉(zhuǎn)換數(shù)據(jù)類型是一項(xiàng)重要的操作。當(dāng)我們需要將浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換為整型數(shù)據(jù)時(shí),可以使用
    的頭像 發(fā)表于 11-23 14:56 ?1352次閱讀

    如何將一個(gè)INT數(shù)據(jù)轉(zhuǎn)換成2個(gè)CHAR數(shù)據(jù)?

    如何將一個(gè)INT數(shù)據(jù)轉(zhuǎn)換成2個(gè)CHAR數(shù)據(jù)
    發(fā)表于 11-03 06:20

    基于8031單片機(jī)串行,實(shí)現(xiàn)雙機(jī)通信

    本系統(tǒng)是利用8031單片機(jī)串行,實(shí)現(xiàn)雙機(jī)通信。其中1號(hào)發(fā)送機(jī)8031串行接發(fā)送號(hào)線P3.1(TXD)連到2號(hào)接收機(jī)機(jī)8031串行口
    發(fā)表于 10-19 15:56 ?1次下載
    基于8031單片機(jī)<b class='flag-5'>串行</b>,實(shí)現(xiàn)雙機(jī)<b class='flag-5'>口</b>通信