西南科技大學(xué) 單片機(jī)實(shí)驗(yàn) 程序代碼_第1頁(yè)
西南科技大學(xué) 單片機(jī)實(shí)驗(yàn) 程序代碼_第2頁(yè)
西南科技大學(xué) 單片機(jī)實(shí)驗(yàn) 程序代碼_第3頁(yè)
西南科技大學(xué) 單片機(jī)實(shí)驗(yàn) 程序代碼_第4頁(yè)
西南科技大學(xué) 單片機(jī)實(shí)驗(yàn) 程序代碼_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)一 功能:使連接在MCS-51單片機(jī)P1.0引腳的LED閃爍。設(shè)計(jì)思路:開(kāi)始讓P1端口初值為11111111BP1.0求反軟件延時(shí)圖2.1 實(shí)驗(yàn)一程序流程圖 點(diǎn)亮LED需要約10 mA電流,此時(shí)LED兩端電壓差約2 V。因此,將LED的陰極通過(guò)一個(gè)電阻連接到P1.0引腳(電阻阻值約為200 W),陽(yáng)極連接到電源VCC(5 V)。 為便于觀察,交替的時(shí)間間隔不應(yīng)太小(建議選擇在0.5 s左右),由于該時(shí)間不要求嚴(yán)格精確,所以,可采用軟件延時(shí)的方法實(shí)現(xiàn)。 程序可采用圖2.1中的流程結(jié)構(gòu)。ORG 0000HAJMP STARTORG 0030HSTART:MOV P1,#0FFHLOOP:CPL

2、 P1.0ACALL DELAYAJMP LOOPDELAY:MOV R0,#99DL2:MOV R1,#99DL1:NOPNOPDJNZ R1,DL1DJNZ R0,DL2RETEND實(shí)驗(yàn)二 設(shè)計(jì)并調(diào)試一個(gè)雙字節(jié)無(wú)符號(hào)數(shù)乘法子程序。功能:雙字節(jié)無(wú)符號(hào)數(shù)乘法子程序。入口參數(shù):被乘數(shù)放在R7(高)和R6(低);乘數(shù)放在R5(高)和R4(低);積(片內(nèi)RAM中的連續(xù)4字節(jié))的首地址放在R0中。設(shè)計(jì)思路:圖2.1 雙字節(jié)無(wú)符號(hào)乘法示意圖積R6 ´ R4BAR5R4R6 ´ R5R7 ´ R5R7 ´ R4+´低字節(jié)高字節(jié)R7R6BABABAM1M0M

3、3M2由于MCS-51指令集中只有單字節(jié)無(wú)符號(hào)數(shù)乘法指令,因此需要將雙字節(jié)無(wú)符號(hào)數(shù)相乘變換成4次單字節(jié)無(wú)符號(hào)數(shù)相乘,才能利用乘法指令實(shí)現(xiàn)雙字節(jié)無(wú)符號(hào)數(shù)乘法計(jì)算。變換方法如圖2.1所示。MCS-51指令集中乘法指令的結(jié)果是固定存放在A和B中的,因此每次乘法操作后都須將結(jié)果保存在積中。所以應(yīng)首先將積的初值置0且在每次乘法指令結(jié)束后需要進(jìn)行2次加操作,分別將A和B加到積的對(duì)應(yīng)位置(注意:在兩次加法之間要考慮進(jìn)位)。ORG0000HAJMPSTARTADREQU20HORG0030HSTART:MOVR0,#ADRMOVR4,#14HMOVR5,#05HMOVR6,#35HMOVR7,#21HACAL

4、LDW_MULAJMP$DW_MUL:MOVR1,#04HCLE:MOVR0,#00HINCR0DJNZR1,CLEMOVR0,#ADRMU:MOVA,R4MOVB,R6MULABMOVR0,AMOVA,BINCR0ADDCA,R0MOVR0,AMOVA,R4MOVB,R7MULABADDCA,R0MOVR0,AMOVA,BINCR0ADDCA,R0MOVR0,AMOVA,R5MOVB,R6MULABDECR0ADDCA,R0MOVR0,AMOVA,BINCR0ADDCA,R0MOVR0,AMOVA,R5MOVB,R7MULABADDCA,R0MOVR0,AMOVA,BINCR0ADDCA,R

5、0MOVR0,ARETEND實(shí)驗(yàn)三:設(shè)計(jì)并調(diào)試一個(gè)將雙字節(jié)無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為壓縮BCD數(shù)的子程序。功能:雙字節(jié)無(wú)符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為壓縮BCD數(shù)子程序入口參數(shù):雙字節(jié)無(wú)符號(hào)二進(jìn)制數(shù)的地址放在R0中;存放轉(zhuǎn)換結(jié)果(BCD數(shù))的地址放在R1中。設(shè)計(jì)思路: 雙字節(jié)無(wú)符號(hào)二進(jìn)制數(shù)最大值為0FFFFH,對(duì)應(yīng)的十進(jìn)制數(shù)為65535,其壓縮BCD編碼表示為06H,55H,35H,所以轉(zhuǎn)換結(jié)果應(yīng)用3個(gè)字節(jié)存放。 Y=(D15D14D1D0) 2 = (0´2)+D15)´2+D14) ´2+) ´2+D1) ´2+D0) 2。Y0=(0´2)+D15

6、,Y1= Y0+D14,Y2= Y1+D13,Y15= Y14+D0,Y= Y15。Y0|BCD =( (0´2)+D15)|BCD,Y1|BCD =( Y0+D14)|BCD, Y15 |BCD = ( Y14+D0)|BCDY |BCD =Y15|BCD 算法:1、Y=02、Y=Y´2+Di(i =15,14,2,1,0)3、對(duì)Y進(jìn)行十進(jìn)制調(diào)整4、重復(fù)2、3步16次Y=Y´2+Di可用Y=Y+Y+C實(shí)現(xiàn)(Di首先放在C中),考慮到Y(jié)存放在3個(gè)字節(jié),應(yīng)分別加3次,且要考慮每次加法產(chǎn)生的C。ORG0000HAJMPSTARTORG0030HSTART:MOVSP,

7、#60HMOVR1,#25HMOVR0,#20HMOVR0,#43HINCR0MOVR0,#4AHACALLDW_BCDAJMP $DW_BCD:DECR0MOVA,R0MOVR6,AMOVA,R1MOVR7,AMOVR2,#3CLEAR:CLRAMOVR1,AINCR1DJNZR2,CLEARMOVR3,#16CLRCYIWEI:MOVA,R6MOVR0,AMOVA,R0RLCAMOVR0,AINCR0MOVA,R0RLCAMOVR0,AMOVR2,#3MOVA,R7MOVR1,AFANG:MOVA,R1ADDCA,R1DAAMOVR1,AINCR1DJNZR2,FANGDJNZR3,YIW

8、EIRETENDMOV R1,#25HMOV R0,#20HMOV R0,#0FFHINC R0MOV R0,#0FFH ;20H 21H=FFHmov r1,#0efhACALL DW_BCDAJMP $DW_BCD:DEC R0 MOV A,R0MOV R6,AMOV A,R1MOV R7,A ;R7=25h R6=20HMOV R2,#3CLEAR:CLR AMOV R1,AINC R1DJNZ R2,CLEAR;25H 26H 27H=00MOV R3,#16CLR CYIWEI:MOV A,R6MOV R0,AMOV A,R0RLC AMOV R0,AINC R0MOV A,R0RL

9、C AMOV R0,AMOV A,R7MOV R1,AMOV R2,#3FANG: MOV A,R1ADDC A,R1DA A;16進(jìn)制到10 進(jìn)制的轉(zhuǎn)化 MOV R1,AINC R1DJNZ R2,FANGDJNZ R3,YIWEIRETEND實(shí)驗(yàn)四:利用外部中斷輸入引腳(中斷方式)控制步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)。要求:每產(chǎn)生1次中斷,步進(jìn)電機(jī)只能步進(jìn)1步。使用INT0的中斷服務(wù)程序控制步進(jìn)電機(jī)正向步進(jìn);使用INT1中斷服務(wù)程序控制步進(jìn)電機(jī)反向步進(jìn)。設(shè)計(jì)思路: 主程序在完成對(duì)INT0和INT1的設(shè)置后,可進(jìn)入死循環(huán)(等待中斷請(qǐng)求)。 為便于實(shí)驗(yàn)觀察和操作,設(shè)INT0和INT1中斷觸發(fā)方式為邊沿。 步進(jìn)電

10、機(jī)的轉(zhuǎn)動(dòng)控制由外部中斷的服務(wù)程序來(lái)實(shí)現(xiàn)。 當(dāng)前步進(jìn)電機(jī)的相位通電狀態(tài)信息可以使用片內(nèi)RAM中的一個(gè)字節(jié)單元來(lái)存儲(chǔ)。ORG0000HLJMPRESETORG0003H;外部中斷0 服務(wù)程序入口LJMPINT_EX0ORG000BH;定時(shí)器/計(jì)數(shù)器0 溢出中斷服務(wù)程序入口 RETIORG0013H;外部中斷1 服務(wù)程序入口LJMPINT_EX1ORG001BH;定時(shí)器/計(jì)數(shù)器1 溢出中斷服務(wù)程序入口 RETIORG0023H;串行口中斷服務(wù)程序入口RETIORG0040H;復(fù)位處理程序RESET:MOVSP,#67HSETBIT0 SETBIT1 SETBEX0 SETBEX1 MOV30H,#1

11、1110111B CLRA ;累加器A清零SETBEA MAIN:SJMPMAININT_EX0:;使用INT0的中斷服務(wù)程序控制步進(jìn)電機(jī)正向步進(jìn)PUSHACC MOVA,30H RRA ;累加器A的內(nèi)容向右循環(huán)移位一位MOV30H,A MOVP1,A POPACC RETI INT_EX1:;使用INT1中斷服務(wù)程序控制步進(jìn)電機(jī)反向步進(jìn)PUSHACC MOVA,30H RLA ;累加器A的內(nèi)容向左循環(huán)移位一位MOV30H,A MOVP1,A POPACC RETI END另一種實(shí)驗(yàn)方法:ORG0000H;復(fù)位入口LJMPRESETORG0003H;外部中斷0 服務(wù)程序入口LJMPINT_EX

12、0ORG000BH;定時(shí)器/計(jì)數(shù)器0 溢出中斷服務(wù)程序入口 RETIORG0013H;外部中斷1 服務(wù)程序入口LJMPINT_EX1ORG001BH;定時(shí)器/計(jì)數(shù)器1 溢出中斷服務(wù)程序入口 RETIORG0023H;串行口中斷服務(wù)程序入口RETIORG040H;復(fù)位處理程序RESET:MOVSP,#67H SETBIT0 SETBIT1 SETBEX0 SETBEX1 MOV30H,#11110111B CLRA SETBEA MAIN:SJMPMAIN;-使用INT0的中斷服務(wù)程序控制步進(jìn)電機(jī)正向步進(jìn)INT_EX0:MOV R0,#00H ;正轉(zhuǎn)至TABLE取碼指針初值 ABC: MOV A

13、, R0 ;至TABLE取碼 MOV DPTR, #TABLE ;存表 MOVC A,A+DPTR ;取表代碼 JZ INT_EX0 ;是否取到結(jié)束碼(00H)? MOV P0, A ; 輸出至P0,正轉(zhuǎn) INC R0 ;取下一個(gè)碼 JMP ABC ;轉(zhuǎn)至Z_M處,循環(huán) RETI;-使用INT1中斷服務(wù)程序控制步進(jìn)電機(jī)反向步進(jìn)INT_EX1:MOV R0, #05 ;反轉(zhuǎn)至TABLE取碼指針初值 ABC1: MOV A, R0 ;至TABLE取碼 MOV DPTR, #TABLE ;存表 MOVC A, A+DPTR ;取表代碼 JZ INT_EX1 ;是否取到結(jié)束碼(00H)? MOV P0

14、, A ; 輸出至P0, 反轉(zhuǎn) INC R0 ;取下一個(gè)碼 JMP ABC1 ; 轉(zhuǎn)至F_M1處,循環(huán) RETI ;反轉(zhuǎn)子程序 TABLE: DB 0FCH, 0F9H, 0F3H, 0F6H ;正轉(zhuǎn) DB 00H ;正轉(zhuǎn)結(jié)束碼 DB 0F7H, 0F3H, 0FBH, 0F9H ; 反轉(zhuǎn) DB 0FDH, 0FCH, 0FEH, 0F6H DB 00H ;反轉(zhuǎn)結(jié)束碼 END ;程序結(jié)束實(shí)驗(yàn)五:利用定時(shí)/計(jì)數(shù)器測(cè)量電動(dòng)機(jī)的轉(zhuǎn)速。使用T1作為定時(shí)器(定時(shí)時(shí)間為50毫秒),T0作為計(jì)數(shù)器(計(jì)數(shù)由電機(jī)測(cè)速電路產(chǎn)生的脈沖個(gè)數(shù),每轉(zhuǎn)4個(gè)脈沖),每1秒時(shí)間后,讀出T0的值(讀出后須將T0清0),將該值(速

15、度值*4)顯示到LCM顯示器上(顯示子程序/函數(shù)由實(shí)驗(yàn)庫(kù)文件提供)。本次實(shí)驗(yàn)程序需要使用實(shí)驗(yàn)庫(kù)文件(LCMDRV_12864.LIB)。該庫(kù)中的子程序/函數(shù)占用單片機(jī)片內(nèi)RAM中地址為18H20H的單元,因此實(shí)驗(yàn)程序不能使用這些單元。如果用匯編編寫(xiě)實(shí)驗(yàn)程序,必須先用$INCLUDE (LCMDRV_12864.INC )指令加載實(shí)驗(yàn)庫(kù)頭文件REFRESHDISPEQU08H;刷新顯示標(biāo)志SPEED_CNTHEQU30H;速度脈沖計(jì)數(shù)高8位SPEED_CNTLEQU31H;速度脈沖計(jì)數(shù)低8位SECOND_CNTEQU32H;秒計(jì)數(shù)VAR_ENDEQU32H;最后一個(gè)字節(jié)變量的位置,STACK_I

16、NIEQUVAR_END+1;須保證足夠的空間實(shí)驗(yàn)程序架構(gòu)(匯編):$INCLUDE(LCMDRV_12864.INC);包含庫(kù)程序定義ORG0000H;復(fù)位入口LJMPRESETORG0003H;外部中斷0 服務(wù)程序入口RETIORG000BH;定時(shí)器/計(jì)數(shù)器0 溢出中斷服務(wù)程序入口 RETIORG0013H;外部中斷1 服務(wù)程序入口RETIORG001BH;定時(shí)器/計(jì)數(shù)器1 溢出中斷服務(wù)程序入口 LJMPINT_T1ORG0023H;串行口中斷服務(wù)程序入口RETIORG040H;復(fù)位處理程序RESET:MOVSP,#60H;設(shè)置棧底指針MOVR7,#00H;初始化顯示器(不顯示光標(biāo))LCA

17、LL_LCM_InitSETBET1;此處添加設(shè)置中斷許可和優(yōu)先的指令(ET1, PT1)SETBPT1MOVTMOD,#00010110B;定時(shí)/計(jì)數(shù)設(shè)置 MOVTH1,#3CH;此處添加設(shè)置定時(shí)/計(jì)數(shù)器的指令(TMOD, THx, TLx)MOVTL1,#0B0HMOVTH0,#0MOVTL0,#0CLRREFRESHDISP;清刷新顯示標(biāo)志MOVSECOND_CNT,#20;啟動(dòng)內(nèi)部定時(shí)SETBTR1SETBTR0;此處添加啟動(dòng)定時(shí)/計(jì)數(shù)的指令(TRx)SETBEA;開(kāi)中斷 MAIN:JNBREFRESHDISP,$;判斷是否需要刷新顯示CLRREFRESHDISP;清刷新顯示標(biāo)志MOV

18、R7,#01H;從第2行第8列開(kāi)始顯示速度值(5位數(shù)值)MOVR5,#07HMOVR2,SPEED_CNTHMOVR3,SPEED_CNTLCALL_LCM_DispUIntXYSJMPMAIN;內(nèi)部定時(shí)中斷服務(wù)程序 *INT_T1:MOVTH1,#3CH;此處添加重置定時(shí)常數(shù)的指令MOVTL1,#0B0HMOVA,R7;此處添加保護(hù)現(xiàn)場(chǎng)內(nèi)容的指令(如果有的話)PUSHACCINCR7CJNER7,#20,LLEND;判斷一秒鐘時(shí)間到的指令,沒(méi)到時(shí)間則跳轉(zhuǎn)恢復(fù)現(xiàn)場(chǎng),MOVSPEED_CNTL, TL0;記錄速度檢測(cè)計(jì)數(shù)(供主程序顯示用)MOVSPEED_CNTH, TH0MOVTL0, #00

19、;速度檢測(cè)計(jì)數(shù)歸零MOVTH0, #00SETBREFRESHDISP;設(shè)置刷新顯示標(biāo)志 (控制主程序刷新顯示)LLEND:POPACC;此處添加恢復(fù)現(xiàn)場(chǎng)內(nèi)容的指令(如果有的話)MOVR7,ARETIEND實(shí)驗(yàn)六:利用8155實(shí)現(xiàn)并行I/O擴(kuò)展。 利用P1端口訪問(wèn)CAT24WC02(兼容AT24C02)。程序一: 使用8155實(shí)現(xiàn)對(duì)并行接口的擴(kuò)展。利用8155的PA口輸入D1區(qū)KEY組各按鍵的狀態(tài)信息,然后將該狀態(tài)信息通過(guò)單片機(jī)的P1口輸出到D1區(qū)LED組顯示。主程序在完成各項(xiàng)初始化設(shè)置后,可進(jìn)入一死循環(huán),在該循環(huán)里面不斷的讀取8155 PA口的信息并將其輸出到單片機(jī)的P1口。ORG0000H

20、AJMPMAINORG0030HMAIN:MOVDPTR,#7F00HMOVA,#11110000BMOVXDPTR,ALOOP:MOVDPTR,#07F01HMOVXA,DPTRMOVP1,ASJMPLOOPEND程序二:先將單片機(jī)內(nèi)部RAM中30H37H單元的值復(fù)制到CAT24WC02中的00H07H單元。然后又將這8個(gè)數(shù)從CAT24WC02中復(fù)制到單片機(jī)內(nèi)部RAM的40H47H單元中 CAT24WC02的器件地址:0A0H CAT24WC02芯片手冊(cè)CAT24WCxxx.pdf實(shí)驗(yàn)七:利用ADC0809/DAC0832實(shí)現(xiàn)模擬電壓信號(hào)的采集與輸出。使用T1作為定時(shí)器(定時(shí)時(shí)間為50毫秒)

21、,每1秒時(shí)間后,啟動(dòng)ADC0809轉(zhuǎn)換,在轉(zhuǎn)換結(jié)束后(觸發(fā)外部中斷)讀出A/D轉(zhuǎn)換值,將該值輸出到DAC0832,并同時(shí)顯示到LCM顯示器上(顯示子程序/函數(shù)由實(shí)驗(yàn)庫(kù)文件提供)。本次實(shí)驗(yàn)程序需要使用實(shí)驗(yàn)庫(kù)文件(LCMDRV_12864.LIB)。該庫(kù)中的子程序/函數(shù)占用單片機(jī)片內(nèi)RAM中地址為18H20H的單元,因此實(shí)驗(yàn)程序不能使用這些單元。如果用匯編編寫(xiě)實(shí)驗(yàn)程序,必須先用$INCLUDE (LCMDRV_12864.INC )指令加載實(shí)驗(yàn)庫(kù)頭文件設(shè)計(jì)思路: 主程序在完成對(duì)INT1和T1的設(shè)置后,可進(jìn)入死循環(huán)(等待中斷請(qǐng)求)。 在T1的中斷服務(wù)程序中需要使用一存儲(chǔ)單元對(duì)T1的中斷次數(shù)進(jìn)行計(jì)數(shù),

22、當(dāng)計(jì)數(shù)次數(shù)達(dá)20次時(shí),意味著定時(shí)1秒時(shí)間到(參見(jiàn)實(shí)驗(yàn)五),此時(shí)才啟動(dòng)一次AD轉(zhuǎn)換(通過(guò)向ADC0809的一次寫(xiě)操作實(shí)現(xiàn))。 AD轉(zhuǎn)換的結(jié)束信號(hào)作為中斷請(qǐng)求(INT1)。在對(duì)該中斷的響應(yīng)和服務(wù)時(shí),才讀出本次AD轉(zhuǎn)換的結(jié)果值,該值又作為DA轉(zhuǎn)換的值(向DAC0832寫(xiě))。 為便于理解,數(shù)值在顯示前應(yīng)進(jìn)行BCD轉(zhuǎn)換(庫(kù)文件自動(dòng)完成轉(zhuǎn)換)。$INCLUDE(LCMDRV_12864.INC);包含庫(kù)程序定義REFRESHDISPEQU08H;刷新顯示標(biāo)志AD_VALEQU30H;AD轉(zhuǎn)換結(jié)果值SECOND_CNTEQU31H;秒計(jì)數(shù)VAR_ENDEQU31H;最后一個(gè)字節(jié)變量的位置,STACK_INIEQUVAR_END+1;須保證足夠的空間ORG0000H;復(fù)位入口LJMPRESETORG0003H;外部中斷0 服務(wù)程序入口RETIORG000BH;定時(shí)器/計(jì)數(shù)器0 溢出中斷服務(wù)程序入口 RETIORG0013H;外部中斷1 服務(wù)程序入口LJMPINT_INT1ORG001BH;定時(shí)器/計(jì)數(shù)器1 溢出中斷服務(wù)程序入口 LJMPINT_T1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論