准確地寫就應該是:RR A,中間是有空格的。
這是匯編指令,是對累加器A中的8位數進行右循環移位。見下圖詳解。
2. 在8位單片機如何實現16位運算
如果你是用C編譯器,那麼根本就不用考慮這個問題,因為編譯器都為你解決了,你只需要定義16位的變數(如int型)
但如果你是用匯編語言寫程序,那麼就得為程序分配內存單元(字型變數),利用四個或四個以上的八位寄存器,先低八位進行運算,然後進行高八位的運算,但其中要注意狀態寄存器的變化。
3. 編程:使用單片機P1口控制8個LED。顯示方式:自上而下逐個點亮,再自下而上逐個點亮,如此循環
給你個簡單點的
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV P1,#01111111B ;P1口低電平 對應燈亮 點亮P1.7對應的LED
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#10111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11011111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11101111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11110111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111011B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111101B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111110B;點亮P1.0對應LED
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111110B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111101B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111011B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11110111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11101111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11011111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#10111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#01111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
SJMP MAIN
;延時250ms子程序
DLY_250MS:MOV R5,#5
DLY1: MOV R6,#100
DLY0: MOV R7,#250
DLY: DJNZ R7,DLY
DJNZ R6,DLY0
DJNZ R5,DLY1
RET
;延時500ms子程序
DLY_500MS:MOV R4,#2
DLY2: LCALL DLY_250MS
DJNZ R4,DLY2
RET
END
4. 51單片機intrinsic.h怎麼用
頭文件就相當於一組自定義函數或者一些聲明。其實沒什麼使用方法。你在使用include<aaa.h>時,就如同你把aaa.h中的內容全部復制到添加路徑include<aaa.h>的地方。
具體我們看下面:
/*--------------------------------------------------------------------------
INTRINS.H
IntrinsicfunctionsforC51.
--------------------------------------------------------------------------*/
#ifndef__INTRINS_H__
#define__INTRINS_H__
#pragmaSAVE
#ifdefined(__CX2__)
#pragmaFUNCTIONS(STATIC)
/*,butneedstaticattribute*/
#endif
externvoid_nop_(void);
externbit_testbit_(bit);
externunsignedchar_cror_(unsignedchar,unsignedchar);
externunsignedint_iror_(unsignedint,unsignedchar);
externunsignedlong_lror_(unsignedlong,unsignedchar);
externunsignedchar_crol_(unsignedchar,unsignedchar);
externunsignedint_irol_(unsignedint,unsignedchar);
externunsignedlong_lrol_(unsignedlong,unsignedchar);
externunsignedchar_chkfloat_(float);
#ifdefined(__CX2__)
externintabs(int);
externvoid_illop_(void);
#endif
#if!defined(__CX2__)
externvoid_push_(unsignedchar_sfr);
externvoid_pop_(unsignedchar_sfr);
#endif
#pragmaRESTORE
#endif
以上是intrins.h的具體內容。
逐一分析。
1.#ifndef,#define,#endif
#ifndef __INTRINS_H__
#define __INTRINS_H__
#define qwerty
...
#define tyuio
#endif
這是一組。功能是條件編譯。ifndef是if not defined,如果沒有定義__INTRINS_H__,那咱們就定義吧,下一條就是#define __INTRINS_H__。一直到最後終止endif。
使用目的:如果編譯時,系統已有intrins.h的定義,則不編譯以下內容,若系統沒有定義標識則編譯內容。
例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯:
#ifdefWINDOWS
#defineMYTYPElong
#else
#defineMYTYPEfloat
#endif
如果在Windows上編譯程序,則可以在程序的開始加上#define WINDOWS
這樣則編譯命令行:#define MYTYPE long。
如果在這組條件編譯命令之前曾出現以下命令行:#define WINDOWS 0
則預編譯後程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用於不同類型的計算機系統。
(#pragma先略過)
2.extern
Extern用在變數/函數聲明前,表明該變數/函數是在別處定義的。Extern void nop (void)表示其他地方有定義過函數nop(void),此處引用。
首先強調一點。頭文件中的定義都不是全局變數,但是因為一直寫在開頭所以總是被最先編譯。如果在xxx.h中定義int key,想在多個文件中使用A.c,B.h,…,編譯不會通過。因為頭文件中的內容如同照抄在include<xxx.h>處。即:在A和B中都定義了一次這個全局變數key(重復定義)。正確做法是在A.c中定義,在B.h中用extern+A.c中的定義,相反也行。
extern unsigned char _cror_ (unsigned char, unsigned char);表示聲明一個叫_cror_ 的函數,兩個參變數,返回unsigned char型的函數。等等。
_crol_字元循環左移
_cror_字元循環右移
_irol_整數循環左移
_iror_整數循環右移
_lrol_長整數循環左移
_lror_長整數循環右移
_nop_空操作8051NOP指令
說明一下,上面的這些函數雖然是外部定義的。但是很難找到定義的地點。可能在某個系統的dll文件中。使用時不必拘泥過多,直接使用就行。具體函數幹些什麼你也可以自己網路。這里不展開了。
3.#pragma
這是預編譯指令,也可以叫編譯器指令。初學者不必深究。換句話說,即使完全不理解也不影響你單片機的學習。
#pragma SAVE表示把當前設定放入保存堆棧。
#pragma RESTORE一直和SAVE組合使用,吧保存堆棧中的內容存儲起來。他們是一組,一般共同使用。
還有剩餘的一些其實就和上面講的是一個類型。無非就是條件編譯和預編譯指令,和你關系不大這里就不展開了。
綜合一下。看一個例子:
voidhahaha(inta,charb);//實際上你打開一個單片機的project,裡面有reg51.h和intrins.h。這句話就如同intrins.h的功能,僅僅是聲明。
main()
{
hahaha(qwe,rty);
}
voidhahaha(inta,charb);//這句話就如同reg51.h的功能,定義了一些函數。
{
a=a++;
b=b--;
}
當你include<reg51.h>include<intrins.h>後,就如同頭文件的內容全部抄到你自己寫的函數的最上面。