❶ 怎麼實現51單片機片外RAM 00EH和片外RAM 00FH內容的互換用C51、匯編語言分別實現
片外RAM 00EH和
片外RAM 00FH
內容的互換
匯編:
MOVDPTR,#000EH
MOVXA,@DPTR
MOVB,A
MOVDPTR,#000FH
MOVXA,@DPTR
XCHA,B
MOVX@DPTR,A
MOVDPTR,#000EH
XCHA,B
MOVX@DPTR,A
END
❷ 關於STC單片機定時器問題
--代碼有誤,沒計算精確,如果精確計算的話,在短時間內是感覺不出來誤差的.下面代碼供參考..
----
;========================================================start
; MOV 8EH,#0C0H ;T0,T1=12倍速C51(STC2501)
CHA DATA 10H
CHS DATA 11H ;秒單元
CHM DATA 12H ;分單元
CHH DATA 13H ;時單元
NG DATA 14H
NS DATA 15H
;----------------BEGIN
ORG 0000H
LJMP main
ORG 000BH
LJMP CLOCK
ORG 030H
main: MOV P1,#0FFH
MOV P3,#0FFH
MOV CHA,#00H
MOV CHS,#00H
MOV CHM,#00H
MOV CHH,#00H
MOV NG,#00H
MOV NS,#00H
;===========
MOV TMOD,#01H ;定時器0控制字
MOV TL0,#0B0H ;{TL0=B0H,TH=3C}=1S
MOV TH0,#3CH
SETB ET0
SETB TR0
SETB EA
MOV DPTR,#LED
;-------DisplayProgram
;-------第一、二位
F1: MOV A,CHS ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11111110B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11111101B
CALL DEL1MS ;顯示1ms
;-------第三、四位
MOV A,CHM ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11111011B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11110111B
CALL DEL1MS ;顯示1ms
;-------第五、六位
MOV A,CHH ;將H中的十六進制數轉換成10進制
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV NS,A
MOV NG,B
MOV A,NG
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P1,A ;送出個位的7段代碼
MOV P3,#11101111B
CALL DEL1MS ;顯示1ms
MOV A,NS ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P1,A ;送出十位的7段代碼
MOV P3,#11011111B
CALL DEL1MS ;顯示1ms
JMP F1
;----------------------interrupt
CLOCK: MOV P1,#0FFH
MOV TL0,#0B0H ;0B0H
MOV TH0,#3CH ;3CH
PUSH ACC
PUSH PSW
;-------
INC CHA
MOV A,CHA
CJNE A,#1,EXT ;C51=20,STC=240//8EH.2=1
MOV CHA,#00H
INC CHS
MOV A,CHS
CJNE A,#60,EXT
MOV CHS,#00H
INC CHM
MOV A,CHM
CJNE A,#60,EXT
MOV CHM,#00H
INC CHH
MOV A,CHH
CJNE A,#24,EXT
MOV CHH,#00H
;-----------
EXT: POP PSW
POP ACC
RETI
;------------------------------------------------------
LED: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
;---------------------------------------delay_program
DEL1MS: MOV R4,#2 ;延時程序3,精確延時1000微秒
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
END
C例子:
//------------------初始化函數
int_ini()
{
TH0=0X3C;TL0=0XB0;
TMOD=0X01;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
}
//----------------中斷處理函數
void time_intt0(void) interrupt 1
{
ET0=0;TR0=0;TH0=0X3C;TL0=0XB0;TR0=1;
con1s++;
if(con1s==20)
{
con1s=0x00;
timedata[0]++;
if(timedata[0]>=10)
{timedata[0]=0;timedata[1]++;}
if(timedata[1]>=6)
{timedata[1]=0;timedata[2]++;}
if(timedata[2]>=10)
{timedata[2]=0;timedata[3]++;}
if(timedata[3]>=6)
{timedata[3]=0;timedata[4]++;}
if(timedata[4]>=10)
{timedata[4]=0;timedata[5]++;}
if(timedata[5]==2&&timedata[4]==4)
{timedata[4]=0;timedata[5]=0;}
}
dis[0]=timedata[0]; //相當於匯編 MOV DIS0,TDATA0]]DIS0為顯示掃描時的數值[秒位]~~~~~~
dis[1]=timedata[1];
dis[2]=timedata[2];
dis[3]=timedata[3];
dis[4]=timedata[4];
dis[5]=timedata[5];
ET0=1;
}
❸ 51單片機,片內數據空間30H-3FH的數據逆序(20H → 100FH, 21H → 100EH,…)
;啟動入口========================
ORG 0000H ;復位啟動
AJMP START ;
;主程序==========================
START: MOV R0,#30H ;源數據開始地址
MOV DPTR,#100FH ;目標數據地址
MOV R3,#0
MOV R4,#0
MOV B,#16 ;數據個數
;
LOOP: MOV A,@R0 ;取得一個數據
MOVX @DPTR,A ;存入指定地址
;
JNB ACC.0,P100
INC R3
;
P100: CLR C ;准備比較
SUBB A,#101 ;比較
JC NOS ;不大於100
INC R4
;
NOS: INC R0 ;指向下一個數據
DEC DPTR ;調整目標地址
DJNZ B,LOOP ;搜索完所有數據
END ;結束
❹ 位地址3EH和位元組地址3EH有什麼區別
位地址是以1為單位遞增,位元組地址以8為單位。位元組地址由八個位地址組, 位地址是位元組地址中的某一位,在RAM 中,位地址20H是位元組地址24H的最低位,位元組地址20H有8個位地址:從00H---07H,所以在用匯編去編程的時候,需要注意操作的地址是位地址還是位元組地址,把數據存放在含有位地址的位元組地址中時,可以在程序中去改變這個數據的某一位,所以位元組地址中可以存放8個位變數
採納哦
❺ 單片機乘法指令計算步驟求解
……4Eh×5Dh = 1C56h 啊,你在草稿紙手算一下,或者直接計算器按就行。
十六進制乘法你不熟的話,可以先都轉成十進制,用十進制乘法得出乘積,再轉成十六進制。
4Eh = 78d,5Dh = 93d
78×93 = 7254d
7254d = 1C56h
好好學習天天向上
❻ 關於C51單片機單片機的幾個問題
1、徐漢斌版單片機微型計算機原理教材P144上說「中斷服務程序最後一條指令必須是中斷返回指令RETI」,
這句話是不是錯了?
如果最後一句話是跳轉指令不是也可以么,只不過程序不會回到斷點處罷了,PC也會填充跳轉處PC地址
--寫跳轉指令、或者寫其它什麼指令,都行,隨你便。單片機都會執行。
--只是,單片機沒有執行 RETI 指令,中斷程序就沒有結束。
--如果,你不寫 RETI,中斷後,單片機就永遠處於中斷程序之內。
2、在方式0定時器T0的初值為1E0CH,則TH0,TL0的初值分別為()
這題答案給的居然是F0H、0CH,我覺得分明是1EH、0CH啊,是不是答案錯了
--寫成二進制:1E0CH = 0001 1110 0000 1100B
--取其低 13 位,寫成高八位、低五位:11110000、01100
--方式0的初值,就應該是:F0、0C。
3、」MCS 51的程序計數器PC不能被用戶使用,因為他沒有地址「,
首先,不能被用戶使用指的收拾什麼?其次,它沒有地址那他到底在哪?
--PC 的數值,時時刻刻,在自動加一,這個特點,用戶對其,不可控制。
--但是,用戶,可以用 JMP 指令,改變 PC 的數值。
--說 PC 不能被用戶使用,實際上是他不會用。
--51 單片機裡面,確實沒有 PC 的地址,因為,誰都不需要這個地址。
4、MOV 20H,@DPTR 這個語句錯了是因為DPTR只能用於片外定址么
--這個指令,並不存在。
DPTR只能用於片外定址么
--查一下指令表,就知道了。
5、」80C51單片機子程序調用時能自動保護斷點和現場「,
這句話錯了是不是因為只能自動保護斷點不能自動保護現場?
--中斷時,51 單片機,採用壓棧的方法,自動的保護斷點地址。
--保護現場 ?
--單片機,不知道你的現場是什麼。
--把單片機和保護現場聯系在一起,就是狗戴嚼子,胡勒!
6、MOV A,#33H 是把33H當成無符號數吧?那麼如果我想移入一個帶符號數呢
就寫上負號即可。
MOV A, #-33H
這就行了。
7、向前轉移的偏移量為什麼等於(目的地址+0100H)-(原地址+3),0100H是什麼?
--編寫程序,現在都用編譯軟體來進行編譯。
--編譯軟體,會自動計算程序中的偏移量。
--編程人,根本不用討論偏移量的計算,以及推導公式。
--有些教材,作者的思維,還停留在人工編譯的階段,抱殘守缺,不用理他。
--0100H,是256。
❼ 單片機XCHD指令是怎麼進行交換的
單片機xchd
a,@r0
是半位元組交換指令,累加器a的低4
位和內存的低4
位交換.
是匯編指令,類似於swap,不過有兩個操作數,xchd
rd,
rn
,功能為半位元組交換。
比如:
r1
=
23h,r2
=
45h,那麼
xchd
r1,
r2後,
r1
=
25h,
r2
=
43h,明白了嗎
❽ 0eh 0dh 什麼意思 單片機
0eh 0dh在單片機中就表示兩個十六進制數0EH和0DH,也即是十進制數14和13.
❾ 51單片機中位地址4EH具體在內存中什麼位置
51單片機中沒有4EH這個位地址,一般地,能被8整除的位元組地址可位定址,如90H,那麼91H的位地址則表示90H位元組地址的第一位。
❿ 單片機中 A=4EH,B=5DH,MUL AB 怎麼計算的結果是AB=1C56H怎麼來的
列算式就可以知道怎麼得到的了:
01001110 ;A=4EH,
01011101 ;B=5DH,
------------------------;x;MUL AB
01001110
00000000
01001110
01001110
01001110
00000000
01001110
00000000
---------------------------------------------
0001110001010110
四位一組 0001 1100 0101 0110B,即1C56H。
其實乘法就是移位再累加。