国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串行口接收數據,如何對16位INT型數據進行操作?

j4AI_wujianying ? 來源:互聯網 ? 作者:佚名 ? 2017-12-27 06:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

吳鑒鷹單片機開發板地址

在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)的第二種方法是最好的,代碼簡潔而且效率最高,但語法有點兒復雜。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 串口通信
    +關注

    關注

    34

    文章

    1662

    瀏覽量

    57965
  • 數模轉換
    +關注

    關注

    3

    文章

    117

    瀏覽量

    29729

原文標題:8位單片機中如何對16位INT型數據進行操作?

文章出處:【微信號:wujianying_danpianji,微信公眾號:單片機精講吳鑒鷹】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機中的串口通訊串行同步通信與串行異步通信

    進行傳送。串行通信的數據是逐傳輸的,發送方發送的每一都具有固定的時間間隔,這就要求接收方也
    發表于 01-15 08:06

    嵌入式中的浮點數據轉換為字節類型的三種方法

    的時候一般都是以省內存,加快運算速度優先。所以在選擇使用浮點時float就可以滿足大部分需求,當需要高精度的時候必須使用double進行運算。 浮點數據在嵌入式中的使用 在嵌入式
    發表于 01-07 06:28

    深入剖析DS92LV1616總線LVDS串行器/解串器的卓越性能與應用

    深入剖析DS92LV1616總線LVDS串行器/解串器的卓越性能與應用 在當今高速數據傳輸的時代,
    的頭像 發表于 12-31 14:45 ?358次閱讀

    請問UART內核在接收數據時有哪些具體操作?UART內核在接收數據完成后會進行哪些處理?

    UART內核在接收數據時有哪些具體操作?UART內核在接收數據完成后會進行哪些處理?
    發表于 12-25 07:15

    串行通訊與并行通訊介紹

    16、32及64根或更多的數據進行傳輸的通訊方式,并行通訊就像多個車道的公路, 可以同時傳輸多個數據位數據,而
    發表于 12-11 06:52

    操作的常見錯誤與應對策略

    溢出或數據丟失。在進行位移操作時,必須確保位移量在數據類型的有效范圍內。例如,對于一個 8 的無符號字符
    發表于 11-24 07:50

    并行與串行的基本通信方式

    1、并行通信方式:將數據字節的各位用多條數據線同時進行傳輸,每位數據都需要一條傳輸線。 2、串行通信方式:
    發表于 11-24 06:36

    NucleiStudio_IDE_201909串打印浮點數據時無數據輸出,軟件該如何配置串口才能打印浮點數據?

    NucleiStudio_IDE_201909串打印浮點數據時無數據輸出,軟件該如何配置串口才能打印浮點
    發表于 11-07 07:57

    對UART0輸入到串口的char數據轉換成16進制的寄存器常用int相關處理

    ascii碼了,比如輸入0,但接收到轉換成int后顯示的卻是48,輸入a顯示的是97。 為了方便硬件寄存器得到想要的16進制數據,我們先要
    發表于 10-31 07:58

    UART接口數據接收和發送數據

    之后便將數據壓入FIFO。軟件每讀一次UART_RDATA寄存器,便會將1字節的表項數據彈出FIFO。 我們應該注意UART接收端采用16倍波特率的采樣頻率采樣
    發表于 10-29 07:37

    使用MCU200T開發板的UART進行數據傳輸

    我們想要實現從電腦串口調試助手像MCU軟核發送一個8bit字節數據例如0xff,并且收到數據軟核回傳的數據。首先要對MCU的UART進行
    發表于 10-28 08:16

    請問rt_thread的uart下如何支持9位數據的發送和接收?

    目前項目中有使用UART進行數據的發送和接收,但是此部分UART比較特殊,其使用9bit進行數據傳輸,其中第9用于指示當前是地位還是數據
    發表于 09-28 07:56

    全面了解串行通信

    串行通信是一種數據傳輸方式,它將數據按 逐順序 (bit by bit)在一條傳輸線上發送和接收,與并行通信(同時傳輸多位
    的頭像 發表于 07-19 14:13 ?1815次閱讀

    求助,關于32位數據總線模式的問題求解

    模式,因此我們將 UART_TX 和 UART_RX 分別連接到 C2 和 D5,同時編輯代碼以切換到 32 位數據總線模式。 我們可以接收來自 UART 的信號(我們發送指令,并能得到響應),但無法獲得完整的圖像。 我們不知道自己是否錯過了一些需要
    發表于 05-22 08:04

    【RA-Eco-RA4M2開發板評測】定時器輔助串口不定長數據接收

    還是英文來交流。下面我們分別對串口通訊協議的物理層及協議層進行講解。 2.2 串口核心參數 ??串口核心參數有波特率、起始數據位、停止和校驗
    發表于 04-30 14:44