A. mcs-51單片機程序中可以直接調用中斷服務程序嗎為什麼
這樣給你說吧。當單片機運行起來的時候是高速運轉你while(1)裡面的程序。但是這樣是不夠的,比如你想把某個信號傳遞給單片機讓它處理,比如說:你按了某個鍵來控制某個燈的亮滅,這時候就需要單片機來響應你的動作,響應的方式就是中斷。也就是說你在主程序中完成了某個中斷的觸發條件時,當達到這個條件時程序就會跳轉到中斷服務函數中去,執行完中斷服務函數中的程序後再返回主程序中繼續循環執行。你說的調用其實不太正確,中斷服務函數只能觸發,它是由單片機內特定的某些寄存器的標志位控制的,當這些滿足觸發條件的時候,標志位被硬體置1,然後自動執行你編寫的中斷服務函數。
說的不是很清楚,請見諒,中斷是單片機內最重要的功能之一,與之對應的還有定時器(這是單片機的心臟),這些內容在51裡面都是很簡單的,但是到了32位單片機裡面會變得特別復雜。
希望這些內容能給你一些幫助。
B. 關於一個mcs-51單片機的程序,有個地方不懂,請教一下大家。
MOV 10H,#5 ;向地址為10H(也就是工作寄存器區2的R0)的內部RAM中寫入立即數5
MOV 11H,#16 ;向地址為11H(也就是工作寄存器區2的R1)的內部RAM中寫入立即數16(16進制的10H)
剛才只看了你最後的提問,沒搞清你的意思。
DISP子程序中,前三句是查表獲得LED數碼管段碼的數據。
MOV DPTR,#DISPC
MOV A,@R0
MOVC A,@A+DPTR
由於開始時R0的內容是10H,間接定址就將10H的內容05H送給A,第三句就得到了碼表中的數92H,也就是字元「5」;循環一次R1變為11H,第三句得到0BFH,也就是「-」。
所以這兩句就是送初值的。
不好意思。
C. mcs-51單片機用戶主程序一般不應佔用哪段程序存儲區域,為什麼
不應佔用的是0003H 至002FH這段區域。因MCS-51單片機五個中斷源所對應的入口地址都分布在這段區域,分別為:0003H(外部中斷0)、000BH(定時器0)、0013H(外部中斷1)、001BH(定時器1)、0023H(串列)。
D. MCS51單片機。簡述P0口作為I/O使用時的數據輸入輸出過程。
摘要 多路開關:在51單片機中,當內部的存儲器夠用(也就是不需要外擴展存儲器時,這里講的存儲器包括數據存儲器及程序存儲器)時,P0口可以作為通用的輸入輸出埠(即I/O)使用,對於8031(內部沒有ROM)的單片機或者編寫的程序超過了單片機內部的存儲器容量,需要外擴存儲器時,P0口就作為『地址/數據』匯流排使用。那麼這個多路選擇開關就是用於選擇是做為普通I/O口使用還是作為『數據/地址』匯流排使用的選擇開關了。大家看上圖,當多路開關與下面接通時,P0口是作為普通的I/O口使用的,當多路開關是與上面接通時,P0口是作為『地址/數據』匯流排使用的。
E. 簡述MCS51單片機中程序狀態寄存器PSW各位的含義。
PSW即程序狀態寄存器,Program
Status
Word。
PSW各位的定義如下:
Cy(PSW.7):即PSW的D7位,進位、借位標志。進位、借位CY=1;否則CY=0.
AC(PSW.6):即PSW的D6位,輔助進位、借位標志。當D3向D4有借位或進位時,AC=1;否則AC=0.
F0(PSW.5及PSW.1):即PSW的D5位,用戶標志位;
RS1及RS0(PSW.4及PSW.3):即PSW的D4、D3位,寄存器組選擇控制位;
OV(PSW.2):溢出標志。有溢出OV=1,否則OV=0;
F1(PSW·1):保留位,無定義;
P(PSW·0):奇偶校驗標志位,由硬體置位或清0;存在ACC中的運算結果有奇數個1時P=1,否則P=0。
F. MCS-51單片機查表程序
16和7是查表指令時的PC與數據表格之間的位元組數
MOV A ,@R0 ;取R0指向的地址中的數據到A
ANL A,#0FH ;高四位清零
ADD A,#16 ;加16
MOVC A, @A+PC ;查表,表的首地址為絕對地址PC+A
MOVC A,@A+PC就需要1個位元組啊
查表指令距離表首地址的長度是位元組數
用DPTR的匯編程序:
ORG 0100H
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
LCALL SUBRTE
ORG 1000H
SUBRTE: MOV R0,#30H ; ;置地址指針R0初值
MOV R1,#40H ; ;置地址指針R1初值
MOV R2,#4 ; ;置位元組數
LOOP: MOV A,@R0 ; ;取16進制數
ANL A,#0FH ; ;屏蔽高4位
MOV DPTR,#TABLE ; ;
MOVC A,@A+DPTR ; ;查表低4位轉換為ASCⅡ碼
MOV @R1,A ; ;送結果
INC R1 ; ;修改指針
MOV A,@R0 ; ;從新取16進制數
SWAP A ; ;高4位與低4位互換
ANL A,#0FH ; ;取高4位
ADD A,#7
MOVC A,@A+PC ; ;查表高4位轉換為ASCⅡ碼
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE: DB '012345678'
DB '9ABCDEF'
END
G. MCS_51單片機編製程序,時鍾周期,題目如下
#include "reg51.h"
void initTimer(void)
{
TMOD=0x1; // 你提出的問題 在這里。 50ms採用定時方式1.
TH0=0x9e;
TL0=0x58;
}
void timer0(void) interrupt 1
{
TH0=0x9e;
TL0=0x58;
//這里添加你的代碼
}
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
}
H. MCS-51單片機程序設計
周期2ms,占空比1:2,,也就是說高電平667us,低電平1333us,你的定時器參數分別為:
TGH=(65536-667)/256;
TGL=(65536-667)%256;
TDH=(65536-1333)/256;
TDL=(65536-1333)%256;
在中斷服務程序里交替用這兩個參數給TH0和TL0賦值,對P1.0取反就可以了。
#include<reg51.h>
#define uchar unsigned char
uchar tgh,tgl,tdh,tdl;
bit flag;
sbit p10=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=tgh;
TL0=tgl;
p10=0;
flag=~flag;
}
if(!flag)
{
TH0=tdh;
TL0=tdl;
p10=1;
flag=~flag;
}
}
main()
{
TMOD=0x01;
tgh=(65536-667)/256;
tgl=(65536-667)%256;
tdh=(65536-1333)/256;
tdl=(65536-1333)%256;
TH0=tdh;
TL0=tdl;
TR0=1;
ET0=1;
EA=1;
while(1);
}
I. 51單片機的程序其他單片機可以用嗎
MCS51內核的單片機程序,是不能在非MCS51內核的單片機上使用的,同屬MCS51內核的單片機,有部分型號的程序是可以通用的。
因為不同內核架構的單片機,其存儲區分配、寄存器地址、中斷地址、程序入口、堆棧等均不相同,編譯器對程序的處理也有差別。
如果想要將將MCS51單片機的程序移植到其他單片機上,通常需要按照如下步驟:
1.
更換相對應的編程軟體、編譯環境(視實際情況,有很多編程軟體支持很多不同的單片機,如51的程序移植到stm32,keil也可實現,不用更換編程軟體);
2.
修改底層操作部分的代碼,如寄存器配置、中斷入口等,同時盡量保證程序各函數名、介面名等與原來的一致;
3.
拷貝邏輯部分代碼,根據不同的單片機功能,調整控制邏輯、順序等,同時確保時鍾、堆棧等符合程序要求;
4.
軟硬體模擬、上機測試、debug等。。。
因單片機間肯定有很多差異,移植程序時,需要對兩張單片機均勻一定程度的了解,避免未知因素影響。
J. MCS-51單片機的程序儲存器地址是如何劃分的分別如何訪問片內、片外程序儲存器
MCS-51單片機的片內程序儲存器和片外程序存儲器地址是受EA引腳控制的,如果EA引腳接地,則只能訪問片外程序存儲器,如果EA接高電平,則先訪問片內程序存儲器,當地址高於片內程序存儲器地址(0FFFH)時,自動訪問片外程序存儲器