1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      單片機C環境下位操作的實現方法

      更新時間: 2007-07-23 09:39:30來源: 粵嵌教育瀏覽量:780

        C語言既有語言的各種特點,又可對硬件進行操作,并對進行結構化程序設計,用C語言編寫的程序較容易移植,它們可生成簡潔可靠的目標代碼,在代碼效率和代碼執行速度上完全可以和匯編媲美。采用C語言進行單片機編程嵌入式程序設計的發展趨勢。但是,在嵌入式控制等領域,經常需要控制某一個二進制位,然而除了Keil C51等C環境外,很多單片機C環境都沒有擴充對位變量定義的關鍵字,甚至單片機本身的硬件上也沒有對單個位操作的匯編指令,使得已習慣MCS-51內核單片機Keil C51編程的用戶都為其C環境不能對位變量進行位操作而煩惱。

        1 用“讀-修改-寫”方法實現對單個位的位操作

        ANSIC中,一般采用“讀-修改-寫”的方法實現單個位的位操作,通過與0“與”操作,將某一位清0。如使i變量的b0位為0,實現方法為i=i&0xfe。通過與1“或”操作,將某一位置1。如使i變量的b0位為1,實現方法為i=i|0x01。通過與1“異或”操作,將某一位取反。如使i變量的b0位取反,實現方法為i=i^0x01。

        注意:錯誤“讀-修改-寫”方法時不要影響其他位,即某位清零時,其他位與1“與”;某位置1時,其他位與0“或”;取反時,其他位與0“異或”。

        為了方便程序設計和增加程序可讀性,很多程序員喜歡采用下面的移位方式實現單個位的位操作,語句簡練,可讀性強,比如在某單片機的B口連接1個發光二極管,其點亮操作方法如下:

        #define bit(x) (1<<(x))
        #define LED 2

        使用方法如下:

        PORTB|=bit(LED);//將PORTB第3位置1,點

                   //亮連接在I/O口的LED

        該方式下,程序運行時會增加移位操作,生成的代碼較大,而且執行時間,實時性差,一些C環境按如下方式直接定義位,則生成的代碼就不會有移位操作:

        2 通過位域的方法實現位操作

        標準C提供了一種基于結構體的數據結構--位域(BitField),位域就是把一個存儲單元中的二進制劃分為幾個不同的區域。并說明每個區域的位數。每一個域有一個域名,允許在程序中按域名進行操作,位域的定義格式如下:

        struct 位域結構名{
        位域列表 };
        位域列表格式為:類型說明符 位域名:位域長度如:
        struct k{
        unsigned int a:1
        unsigned int :2
        unsigned int b:3
        unsigned int :0     //空域
        }k1;

        說明:

        1)各位依次從低位到高位排列,排滿一個存儲單元,按地址接著排下一單元;
        
        2)位域可以無域名,但不能被引用,如第二域,這時其只用來填充或調整位置;
       
        3)第四行稱空域,目的是將目前存儲單元的剩余部分分為一個域,且填充0。

        位域的引用很簡單,如:

        k1.a=1; //置k1的b0位為1
        k1.b=7; //將k1的b3-5位置111

        通過位域定義位變量,是實現單個位位操作的重要途徑和方法,采用位域定義位變量,產生的代碼緊湊、高效。定義的方法如下:

        通過位域定義位,再通過宏進行定義,可以方便地將Keil C51等程序移植到其他C編譯器,從而不再為沒有位操作而苦惱。

        對一個單片機的所有I/O口,通過將位域結構指定到I/O端口地址,I/O口便都可以采用位域進行宏定義,這樣,操作I/O口就可以像Keil C51編程一樣方便。

        3 基于位域實現位操作應用舉例

        很多單片機沒有硬件的SPI,而很多板級外圍器件為SPI接口,而且某些外圍器件不是標準的SPI,即通信的總二進制位數不是8的整數倍,這里編制一個例程,為同時收和發0-16位,全雙工方式,具體使用見例程注解。注意:很多單片機使用前要對使用的I/O口進行初始化,clk和din為輸出口,dout為輸入口,同時這里使用了前面通過讀-修改-寫宏定義的一個函數GET_BIT(x,y)。

        該SPI模塊已經成功應用到單片機與MAX7219和CH451等SPI通信上。

        對于沒有擴展位變量的C語言環境,在匯編下沒有對單個位進行位操作執行的MCU,通過位域的方法操作I/O口是的方法,匯編下有單個位的位操作指令MCU。可以嵌入匯編,但是程序的可移植性等性能會下降,建議使用位域的方法。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 在线a免费播放v | 在线日本亚洲yy6080 | 日本精品激情乱一区二区 | 日本一久道中文字幕在线 | 亚洲资源站中文字幕 | 亚洲性色高清在线丨 |