A. 51單片機 匯編語言
;P1 IS KEY
;P0 IS LED
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
JB P1.0,MAIN1
MOV A,#0FEH
SJMP MLED
MAIN1:
JB P1.1,MAIN2
MOV A,#0FCH
SJMP MLED
MAIN2:
JB P1.2,MAIN3
MOV A,#0F8H
SJMP MLED
MAIN3:
JB P1.3,MAIN4
MOV A,#0F0H
SJMP MLED
MAIN4:
JB P1.4,MAIN5
MOV A,#0E0H
SJMP MLED
MAIN5:
JB P1.5,MAIN6
MOV A,#0C0H
SJMP MLED
MAIN6:
JB P1.6,MAIN7
MOV A,#80H
SJMP MLED
MAIN7:
JB P1.7,MAIN
MOV A,#0
MLED:
MOV P0,A
LJMP MAIN
END
B. 51單片機匯編程序
寄存器壓棧和出棧的時候,不能直接寫寄存器的名字,比如:PUSH R3
POP R3應該寫成PUSH 3和POP 3。還有就是
CCC: DEC R2
JZ BACK;我想你的意思是想做一個當R2=0時的跳轉操作。但是JZ和JNZ指令只能判斷ACC的值是否=0,你這個JZ在DEC R2後面,根本就沒有對ACC的操作,所以是不會有你想像的結果的。
C. 51單片機匯編程序的問題
單片機的程序都是死循環。
區別在於,這個循環內有沒有事做,循環做什麼事。
你上面的程序,最後死循環在原地。定時器中斷10次後也不再中斷。
D. C51單片機匯編語言
你用的是跳轉指令進入程序段,而不是子程序調用,所以不能用RET返回,只能同樣跳回去
用LCALL或者ACALL命令調用子程序時會把當前的程序地址壓入堆棧當前點,在遇到RET指令時就會把保存的斷點地址彈回PC寄存器,繼續調用之前的執行,但是JMP系列指令不會保存斷點地址,所以RET時就會把堆棧當前點數據裝入PC,上電後RAM中未初始化的單元都是0,所以就會把0裝入PC,於是程序就回到0地址了。
E. 關於51單片機匯編語言程序
ORG 0000H
LJMP MAIN
ORG 000BH
LCALL TIMER0
ORG 1000H
MAIN:
LCALL INIT
WAIT :
CJNE R0,#10,WAIT
MOV R0,#0
RRC A
MOV P1,A
SJMP WAIT
INIT
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#B0H
SETB EA
SETB ET0
SETB TR0
MOV A,#01H
MOV P1,A
RET
TIMER0:
MOV TH0,#3CH
MOV TL0,#B0H
INC R0
RETI
F. 51單片機匯編語言
ORG 00H
LJMP MAIN
ORG 30H
MAIN:
MOV R2,#0
MOV R0,#40H
MOV R1,#30H
MOV DPTR,#2000H
LOOP1:
MOVX A,@DPTR
MOV B,#2
MUL AB
ADD A,@R1
DEC A
MOV @R0,A
INC R0
INC R1
INC DPTR
CJNE R2,#10,LOOP1
MOV R2,#0
MOV R1,#40H
MOV DPTR,#3000H
LOOP2:
MOV A,@R1
MOVX @DPTR,A
INC R0
INC R1
INC DPTR
CJNE R2,#10,LOOP2
SJMP $
END(未完)
G. 51單片機匯編自鎖程序
也許是按鍵抖動,外加一個上拉電阻和一個104對地電容試試吧
H. 用匯編語言編寫一個51單片機的程序
首先搞清LED管是高電平導通還是低電平導通。
如果是低電平導通,P1賦0x00時,發光管全亮,0xff時,全滅。
具體程序:
#define uint unsigned int
#define uchar unsigned char
void delay(uint time_out)
{
uint i,j;
for(i=0;i<time_out;i++)
{
for(j=0;j<110;j++)
{;}
}
}
void main(){
while(1)
{
P1=0xfe; //第1個管亮
delay(500);
P1=0xfd; //第2個管亮
delay(500);
P1=0xfb; //依次類推
delay(500);
P1=0xf7;
delay(500);
P1=0xef;
delay(500);
P1=0xdf;
delay(500);
P1=0xbf;
delay(500);
P1=0x7f;
delay(500);
}
}
程序大致如此,delay函數負責延遲500ms.有問題自己再調試調試
I. 51單片機匯編
0x40的寫法,也是正確的。
毛病出在下面:
程序開始,把堆棧設置在40H,再調用子程序,系統就自動把返回地址,存入了堆棧。
但是,在子程序中,卻把堆棧內的返回地址,給清零了。
那麼,RET指令一執行,就又從0000H開始執行。
J. 51單片機的匯編編程
ORG 0000H
MOV DPTR,#2000H
MOV R0,#2AH ;#2AH * #60H=#1000H
MOV R1,60H
CLR R2
CLR R3
LOOP:CLR A
MOVC A,@A+DPTR
CJNE A,#41H,QUET ;與A的ASCII碼#41H比較,不等->轉移
MOV A,R2
INC A
MOV A,R2
JC JIAYI ;溢出一次,R3+1
LJMP QUET
JIAYI:INC R3
LJMP QUET
QUET:INC DPTR
DJNZ R0,LOOP
DJNZ R1,LOOP
MOV DPTR,#2010H
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
END