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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ì)思路:圖 2.1 實(shí)驗(yàn)一程序流程圖 點(diǎn)亮 LED 需要約 10 mA 電流,此時(shí)LED 兩端電壓差約 2 V 。因此,將 LED 的陰極通過(guò)一個(gè)電阻連接到 P1.0 引腳 (電阻阻值約為 200 ),陽(yáng)極連接到 電源 VCC(5 V)。 為便于觀察,交替的時(shí)間間隔不應(yīng)太 ?。ńㄗh選擇在 0.5 s 左右),由于該 時(shí)間不要求嚴(yán)格精確,所以,可采用 軟件延時(shí)的方法實(shí)現(xiàn)。 程序可采用圖 2 .1 中的流程結(jié)構(gòu)。 ORG 0000HAJMP STARTORG 0030HSTART: MOV P1,#0FFHLOOP:

2、CPL P1.0ACALL DELAYAJMP LOOP DELAY: MOV R0,#99 DL2: MOV R1,#99 DL1: 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ì)思路:R7R6R5R4BAR6 R4BAR7 R4BAR6 R5+ BAR7 R5M3M2M1M0高字節(jié)低字節(jié)由于 MCS-51 指令集中只有單字 節(jié)無(wú)符號(hào)數(shù)乘法

3、指令,因此需要將 雙字節(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圖 2.1 雙字節(jié)無(wú)符號(hào)乘法示意圖且在每次乘法指令結(jié)束后需要進(jìn)行在兩次加法之間要考慮進(jìn)位) 。ORG 0000HAJMP STARTADR EQU 20HORG 0030HSTART:MOVMOV2 次加操作,分別將 A 和 B 加到積的對(duì)應(yīng)位置(注意:MOVMOVMOVACALLAJMP DW_MUL:MOV

4、CLE:MOVINC R0DJNZMOVMU:MOVMOVMULMOVMOVINC R0 ADDC MOV MOV MOV MUL ADDC MOV MOVINC R0 ADDC MOV MOV MOV MUL DEC ADDCR0,#ADR R4,#14H R5,#05H R6,#35H R7,#21H DW_MUL$R1,#04HR0,#00HR1,CLER0,#ADRA,R4B,R6 AB R0,AA,BA,R0R0,AA,R4B,R7 ABA,R0 R0,A A,BA,R0 R0,AA,R5B,R6ABR0A,R0MOVR0,AMOVA,BINC R0ADDCA,R0MOVR0,AMO

5、VA,R5MOVB,R7MULABADDCA,R0MOVR0,AMOVA,BINC R0ADDCA,R0MOVR0,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=(D 15D14D1D0) 2 = (0 2)+D 15) 2+D

6、14) 2+) 2+D1) 2+D0) 2。Y 0=(0 2)+D 15,Y 1= Y 0+D 14, Y 2= Y1+D13, ,Y15= Y 14+D 0, Y= Y 15。Y 0|BCD =( (0 2)+D 15)|BCD , Y 1|BCD =( Y 0+D 14)| BCD, , Y15 |BCD = ( Y 14+D 0)|BCDY | BCD =Y 15|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 存放在

7、3 個(gè)字節(jié), 應(yīng)分別加 3 次,且要考慮每次加法產(chǎn)生的 C。ORG0000HAJMPSTARTORG0030HSTART:MOVSP,#6MOVR1,#25HMOVR0,#20HMOVR0,#43HINCR0MOVR0,#4AHACALL DW_BCDAJMP $DW_BCD:DEC R0MOVA,R0MOVR6,AMOVA,R1MOVR7,AMOVR2,#3CLEAR:CLRAMOVR1,AINCR1DJNZR2,CLEARMOVR3,#16CLRCYIWEI: MOVA,R6MOVR0,AMOVA,R0RLCAMOVR0,AINCR0MOVA,R0RLCAMOVR0,AMOVR2,#3MO

8、VA,R7MOVR1,AFANG: MOV A,R1ADDCA,R1DA AMOVR1,AINCR1DJNZR2,FANGDJNZR3,YIWEIRETENDMOV R1,#25HMOV R0,#20HMOV R0,#0FFHINC R0;20H 21H=FFHMOV R0,#0FFH mov r1,#0efhACALL DW_BCDAJMP $DW_BCD: DEC R0MOV 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

9、 R3,#16CLR CYIWEI: MOV A,R6MOV R0,AMOV A,R0RLC AMOV R0,AINC R0MOV A,R0RLC 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ī)

10、反向步進(jìn)。設(shè)計(jì)思路: 主程序在完成對(duì) INT0 和 INT1 的設(shè)置后,可進(jìn)入死循環(huán)(等待中斷請(qǐng)求) 。 為便于實(shí)驗(yàn)觀察和操作,設(shè) INT0 和 INT1 中斷觸發(fā)方式為邊沿。 步進(jìn)電機(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ù)程序入口RE

11、TIORG0023H;串行口中斷服務(wù)程序入口RETIORG0040H;復(fù)位處理程序RESET:MOV SP, #67HSETB IT0SETB IT1SETB EX0SETB EX1MOV 30H,#11110111BCLR A;累加器 A 清零SETB EAMAIN: SJMP MAININT_EX0:;使用 INT0 的中斷服務(wù)程序控制步進(jìn)電機(jī)正向步進(jìn)PUSHACCMOVA,30HRR A;累加器 A 的內(nèi)容向右循環(huán)移位一位MOV 30H,AMOV P1,APOP ACCRETIINT_EX1:;使用INT1 中斷服務(wù)程序控制步進(jìn)電機(jī)反向步進(jìn)PUSHACCMOVA,30HRL A;累加器

12、A 的內(nèi)容向左循環(huán)移位一位MOV30H,AMOVP1,APOPACCRETIEND另一種實(shí)驗(yàn)方法 :ORG0000H;復(fù)位入口LJMPRESETORG0003H;外部中斷 0 服務(wù)程序入口LJMPINT_EX0ORG000BH;定時(shí)器 / 計(jì)數(shù)器 0 溢出中斷服務(wù)程序入口RETIORG0013H;外部中斷 1 服務(wù)程序入口LJMPINT_EX1ORG001BH;定時(shí)器 / 計(jì)數(shù)器 1 溢出中斷服務(wù)程序入口RETIORG0023H;串行口中斷服務(wù)程序入口RETIORG040H;復(fù)位處理程序RESET: MOV SP,#67HSETBIT0SETBIT1SETBEX0SETBEX1MOV30H,#

13、11110111BCLRASETBEAMAIN: SJMP MAIN使用 INT0 的中斷服務(wù)程序控制步進(jìn)電機(jī)正向步進(jìn)INT_EX0:MOVR0,#00H;正轉(zhuǎn)至 TABLE 取碼指針初值A(chǔ)BC: MOVA, R0;至 TABLE 取碼MOVDPTR, #TABLE;存表MOVCA,A+DPTR;取表代碼JZINT_EX0;是否取到結(jié)束碼( 00H )?MOVP0, A; 輸出至 P0,正轉(zhuǎn)INCJMPR0ABC;取下一個(gè)碼;轉(zhuǎn)至 Z_M 處,循環(huán)RETI 使用 INT1 中斷服務(wù)程序控制步進(jìn)電機(jī)反向步進(jìn)INT_EX1:MOV R0, #05;反轉(zhuǎn)至 TABLE 取碼指針初值A(chǔ)BC1: MOV

14、 MOV MOVC JZ MOV INC JMP RETIA, R0DPTR, #TABLE A, A+DPTRINT_EX1P0, AR0ABC1;至 TABLE 取碼;存表;取表代碼;是否取到結(jié)束碼( 00H) ?; 輸出至 P0, 反轉(zhuǎn);取下一個(gè)碼; 轉(zhuǎn)至 F_M1 處,循環(huán);反轉(zhuǎn)子程序TABLE: DBDB0FCH, 0F9H, 0F3H, 0F6H ;正轉(zhuǎn)00H; 正轉(zhuǎn)結(jié)束碼DB 0F7H, 0F3H, 0FBH, 0F9H ; 反轉(zhuǎn)DB0FDH, 0FCH, 0FEH, 0F6HDB00H; 反轉(zhuǎn)結(jié)束碼END;程序結(jié)束實(shí)驗(yàn)五:利用定時(shí) /計(jì)數(shù)器測(cè)量電動(dòng)機(jī)的轉(zhuǎn)速。使用 T1作為定時(shí)器

15、 (定時(shí)時(shí)間為 50毫秒),T0作為計(jì)數(shù)器(計(jì)數(shù)由電機(jī)測(cè)速電路產(chǎn)生的脈沖個(gè)數(shù),每轉(zhuǎn) 4 個(gè)脈沖),每 1 秒時(shí)間后,讀出 T0 的值(讀出后須將 T0 清 0),將該值(速度值 *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;刷

16、新顯示標(biāo)志SPEED_CNTH EQU 30H;速度脈沖計(jì)數(shù)高 8 位SPEED_CNTL EQU 31H;速度脈沖計(jì)數(shù)低 8 位SECOND_CNTEQU32H;秒計(jì)數(shù)VAR_ENDEQU32H;最后一個(gè)字節(jié)變量的位置,STACK_INIEQUVAR_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ù)程序入口RETIORG001

17、BH;定時(shí)器 /計(jì)數(shù)器 1 溢出中斷服務(wù)程序入口LJMPINT_T1ORG0023H;串行口中斷服務(wù)程序入口RETIORG 040H;復(fù)位處理程序RESET: MOV SP,#60HMOV R7,#00HLCALL _LCM_Init;設(shè)置棧底指針;初始化顯示器 (不顯示光標(biāo) )SETB ET1;此處添加設(shè)置中斷許可和優(yōu)先的指令(ET1, PT1)SETB PT1MOV TMOD,#00010110B;定時(shí) /計(jì)數(shù)設(shè)置MOV TH1,#3CH;此處添加設(shè)置定時(shí) /計(jì)數(shù)器的指令 (TMOD, THx, TLx)MOV TL1,#0B0HMOV TH0,#0MOV TL0,#0CLR REFRES

18、HDISP;清刷新顯示標(biāo)志MOVSETBSECOND_CNT,#20;啟動(dòng)內(nèi)部定時(shí)TR1SETBTR0;此處添加啟動(dòng)定時(shí) /計(jì)數(shù)的指令 (TRx)SETBEA;開(kāi)中斷MAIN: JNB REFRESHDISP,$;判斷是否需要刷新顯示CLR REFRESHDISP;清刷新顯示標(biāo)志MOV R7,#01H;從第 2 行第 8 列開(kāi)始顯示速度值 (5 位數(shù)值 )MOV R5,#07HMOV R2,SPEED_CNTHMOV R3,SPEED_CNTLCALL _LCM_DispUIntXYSJMP MAIN;內(nèi)部定時(shí)中斷服務(wù)程序INT_T1:MOVTH1,#3CH;此處添加重置定時(shí)常數(shù)的指令MOVT

19、L1,#0B0HMOVA,R7;此處添加保護(hù)現(xiàn)場(chǎng)內(nèi)容的指令 (如果有的話(huà) )PUSHACCINC R7CJNER7,#20,LLEND;判斷一秒鐘時(shí)間到的指令 ,沒(méi)到時(shí)間則跳轉(zhuǎn)恢復(fù)現(xiàn)場(chǎng)MOVSPEED_CNTL, TL0;記錄速度檢測(cè)計(jì)數(shù) (供主程序顯示用 )MOVSPEED_CNTH, TH0MOVTL0, #00;速度檢測(cè)計(jì)數(shù)歸零MOVTH0, #00SETBREFRESHDISP;設(shè)置刷新顯示標(biāo)志 (控制主程序刷新顯示 )LLEND:POP ACCMOV R7,ARETIEND;此處添加恢復(fù)現(xiàn)場(chǎng)內(nèi)容的指令 (如果有的話(huà) )實(shí)驗(yàn)六:利用 8155 實(shí)現(xiàn)并行 I/O 擴(kuò)展。利用 P1 端口訪

20、問(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 口。ORG 0000HAJMP MAINORG 0030HMAIN: MOV DPTR,#7F00HMOV A,#11110000BMOVX DPTR,ALOOP: MOV DPTR,#07F01HMOVX A,DPTRMOV P1,A SJMP

21、 LOOP END程序二:先將單片機(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毫秒),每1秒時(shí)間后,啟動(dòng) ADC0809 轉(zhuǎn)換, 在轉(zhuǎn)換結(jié)束后(觸發(fā)外部中斷)讀出 A/D 轉(zhuǎn)換值,將該值輸出到 DAC0832 ,并同時(shí) 顯示到 LC

22、M 顯示器上(顯示 子程序 /函數(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ù),當(dāng)計(jì)數(shù) 次數(shù)達(dá) 20 次時(shí),意味著定時(shí) 1 秒時(shí)間到(參見(jiàn)實(shí)驗(yàn)

23、五) ,此時(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_INI EQUVAR_END+1;須保證足夠的空間ORG0000H;復(fù)位入口LJMPRESETORG0003H;外部中斷 0 服務(wù)程序入口RETIORG000BH;定時(shí)器 /計(jì)數(shù)器 0 溢出中斷服務(wù)程序入口RETIORG0013H;外部中斷 1 服務(wù)程序入口LJMPINT_INT1ORG001BH;定時(shí)器 /計(jì)數(shù)器 1 溢出中斷服務(wù)程序入口LJMPINT_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論