實驗一 多字節十進制加法程序設計
一.實驗目的:
1.熟悉仿真器的軟件使用環境及單片機匯編語言編程;
2.掌握多字節十進制加法的程序設計及實現方法。
二.實驗內容:
編寫多字節十進制加法程序,實現下式運算 :
4574+6728=11302
要求:被加數在片內RAM區20H、21H單元;分別為學號(7),學號+1(8);
加數在片內RAM區30H、31H單元;分別為學號+2(9),學號+3(10);
結果在片內RAM區20H(最高位進位)、21H(高位)、22H(低位)單元。
三.實驗步驟:
1.開機啟動Keil C51軟件進入μVision2 集成開發環境,確認89C51處於軟件仿真狀態。
2.完成程序的設計、編輯、編譯、連接。
3.進入DEBUG方式,打開存儲器Memory 1窗口,在窗口Address欄鍵入D:20H;點擊鼠標右鍵,選擇最后一項Modify Memory ,輸入被加數;在窗口Address欄鍵入D:30H;點擊鼠標右鍵,選擇最后一項Modify Memory ,輸入加數。
4.調試和運行程序並記錄存儲器Memory 1窗口實驗結果。
四.實驗參考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV A,20H
ADD A,30H
DA A
MOV 22H,A
MOV A,21H
ADDC A,31H
DA A
MOV 21H,A
CLR A
MOV R3,00H
ADDC A,R3
MOV 20H,A
SJMP $
END
五.實驗截圖:
實驗總結:學會了多字節十進制加法程序設計,對keilc51有了更為熟練地掌握,也對程序有了更為深入的了解,課堂所學的理論以及一些不清楚的地方在實驗中得到了答案。
實驗三 P1口輸出實驗
一.實驗目的:
1.掌握P1口輸出端口的使用原理及編程方法;
2.加深I/O端口對外部電路驅動原理的理解。
二.實驗內容:
P1口做輸出,驅動8只發光二極管,編寫程序,以1s的時間間隔使得一個發光二極管從左到右循環點亮。
三.實驗步驟:
1.理解P1口內部結構,掌握P1口輸出高低電平的原理。
2.看懂實驗電路,完成接口連線(注意,接線時需要關閉實驗箱電源)。
3.編寫控制程序,注意延時循環的時間控制在1s
4.進入DEBUG方式,打開I/O口查看工具,監視P1口的輸出變化。調試程序並觀察發光二極管點亮情況。
。
四.實驗參考程序:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: MOV P2,#0FEH
LOOP: ACALL DELAY
MOV A,P2
RL A
MOV P2,A
AJMP LOOP
DELAY:
MOV R3,#100
DELAY2: MOV R4,#100
DELAY3: MOV R5,#100
DELAY1: DJNZ R5,$
DJNZ R4,DELAY3
DJNZ R3,DELAY2
RET
END
;說明:P1口接發光二極管
實驗結果:輸入代碼調試好,通過燒寫器可以看見單片機上的二極管呈周期性點亮,改動數據能改變它點亮的時間間隔。實驗結果如下圖所示:
實驗總結:這次實驗中花了很多時間去看電路圖以及去理解代碼,調整代碼,對keil uVision軟件的使用並不是很熟練,初次使用燒寫器沒找到要燒入的文件忘記調芯片類型以及波特率,通過這次試驗掌握了P1口輸出端口的原理,也熟悉了代碼程序的編寫。
實驗四 P口輸入實驗
一.實驗目的:
1.掌握P3口輸入端口的使用原理及編程方法;
2.加深I/O端口對外部電路驅動原理的理解。
二.實驗內容:
通過手動按鍵K1-K3,循環讀取P3.0-P3.3,並將結果顯示在P2.0-P2.3的LED上,按鍵觀察讀入的值變化。
三.實驗步驟:
1.理解I/O口讀取外部電平原理.
2.進入DEBUG方式,打開I/O口查看工具,監視P3口的輸出變化。
4.生成HEX文件,燒入實驗板,按鍵並觀察發光二極管閃爍情況。
。
四.實驗參考程序:
ORG 0000H
SJMP 0030H
ORG 0030H
START:
LOOP: MOV C,P3.1
MOV P2.0,C ;讀按鍵K1顯示在D1
MOV C,P3.0
MOV P2.1,C ;讀按鍵K2顯示在D2
MOV C,P3.2
MOV P2.2,C ;讀按鍵K3顯示在D3
MOV C,P3.3
MOV P2.3,C ;讀按鍵K4顯示在D4
SJMP LOOP
END
;說明:P2口接發光二極管
實驗總結:最開始照搬老師的代碼發現並無法實現按K1實現D1燈亮,按K2實現D2燈亮,自己仔細分析了一遍找到了兩處需要更改的地方,經過更改最后順利實現了通過手動按鍵實現相應的LED燈亮起,這次實驗也加深了我對I/O口作用的理解。
實驗五 外部中斷實驗
一.實驗目的:
1.掌握51單片機中斷原理及編程方法;
2.了解中斷觸發方式及中斷優先級的概念。
二.實驗內容:
通過手動按鍵產生負脈沖信號,K3控制輸出的負脈沖信號加於INT0,K4控制輸出的負脈沖加於INT1.主程序以1秒為間隔循環點亮響鈴的兩個LED程序,設置INT0為低優先級,當按K3鍵並釋放按鍵后,發出中斷信號,使得8個LED以1秒為間隔“全亮-全滅”方式閃動10秒。
完成上述試驗后,設置INT1的觸發方式為邊沿觸發,優先級為高優先級,安東開關K4,產生負脈沖,INT1中斷服務為高優先級,按動開關K4,長生負脈沖,INT1響應,以1秒為間隔循環點亮8個LED。
三.實驗步驟:
1.理解TCON寄存器中IT0 IT1的設置,IE和EA的正旗設置。
2.理解外部中斷的觸發原理.
2.進入DEBUG方式,打開I/O口查看工具,監視P3口的輸出變化。
4.生成HEX文件,燒入實驗板,按鍵並觀察發光二極管閃爍情況。
。
四.實驗參考程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_0
ORG 0013H
LJMP INT_1
ORG 0030H
MAIN:
MOV SP,#07H
MOV A,#0FCH
SETB EA
SETB EX0
SETB EX1
SETB IT1
SETB PX1
LOOP:
MOV P2,A
MOV R2,#30
LCALL DLY
RL A
SJMP LOOP
INT_0:
PUSH ACC
PUSH PSW
SETB RS0
CLR RS1
MOV A,#00H
MOV R3,#10
LOOP1:
MOV P2,A
MOV R2,#49
LCALL DLY
CPL A
DJNZ R3,LOOP1
POP PSW
POP ACC
RETI
INT_1:
PUSH ACC
PUSH PSW
SETB RS1
SETB RS0
MOV A,#07FH
MOV R3,#8
LOOP2:
MOV P2,A
MOV R2,#49
LCALL DLY
RL A
DJNZ R3,LOOP2
POP PSW
POP ACC
RETI
DLY: MOV R0,#100
DLY1: MOV R1,#100
DJNZ R1,$
DJNZ R0,DLY1
DJNZ R2,DLY
RET
END
;說明:P2口接發光二極管
五、實驗過程
打開Keil uvisions軟件,做好編譯前准備,根據實驗要求編寫程序,先編寫三個循環程序,一個是主程序以1秒為間隔循環點亮響鈴的兩個LED程序,一個是8個LED以1秒為間隔“全亮-全滅”方式閃動10秒,一個是以1秒為間隔循環點亮8個LED,再設置好INT_0和INT_1調好他們觸發方式以及優先級,讓INT_1優先級高於INT_0,從而實現按K3實施INT_0中斷服務,K4實施INT_1中斷服務(具體程序步驟四)。編譯檢查程序無誤,保存,執行。生成HEX文件,燒入實驗板,按鍵並觀察發光二極管閃爍情況。
六、實驗結果
七、實驗總結
在老師的指導下通過這次實驗我了解了中斷原理以及相應的編程,也了解了如何設置中斷程序優先級和循環的問題,同時也對匯編語言的操作便有了更多的認識。
實驗六 計數器實驗
一.實驗目的:
1.熟悉MCS-51單片機定時/計數器的外部計數原理;
2.進一步掌握定時/計數器的計數功能的初始化和編程方法。
二.實驗內容:
模擬產品包裝線上對物品件數的計數,假設每個包裝箱10件物品,每個物品經過傳送帶時,光電傳感器將發出一個脈沖信號,利用T0定時計數器對該脈沖進行計數,每計滿19個物件,將箱數計數器加1,同時將箱數計數器的值以二進制的形式顯示在8個LED發光二級管中。
光電傳感器脈沖由實驗儀器上的K3按鍵來模仿。
三.實驗步驟:
1.理解TCON寄存器中IF0 IF1的設置,IE的EA和ET0的正確設置。
2.理解定時計數器的外部計數的觸發原理.
2.編寫匯編程序,並生成HEX文件,燒入實驗板。
4.按鍵並保持100毫秒以上,模擬光電傳感器的脈沖,記錄按鍵次數,並觀察發光二極管組的顯示,驗證其代表的計數(二進制形式)正確情況情況。
四.實驗參考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#0110B ;T0方式2,計數器方式
MOV TH0,#00F6H ;計數次數為10
MOV TL0,#00F6H
MOV R1,#0H
SETB TR0 ;啟動計時器
;---------------------------------
;控制燈亮
LOOP: MOV A,R1
CPL A ;A取反
MOV P2,A ;控制燈亮
MOV C,P3.2
CPL C
MOV P3.4,C ;傳遞給P3.4
JBC TF0,NEXT ;查詢溢出位,10個溢出一次
LJMP LOOP
;---------------------------------
;控制R1數值並在LOOP中令A取反控制燈亮
NEXT:
INC R1
LJMP LOOP
END
;說明:P2口接發光二極管
五、實驗過程
打開Keil uvisions軟件,做好編譯前准備,根據實驗要求編寫程序,計數器方式采用T0方式2,根據計數次數為10計算出2^8-10=246即00F6H,根據要求寫好主程序與循環程序(具體程序步驟四)。編譯檢查程序無誤,保存,執行。生成HEX文件,燒入實驗板,持續按動按鍵K3並觀察發光二極管閃爍情況。
六、實驗結果:
七、實驗總結
通過實驗熟悉了單片機定時的外部計數原理以及編程方法,此次實驗發現我對定時器中斷方式的掌握有所欠缺不足,更傾向於使用查詢方式,對單片機定時方式還應該多花時間看看。
實驗七 定時器實驗
一.實驗目的:
1.熟悉MCS-51單片機定時/計數器的定時工作原理及使用方法;
2.進一步掌握定時/計數器的初始化和編程方法。
3.進一步掌握中斷程序的調試方法。
二.實驗內容:
初始化設置內部定時器T0工作在方式1,即作為16位定時器使用。定時時間為10ms,每10ms T0溢出中斷一次,將P1.0~1.7分別接發光二極管L1~L8。編寫程序模擬一時序控制裝置。開機后第一秒L1,L3亮,第二名L2,L4,亮,第三秒L5,L7亮,第4秒L6,L8亮以后重頭開始,一直循環。
三.實驗步驟:
1.理解TCON寄存器中TF0 TF1的作用,IE的EA和ET0的正確設置。
2.理解定時/計數器的定時功能的觸發原理.
3.編寫匯編程序,並生成HEX文件,燒入實驗板。
四.實驗參考程序:
LJMP INT_T0
ORG 0030H
MAIN:
MOV TMOD,#01H;T0選用定時器方式1
MOV TH0,#0D8H ;設置T0每10ms中斷一次
MOV TL0,#0F0H
MOV R0,#00H ;控制R0處內容
MOV R1,#100 ;控制中斷次數為100
SETB EA ;總中斷
SETB ET0 ;啟動定時器中斷
SETB TR0 ;啟動定時器
SJMP $
;-----------------------------中斷程序
INT_T0:
CLR TR0 ;關閉中斷
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0
DJNZ R1,EXIT ;中斷次數少於100返回main繼續執行 MOV R1,#100
MOV DPTR,#T_DATA
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A ;控制燈亮
INC R0
ANL 00,#03H
EXIT:
RETI ;返回
T_DATA: DB 0FAH,0F5H,0AFH,05FH
END
;說明:P2口接發光二極管
五、實驗過程
打開Keil uvisions軟件,做好編譯前准備,根據實驗要求編寫程序,計數器方式采用T0方式1,根據定時時間為10ms計算出2^16-10000=5536即D8F0H,按照要求計算出各個燈亮對應的編碼 0FAH,0F5H,0AFH,05FH,根據要求寫好主程序與循環程序(具體程序步驟四)。編譯檢查程序無誤,保存,執行。生成HEX文件,燒入實驗板,觀察發光二極管閃爍情況。
六、實驗結果
七、實驗總結
這次的單片機的定時實驗並不是很難,通過實驗我了解51單片機定時/計數器的定時工作原理及使用方法,也進一步掌握了中斷程序的調試方法,對程序的每一部分都有了更為清楚的掌握。
實驗八 數碼管實驗
一.實驗目的:
1.掌握51單片機前后台程序結構及編程方法;
2.了解數碼管段碼和位碼的控制。
二.實驗內容:
通過手動按鍵K3,使得數碼管0位從“0”-“f”顯示
通過手動按鍵K4,使得數碼管1位從“0”-“f”顯示
三.實驗步驟:
1.理解共陰極數碼管工作原理。
2.理解3-8譯碼器工作原理.
2.查詢按鍵小兜並使得內存單元加1。
4.依次顯示數碼管0,1位上變化的數據。
。
四.實驗參考程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_K3
ORG 0013H
LJMP INT_K4
ORG 0030H
MAIN:
SETB EA
SETB IE0
SETB IE1
CLR IT0
CLR IT1
SETB EX0
SETB EX1
MOV DPTR,#TAB
MOV R5,#0
MOV R6,#0
L1:
ACALL LOOP
SJMP L1
;--------------------------------------
INT_K3:
ACALL LOOP
JNB P3.2,INT_K3
INC R5
CJNE R5,#16,EIXT
MOV R5,#0
RETI
;--------------------------------------
INT_K4:
ACALL LOOP
JNB P3.3,INT_K4
INC R6
CJNE R6,#16,EIXT
MOV R6,#0
RETI
;--------------------------------------
LOOP:
MOV A,#11111111B
MOV P2,A
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV A,#11111011B
MOV P2,A
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
RET
;--------------------------------------
EIXT:
RETI
;--------------------------------------
DELAY:
MOV R1,#10
DELY1: MOV R2,#10
DJNZ R2,$
DJNZ R1,DELY1
RET
;--------------------------------------
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
;說明:P0口接數碼管端碼,3-8譯碼器選擇數碼管位碼。
五、實驗過程
打開Keil uvisions軟件,做好編譯前准備,根據實驗要求編寫程序,按鍵k3,k4分別控制數碼管0位和1位從0顯示到F,據要求編寫好代碼(具體程序步驟四)。編譯檢查程序無誤,保存,執行。生成HEX文件,燒入實驗板,按動按鍵觀察數碼管顯示情況。
六、實驗結果
七、實驗總結
通過實驗了解了共陰極數碼管工作原理,也發現了自己前面一些知識的掌握有所不足,還需要多多學習。
實驗九 串口實驗
一.實驗目的:
1.掌握51單片機串口原理及編程方法;
2.了解中斷服務的概念。
二.實驗內容:
通過編程,實現單片機開機發送“Welcome”,並等待接收串口的數字信息,顯示在數碼管的第0位。實現波特率115200bps的通信。
三.實驗步驟:
1.理解SCON寄存器中SM0,SM1,REN的設置。
2.學習根據fosc計算波特率,並設置定時器的工作方式和參數.
2.按中斷接收服務程序的模式,調試運行,打開串口助手,接收和發送單片機的內容。
4.生成HEX文件,燒入實驗板,打開並觀察數碼管顯示情況。
。
四.實驗參考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#20H ;定時器1 定時方式 方式2
MOV TH1,#0FDH ;3us
MOV TL1,#0FDH
SETB TR1 ;開啟T1定時器
MOV SCON,#52H
MOV DPTR,#T_TAB
;-------------------------------------發送
SEND: CLR A
MOVC A,@A+DPTR
INC DPTR
JZ RECEIVE ;
JNB TI,$ ;TI判斷輸出一個字符是否完成
CLR TI
MOV SBUF,A ;
SJMP SEND
;-------------------------------------接收
RECEIVE:JNB RI,$ ;RI判斷輸入一個字符是否完成
CLR RI
MOV A,SBUF ;
MOV B,#48
DIV AB
MOV A,B ;
ACALL DISPLAY
SJMP RECEIVE
;-------------------------------------顯示
DISPLAY:MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
RET
;-------------------------------------發送字段
T_TAB: DB 'WELCOME'
DB 0DH,0
;-------------------------------------接收譯碼字段
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
;說明:串口采用8位異步通信方式2
五、實驗過程
打開Keil uvisions軟件,做好編譯前准備,根據實驗要求編寫程序,采用定時器1方式2,根據波特率9600計算出9600=11059200/(32*12*(256-N))即N=253,即)0FDH,共陰極0-9對應的編碼為3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,根據要求寫好各個模塊內容(具體程序步驟四)。編譯檢查程序無誤,保存,執行。生成HEX文件,燒入實驗板。
六、實驗結果
七、實驗總結
通過學習了解了根據fosc計算波特率的算法,也再次鞏固了定時器的工作方式,同時也初步了解了單片機串口原理以及編程方法。
(實驗結果是圖復制不過來,就這樣)