❶ 單片機Keil C51 C語言多文件如何使用全局位變數跪拜!!
extern就可以。在一個文件里定義:
bdata m;
sbit x=m^1;
然後在另一個文件里聲明:
extern bdata m;(如果不使用m可以不聲明。)
extern bit x;
這樣就可以使用了。如果變數較多,建議樓上的方法,用全局頭文件。
❷ 51單片機中位地址和位變數是什麼意思呢
位地址是指可以對某些寄存器或存儲器的某一位直接操作,這時這些寄存器的某一位都有一個地址,就叫位地址。編程時用不到位地址,直接寫該位的名稱即可,如 C語言編程直接寫TR0=1,TR0=0,EA=0等 匯編語言寫SET B P1.0 CLR EX0. TR0 EA P1.0 等即是特殊功能寄存器中的某一位,是位變數。
位變數一位二進制變數,如bit A 結果只能 是1或0,當然它是保存在可位定址的存儲器區域
如R0 到 R7中的某一位。
❸ 單片機中怎麼聲明位變數就是僅有一位的變數那種,是bit a嗎
是的,對於C51單片機來說,以下有以下類型變數:
bit a 1位
unsigned char a,或者char a 8位
unsigned short a 或者 short a 16位
unsigned long a或者 long a 32位
unsigned int a 或者 int a 16位,注意,int是與編譯器有關的,對於 C51,int等效於short
float 或者 double 對於 51來說,都是一樣的,32位。
❹ 51單片機如何設置數組變數
因為,51單片機的位地址,只能直接定址,不能間接定址。
所以,51單片機的位地址,就不能用數組來進行操作。
不過,可以利用邏輯運算,進行位操作。
先定義一個數組:a[8] = [128, 64,...8, 4, 2, 1];
然後:P1 |= a[3]; ,這就是令 P1.3 置一。
其實,採用數組的方法,並非是最簡單的。
直接:P1 |= (1 << 3); ,就可以了。
❺ 51單片機c語言編程能給位賦值么
C語言中不能直接給二進制某一位賦值
但是可以通過按位操作來實現
如果你的P3是整型或者字元型的變數,可以通過「按位或」對某一位賦1,通過「按位與」對某一位賦0
P3=P3|0x40;//這樣就是在不改變其他位的同時給第6位賦1
0x40轉換成二進制位01000000
假如:P3的值為10110010
10110010
| 01000000
結果為 11110010
❻ 51單片機有沒有位變數
51有位操作指令,自然有位變數。
有些單片機沒有為變數,不過可以通過構建位域來實現位操作。或者是直接用C的位運算符實現。
###################################################################
51單片機中有可位定址區,位變數就是定義在這一存儲區。在匯編里要指定地址,C中只要在定義變數的時候使用idata關鍵字就可以定義了。
❼ 51單片機變數 51的單片機變數是怎麼個定義法。全局變數,局部變數都放在什麼存儲器里的
不能這樣定義,這樣定義是錯的。你這個是賦值,不是定義在0x22單元格里。
unsigned char bdata SS _at_ 0x22;
只有在Keil編譯環境下才可以這樣使用。還有,這種語法不適合用C語言,我說的是不適合,不是不能用。C語言裡面的指針就是針對這個的,不建議使用 _at_ 進行變數在RAM中固定,這樣對程序編譯優化時,帶來很多麻煩,也得不到充分的優化。
其實用C語言指針的方法是可行的。
bdata區雖然有自己獨立的位地址,但你用的是char型 ,是一個位元組的,所以你說的0x22隻是bdata區的位元組地址,而不是位地址,那麽用C語言的方式實現 就是這樣:
unsigned char *p;
p=0x22;
*p=50;
*p 表示指向0x22所在的單元格,就是將50賦值到0x22地址所指向的單元格里。
再從另一個角度講,如果你沒於傳參或改變實參的情況下,不建議使用這類,即使有,也不是很建議。因為單片機高手是不會用_at_這類關鍵字進行變數定位的。
有什麼疑問可以一起探討。
希望我的回答對你有幫助,謝謝。
❽ 51單片機如何設置同一個按鍵,按一下顯示123456,再按一下顯示321456
51單片機用一個按鍵,定義一個位變數,或一個8位的變數,按一下鍵變數為1,再按一下變數為0。然後顯示時,再根據變數值來決定顯示內容,變數為1,顯示123456,變數為0顯示321456。
❾ 51單片機C語言裡面,定義bit的方法,有哪些,請舉例,謝謝!
一共可以定義16個位元組的位定址變數
static uchar bdata CanBusFlag=0; //can標志
sbit CanRcv_Good=CanBusFlag^0; //成功接收標志
sbit CanSend_Good=CanBusFlag^1; //成功發送標志
sbit CanErrFlag=CanBusFlag^2; //can匯流排錯誤標志
sbit CanDtOverFlag=CanBusFlag^3; //can匯流排超載標志
sbit CanWuiFlag=CanBusFlag^4; //can匯流排喚醒中斷
//你改變CanBusFlag,下面的一堆變數也變了,反之既然
定義:
union UniTEMP // 溫度采樣值
{
uint TEMP;
uchar TEMP_AD[2];
}idata uTEMP; //idata是定義變數存儲空間,這里用的8952單片機,有idata空間
。。。。
程序裡面使用:
uTEMP.TEMP=XXX;//其實TEMP_AD[2]數組裡面的內容也變了,union 結構嘛
如果你只定義8個位,就用第一種方式。
union 結構是為了方便大數據的操作才使用的。如果你要用union 定義一個8位變數的每一位,想應該可以吧。不過不知道符不符合C語法,編一個試試吧~哈哈
❿ 51單片機定義變數地址
你說的這個應該是ADC幾個控制寄存器的地址,這樣
宏定義
之後操作起來就方便很多了,具體這些地址是哪個寄存器的,你要看看晶元手冊了,這里0x80是ADC
電源控制
位,0x10是ADC轉換結束標志位,0x08是ADC轉換啟動控制位。