標(biāo)題: 求助,如何定義51單片機(jī)中位尋址的位為標(biāo)志 [打印本頁(yè)]

作者: panzishi123456    時(shí)間: 2015-4-15 21:35
標(biāo)題: 求助,如何定義51單片機(jī)中位尋址的位為標(biāo)志
比如PSW中的F0,可以在程序中判斷為1或?yàn)?,還可以置1或清零。我看了郭天詳?shù)囊曨l,他講課直接用一個(gè)字節(jié)8位做標(biāo)志,實(shí)在是浪費(fèi),51的資料RAM從20H到2FH有16字節(jié)共128位可位尋址,請(qǐng)教高手C語(yǔ)言如何定義可尋址位為標(biāo)志
作者: lxa0    時(shí)間: 2015-4-15 22:24
以20H到2FH的128位做用戶標(biāo)志最便捷
作者: panzishi123456    時(shí)間: 2015-4-16 18:52
lxa0 發(fā)表于 2015-4-15 22:24
以20H到2FH的128位做用戶標(biāo)志最便捷

如何用,用bit嗎?例如這樣定義,bit flag_0=0x00;這樣只占一位對(duì)吧
作者: lxa0    時(shí)間: 2015-4-16 22:40
steb x
作者: panzishi123456    時(shí)間: 2015-4-17 19:18
lxa0 發(fā)表于 2015-4-16 22:40
steb x

用C語(yǔ)言寫呀,setb x;不能通過(guò)編譯,而且setb不是關(guān)鍵字,匯編才能用吧

作者: panzishi123456    時(shí)間: 2015-4-17 19:22
lxa0 發(fā)表于 2015-4-16 22:40
steb x

我回來(lái)用bit F1;實(shí)現(xiàn)了,還是感謝你的熱情幫助
作者: panzishi123456    時(shí)間: 2015-4-17 20:19
還找了個(gè)高手,要了個(gè)標(biāo)準(zhǔn)C定義位的,據(jù)說(shuō)用到聯(lián)合、枚舉、結(jié)構(gòu)體啥的,能用到所有用C編程的MCU上,經(jīng)測(cè)試使用無(wú)問(wèn)題,同大家分享一下。
/**********************************************************************
標(biāo)準(zhǔn)C位定義
***********************************************************************/
typedef unsigned char INT8U;

volatile union uFlag
{
   INT8U byte;       
   struct {
      INT8U bit0:1;
          INT8U bit1:1;
          INT8U bit2:1;
          INT8U bit3:1;
          INT8U bit4:1;
          INT8U bit5:1;
          INT8U bit6:1;
          INT8U bit7:1;
          }flag;                                                                 //flag不能是關(guān)鍵字
}umyFlag,keyFlag;                                                         //可定義多個(gè)字節(jié)做標(biāo)志位


#define F1                                                                umyFlag.flag.bit0
#define F2                                                                umyFlag.flag.bit1
#define F3                                                                umyFlag.flag.bit2
#define F4                                                                umyFlag.flag.bit3
#define F5                                                                umyFlag.flag.bit4
#define F6                                                                umyFlag.flag.bit5
#define F7                                                                umyFlag.flag.bit6
#define F8                                                                umyFlag.flag.bit7
作者: panzishi123456    時(shí)間: 2015-4-17 20:22
這方法即使不是可位尋址的位都可以直接用
作者: 搬磚學(xué)51    時(shí)間: 2016-9-21 17:04
在keil里有一個(gè)<absacc.h>這個(gè)頭文件,這里面的函數(shù)可以滿足你的需要,可以QQ私聊我。3030895463
作者: STC89C51    時(shí)間: 2016-9-21 21:11
可以用bit語(yǔ)句來(lái)聲明一位,它只占一位
作者: zl2168    時(shí)間: 2016-9-23 20:53
本帖最后由 zl2168 于 2016-9-23 20:58 編輯

⒍ 位變量定義方式

80C51片內(nèi)RAM16字節(jié)128位的可尋址位(字節(jié)地址20H2FH,位地址00H7FH),還有11個(gè)特殊功能寄存器是可位尋址的,C51編譯器擴(kuò)充了關(guān)鍵詞bitsbit,用于定義這些可尋址位。位變量也需先定義,后使用。

定義128位可尋址位的位變量

bit  位變量名

例如:

bit  u,v;                      //定義位變量uv 。

C51編譯器將自動(dòng)為其在位尋址區(qū)安排一個(gè)位地址(1bit)。

對(duì)于4-5中已經(jīng)按存儲(chǔ)器類型bdata定位的字節(jié),其每一可尋址位,可按如下方法定義:

unsigned char bdata  flag;        //定義字符型變量flag,存儲(chǔ)器類型bdata

bit  f0=flag^0;                   //定義位標(biāo)識(shí)符f0,為flag0

bit  f1=flag^1;                //定義位標(biāo)識(shí)符f1,為flag1

上述第一條語(yǔ)句先定義了一個(gè)字符型變量flag,存儲(chǔ)器類型bdataC51編譯器將自動(dòng)為其在片內(nèi)RAM位尋址區(qū)(20H2FH)安排一個(gè)字節(jié)(8bit),第23條語(yǔ)句則分別定義f0、f1為該字節(jié)第0、1位的位標(biāo)識(shí)符。注意,“^”不是運(yùn)算符,僅指明其位置,相當(dāng)于匯編中的“.”。

定義11個(gè)特殊功能寄存器可尋址位的位變量

80C51單片機(jī)11個(gè)可尋址位的特殊功能寄存器中,有6個(gè)SFRPSW、TCONSCON、IE、IPP3),它們每一可尋址位有位定義名稱,C51庫(kù)函數(shù)reg51.h也已對(duì)其按MCS-51中取的位定義名稱(必須大寫)全部作了定義,并賦予了既定的位地址。只要在頭文件中聲明包含庫(kù)函數(shù)reg51.h,就可按位定義名稱直接引用。但是,還有5個(gè)SFRACC、B、P0P1P2),可尋址位沒(méi)有專用的位定義名稱,只有位編號(hào),但這些位編號(hào)不符合ANSI C標(biāo)識(shí)符要求,例如,ACC.0、P1.0等(C51標(biāo)識(shí)符規(guī)定不可用小數(shù)點(diǎn)),應(yīng)重新定義。其格式如下:

sbit  位變量名=位地址常數(shù)

其中,位地址常數(shù)必須是該位變量既定的真實(shí)位地址。例如:

sbit  P10=0x90;                          //定義位標(biāo)識(shí)符P10,位地址90HP1.0

sbit  P10= 0x90^0;              //定義位標(biāo)識(shí)符P10,為90HP1口)第0

sbit  P10= P1^0;             //定義位標(biāo)識(shí)符P10,為P1口第0

上述第1條語(yǔ)句是直接用P1.0的位地址,第2條語(yǔ)句是用P1口的字節(jié)地址加位編號(hào),第3條語(yǔ)句是用P1口特殊功能寄存器名加位編號(hào)。

需要說(shuō)明的是,若用戶不按既定的位定義名稱引用6個(gè)SFR中的可尋址位,另起位變量名,則也須對(duì)其重新定義。雖然C51允許用關(guān)鍵詞sbit定義這些位變量,體現(xiàn)了C51編譯功能的多樣性和完整性,但編者還是建議讀者不要去重新定義6個(gè)SFR中的可尋址位,而直接使用預(yù)處理命令,既省事又不易出錯(cuò)。

需要指出的是,使用sbit定義11個(gè)特殊功能寄存器可尋址位的位變量,因其具有不變的真實(shí)地址,屬于全局變量,應(yīng)放在主函數(shù)之前(參閱4-6)。

需要注意的是,不要混淆bitsbit的區(qū)別。bit用于普通位變量,而sbit位用于特殊功能寄存器中可位尋址的位變量(有既定位地址)。


以上摘自張志良編著
80C51單片機(jī)實(shí)用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9


書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1