第一篇:云南大學單片機實驗6.6
實驗6.6 航標燈實驗
一、實驗目的與要求
用實驗電路板上的PIC16F877A控制一個發(fā)光二極管來模擬航標燈工作。模擬航標燈以精確的1Hz頻率閃爍,其中關閉時間為0.5s,發(fā)光時間為0.5s。要求1Hz閃爍的長期誤差達到20ppm以下。
二、實驗內(nèi)容
1、硬件設計思路
0.5s或1s的定時屬于一個較長時間的定時,根據(jù)本章前半部分的分析,如果TMR1正常工作在定時模式,使用單片機指令周期作為計數(shù)脈沖頻率,則由于外接晶體頻率較高(通常采用4MHz或頻率更高的外接晶體),很難實現(xiàn)長時間的定時,因此,本實驗通過TMR1的外接晶體振蕩器產(chǎn)生的低頻信號作為TMR1的計數(shù)脈沖,從而提高計時精度和降低軟件開發(fā)的難度。
出于對成本、通用性和軟件開發(fā)難度的考慮,本實驗選用了32.768kHz的鐘表晶體作為外接低頻晶體。從這種低頻鐘表晶體的數(shù)據(jù)手冊可以發(fā)現(xiàn),即使是低成本的鐘表晶體的精度和長期穩(wěn)定性也能達到10ppm以上,為達到實驗精度要求提供了物質(zhì)保障。
2、軟件設計思路
無論采用哪一個定時/計數(shù)器時,向計數(shù)器TMR0、TMR1、或TMR2寄存器寫入初值的操作都將引起預分頻器的清零,從而造成從而造成不確定且無法矯正的定時誤差。因此,為了達到高精度定時的目的,最好的方法是不使用預分頻器。但不使用預分頻器有可能造成定時時間太短,解決該問題的辦法之一是用軟件對達到定時時間的次數(shù)計數(shù),這樣做又會增加軟件的負擔。通過外接低頻晶體來降低計數(shù)脈沖頻率是解決上述矛盾的另一種有效方法。以32.768kHz鐘表晶體為例,在不使用預分頻器的條件下,TMR1溢出的最長時間是2^6/32.768kHz=2s,完全可以達到本實驗0.5s定時的要求。
通過T1CON寄存器啟用TMR1的內(nèi)置低頻振蕩器后,如果不對TMR1寄存器賦初值則TMR1中斷時間間隔為2s。當需要每秒一次喚醒單片機時,計數(shù)的剩余計數(shù)值為最大值的一半,只需要對TMR1設置初值為8000H;當每0.5s喚醒時,考慮剩余計數(shù)值為最大值的四分之一,TMR1的初值為0C000H。為了達到0.5s改變一次航標燈開關狀態(tài)的要求,程序需要在中斷對TMR1寄存器賦初值0C000H。
根據(jù)本章第三小節(jié)中關于為16位的TMR1寄存器賦初值問題的描述,為了防止在對TMR1的高或低兩個字節(jié)TMR1H和TMR1L賦初值的間隙,發(fā)生TMR1L向TMR1H進位從而造成錯誤,對TMR1H和TMR1L賦初值時應該暫停TMR1的工作。然后采用加法分別對高低兩個字節(jié)的寄存器賦初值。但由于本實驗采用了32.768kHz的計數(shù)脈沖頻率,上述問題將不再存在,這是因為需要賦的初值為0C000H,低字節(jié)是0,這帶來兩方面的好處:
(1)由于低字節(jié)初值是0,距離低字節(jié)向高字節(jié)進位還很遠,幾乎不可能產(chǎn)生在高低字節(jié)賦值的間隙進位的情況。所以,在本例中賦初值時不用暫停TMR1計數(shù),從而大大提高了計時精度。(2)采用加法對TMR1L和TMR1H賦初值時,TMR1L可以不用做加法,進而避免了加法中產(chǎn)生的進位問題。
綜上,采用外接32.768kHz鐘表晶體的方法,完全消除了預分頻器和賦初值暫停這兩個產(chǎn)生TMR1計時誤差的主要來源。這樣,定時精度僅受晶體制造精度的影響,這種影響足以達到使航標燈的定時精度降低到20ppm以上的精度。
三、實驗步驟及結(jié)果
1.從本實驗套件提供的元器件中找出32.768kHz的鐘表晶體,器件外形為圓柱狀。將其焊接在印制電路板上標有Y的位置。
2.從實驗套件提供的元器件中找出2只33pF的電容,將其焊接在鐘表晶體兩側(cè)標有CY1和CY2的位置上。
3.引腳功能選擇跳線器JP_RD用于選擇單片機PORTD的硬件連接方式。當這組跳線器跨接在左邊時,PORTD的引腳將被連接到數(shù)碼管上,用來驅(qū)動兩只數(shù)碼管顯示數(shù)字;當跳線器跨接在右邊位置上時,PORTD的引腳可用于驅(qū)動分離的發(fā)光二極管LED0~LED7,本實驗僅需要一個發(fā)光二極管LED0,將其對應的跳線器連接到右邊的位置上。
4.在PC機的缺省路徑上安裝MPLAB及ICD3的驅(qū)動程序。
5.從開始菜單運行MPLAB,打開MPLAB后,在Project菜單中選擇Project Wizard。單擊彈出的工程向?qū)Т翱谥械摹跋乱徊健卑粹o;在工程向?qū)У谝徊剑⊿top One)的窗口中選擇本工程要使用的單片機型號——PIC16F877A;在工程向?qū)У诙浚⊿tep Two)的窗口中選擇合適的編譯工具包——Microchip MPASM Toolsuite,窗口中部顯示了這個編譯工具包內(nèi)的工具,單擊任何一個工具就會在窗口下部顯示這個工具所在的路徑,如果MPLAB安裝在缺省路徑則無需修改這些工具的路徑;在工程向?qū)У谌剑⊿tep Three)的窗口中給新創(chuàng)建工程命名并選擇新創(chuàng)建的工程所在的路徑;在工程向?qū)У谒牟剑⊿top Three)的窗口中,可以將能重復使用的程序文件拷貝到本工程中。完成以上四步后就輸入了創(chuàng)建新工程所需的所有參數(shù),工程向?qū)⒃谧詈蟮目偨Y(jié)窗口中顯示這些參數(shù),核實無誤后單擊 “完成”即可完成新工程的創(chuàng)建工作。
6.配置單片機的基本工作方式。單擊MPLAB開發(fā)環(huán)境中單擊Configure菜單下Configuration Bits,在彈出的配置位窗口中首先去掉Configuration Bits set code復選框前面的小鉤。接著逐一設置窗口中提供的單片機配置位:將振蕩器(Oscillator)類型設置為“XT”;“看門狗(Watchdog Timer)”應該關閉,將其設置為“OFF”;將上電復位定時器(Power Up Timer)關閉;將電壓檢測電路(Brown Out Detect)關閉;低電壓編程(Low Voltage Program)設置為“Disabled”;將數(shù)據(jù)EEPROM讀保護(Data EE Read Protect)關閉;將用戶程序Flash寫保護(Flash Program Write)設置為“Write Protection Off”;將代碼保護(Code Protect)關閉。完成以上設置后關閉配置位窗口。
7.將仿真器ICD3和實驗實驗套件電路板相連。連接時注意仿真器連接電纜的第一腳應該和實驗套件的第一腳相連。
8.將仿真器和PC機用USB連接起來,在Debugger菜單Select Tool選擇調(diào)試工具為ICD3.9.將外接電源適配器的一端連接在200v的市電插座上,另一端連接在實驗電路板套件上供電。10.使用軟件模擬器測試代碼。在MPLAB開發(fā)環(huán)境的Debugger菜單中選擇MPLAB SIM,此時MPLAB環(huán)境的外觀和菜單項都會發(fā)生變化。
11.選擇File菜單下的New命令新建一個匯編語言文件,輸入按本實驗要求所寫的代碼,保存時注意選擇文件的類型為匯編語言源文件。
12.用右鍵單擊MPLAB的工程管理窗口(可以用View菜單下Project打開或關閉),從彈出的快捷菜單中選擇Add Files.....,將第四步編寫好的匯編文件加入工程中。
13.編譯工程。在Project菜單中選擇Build All。如果有錯誤,則根據(jù)輸出窗口的提示改正之,直到完全正確。
14.單擊Program Target Device快捷方式,分別將剛才編譯成功的主機和從機的程序下載到目標單片機中。
15.如果程序編寫正確,則可以觀測到LED以1Hz的頻率閃爍,其中點亮和熄滅的時間各為一半。
16.觀測LED0閃爍100次200次的時間是否為100s或200s。
17.通過修改賦予TMR1H和TMR1L的初值可改變LED閃爍的頻率,試將閃爍頻率改為0.5Hz和0.25Hz。程序代碼如下
#include p16f877a.inc w_temp EQU 20H status_temp EQU 21H pch_temp EQU 22H COUNT EQU 23H COUNT1 EQU 24H COUNT2 EQU 25H PORTD_TEMP EQU 26H COUNT3 EQU 27H
ORG 00H NOP GOTO MAIN
ORG 0004H;中斷入口地址
MOVWF w_temp MOVF STATUS,w
CLRF STATUS MOVWF status_temp MOVF PCLATH,W MOVWF pch_temp GOTO INTTMR1 MAIN ORG 20H BCF STATUS,RP1 BSF STATUS,RP0;轉(zhuǎn)到體1
CLRF TRISD;設置PORTD口為輸出
BCF STATUS,RP0;轉(zhuǎn)到體0 MOVLW 0EH MOVWF T1CON;TMR1配置為對外計數(shù)模式,使用T1自帶振蕩器,不使用預分頻和同步電路
BSF STATUS,RP0;轉(zhuǎn)到體1 BSF PIE1,TMR1IE;允許TMR1中斷
BSF INTCON,GIE;開啟全局中斷
BSF INTCON,PEIE;開啟外設中斷
BCF STATUS,RP0;轉(zhuǎn)到體0 BCF PIR1,TMR1IF MOVLW 00H ADDWF TMR1L,f MOVLW 0C0H ADDWF TMR1H,f;設定TMR1定時半秒初值為0xC0h,低位可用默認值00,只需送入高位TMR1H CLRF PORTD BSF T1CON,TMR1ON GOTO $
INTTMR1
BTFSS PIR1,TMR1IF GOTO RECOVER BCF PIR1,TMR1IF MOVLW 0C0H ADDWF TMR1H,f BTFSC PORTD,0 GOTO CRL_PORTD0 GOTO SET_PORTD0 CRL_PORTD0 BCF PORTD,0 GOTO RECOVER SET_PORTD0 BSF PORTD,0 GOTO RECOVER
RECOVER
CLRF STATUS MOVF pch_temp,w MOVWF PCLATH MOVF status_temp,w MOVWF STATUS SWAPF w_temp,f SWAPF w_temp,w RETFIE END
四、實驗心得 在本次試驗中,我們按照書上的要求認真編寫了程序,在編寫的過程中出現(xiàn)了一些小問題在請教同學之后都順利地解決了。程序下載后我們發(fā)現(xiàn)LED燈并沒有閃爍,令我們百思不得其解,后來無意中拔掉了JP_RA和JP_RC的條線端子后燈就閃爍起來的,在請教了老師之后知道了原來是外部晶振的問題。
第二篇:單片機實驗
實驗
一、MCS51單片機基本開發(fā)環(huán)境
1. 實驗目的:
1)熟悉軟件的集成開發(fā)環(huán)境 2)掌握單片機軟件設計流程
3)掌握單片機存貯器結(jié)構(gòu)及各窗口之間的聯(lián)系 2. 實驗內(nèi)容:
1)用三種方法實現(xiàn)將累加器A內(nèi)容改為20H
方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做實驗時就越感覺這題根本不能說是題目,但不得不說在沒接觸過編程軟件,剛開始學的匯編,第一次做的實驗就光這道題都覺得不知道做什么.所以凡是總有開始,不了解情況的多簡單的都會覺得難.2)將58H位單元置為1,觀察內(nèi)部RAM中2BH內(nèi)容的變化 代碼:
SETB 2BH.0 JMP $ END 心得:這是關于內(nèi)部存儲中對單元和字節(jié)了解,不理解很容易做錯.比如開始寫的指令為
MOV R0,#58H;MOV @R0,#1
這是錯誤的指令。這就需要認真去了解單片機中的字節(jié)地址與位地址的關系。80C51中有位尋址區(qū)和字節(jié)尋址區(qū)。題目中58H為位地址,2BH為字節(jié)地址,且58H為2B字節(jié)的最低位。由于58H屬于位尋址區(qū),可用位操作指令 SETB 進行置位,SETB 2BH.0 執(zhí)行后,2BH中內(nèi)容變?yōu)椋埃?/p>
3)如果當前狀態(tài)為有進位、工作寄存器使用區(qū)2,請用3種方法設置這種狀態(tài)
代碼:
ANL PSW,#01H MOV A,PSW
CJNE A,#01,LAB2 LAB1:JMP LAB1
LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H CLR PSW.3 MOV C,P0.0 MOV PSW,R0 MOV PSW.4,C CPL C MOV PSW.3,C END
心得:以上LAB2寫了三段代碼,可分別完成題目要求。不過實驗時只是對代碼進行了錯誤調(diào)試,沒有對結(jié)果進行檢驗。其中值得注意的是對于布爾(位)操作指令的用法,比如傳送指令必須經(jīng)累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及對于位尋址的方式(如需用到“.”隔開)的應用。4)編一個小程序?qū)?nèi)部RAM中的20H單元的內(nèi)容送到21H單元并調(diào)試
代碼:
MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END
5)用程序?qū)⒍褩V羔樦赶?0H,然后在堆棧中依次壓入01,02,03,04,05五個數(shù),觀察哪些單元內(nèi)容發(fā)生了變化,各變?yōu)槎嗌伲繌哪男┐翱诳梢园l(fā)現(xiàn)這些變化?順序?qū)⒍褩V械奈鍌€數(shù)放入30H~34H五個單元中,編程實現(xiàn)之。
代碼:
MOV R1,#60H MOV SP,R1 MOV DPL,#1H LAB1:PUSH DPL INC DPL MOV A,DPL CJNE A,#6,LAB1 POP 34H POP 33H POP 32H POP 31H POP 30H JMP $ END
6)將外部數(shù)據(jù)存貯器1000H~100FH 16個單元中存放00H~0FH 代碼:
MOV DPTR,#1000H MOV R1,#10H LOOP:MOVX @DPTR,#1234H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
心得:此處需要訪問片外存儲空間,需要借助寄存器DPTR,需注意其為16位的寄存器,在使用時若與八位寄存器進行數(shù)據(jù)交換時需分為高八位DPH與低八位DPL來用。7)若要求程序從0010H單元開始運行,可用兩種方法實現(xiàn)?
方法一 ORG 0010H 方法二 AJMP 0010H
3. 選做實驗內(nèi)容:數(shù)據(jù)傳送 目的:
1)掌握8051單片機內(nèi)部數(shù)據(jù)存貯器、外部數(shù)據(jù)存貯器的數(shù)據(jù)傳送特點和應用 2)掌握MOV,MOVX和MOVC類指令的用法及區(qū)別 內(nèi)容:
1)將片內(nèi)RAM數(shù)據(jù)區(qū)20H為首地址的十六個字節(jié)傳送到30H為首地址的數(shù)據(jù)區(qū),即:20H~2FH送30H~3FH
代碼: ORG 0000H JMP MAIN ORG 0030H MAIN:MOV R0,#20H MOV R1,#30H LOOP:MOV @R0,#1234H MOVA,@R0 MOV @R1,A INC R0 INC R1 CJNE R1,#30H,LOOP JMP $ END
2)將外部數(shù)據(jù)存儲器2000H~200FH單元的十六個數(shù)傳送至內(nèi)部數(shù)據(jù)存儲器的30H~3FH 代碼: ORG 0000H JMP MAIN ORG 0030H MAIN: MOV DPTR,#2000H MOV R1,#30H LOOP:MOVX @DPTR,#12H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
總體心得體會:
第一次做實驗主要是熟悉了解了下單片機編程軟件的使用,開始接觸時在對其軟件不是太了解的情況下實驗編程做的確實很亂,不清楚該怎樣進行,比如不知如何進行對指令的調(diào)試,也不清楚該如何觀察結(jié)果,沒有一個整體的概念,所以在了解其開發(fā)環(huán)境上花了不少時間。經(jīng)過一段時間的摸索后也終于了解了其具體的使用,也能夠順利的對指令的編程運用。運行指令時遇到的一些問題需要注意的也在上面各題中做了說明。還有需要注意的是:進入軟件仿真時需要對存儲空間進行查看的方法是在Address窗口中輸入:d:00h 顯示內(nèi)部數(shù)據(jù)存儲器從00h開始的單元; x:1000h 顯示外部數(shù)據(jù)存儲器從1000h開始的單元; c:0000H 顯示程序存儲器內(nèi)容。還有由于偽指令 END 定義的原因,在程序末需加一條死循環(huán)調(diào)轉(zhuǎn)指令(如 JMP $)使程序不會進入其他未知空間執(zhí)行其他指令。實驗
二、加、減法實驗
1. 實驗目的
1)正確使用單片機的加減運算指令
2)掌握不同指令對于程序狀態(tài)字的影響及程序狀態(tài)字的意義、用處 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)學習模塊化程序設計方法 2. 實驗內(nèi)容
1)編寫3字節(jié)二進制加法子程序,并用主程序調(diào)用不同的加數(shù)和被加數(shù)來檢測該子程序的正確性。需考慮有進位和無進位情況。程序入口為: 加數(shù):22H,21H,20H三字節(jié),22H為最高位
被加數(shù):32H,31H,30H三字節(jié),32H為最高位
程序出口為: 23H,22H,21H,20H四字節(jié),23H為最高位 例如:地址:23 22 21 20 32 31 30 執(zhí)行前數(shù)據(jù): 01 23 45 FF 01 01 執(zhí)行后數(shù)據(jù):01 00 24 46
代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 22H,#01H MOV 21H,#23H MOV 20H,#45H MOV 32H,#0FFH MOV 1H,#01H MOV 30H,#01H ACALL ADDI HERE:JMP HERE ORG 100H ADDI: PUSH PSW MOV R0, #20H;加數(shù)1地址、和的地址 MOV R1, #30H;加數(shù)2地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 MOV @R0, A;存 INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A, #0;得到進位 MOV 23H, A;保存 POP PSW RET END
2)編寫三字節(jié)二進制減法子程序 入口:被減數(shù): 52H,51H,50H, 50H為最低位
減數(shù): 42H,41H,40H, 40H為最低位
出口:差:外部數(shù)據(jù)存貯器2003H~2000H(2000H為最低位)用主程序調(diào)用多組數(shù)據(jù)來調(diào)試,需考慮無借位和有借位兩種情況。例如:
執(zhí)行前:地址: 52 51 50 42 41 40
數(shù)據(jù): 90 80 70 10 10 10
執(zhí)行后:地址: 2003 2002 2001 2000
數(shù)據(jù): 00 80 70 60 代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 52H,#90H MOV 51H,#80H MOV 50H,#70H MOV 42H,#10H MOV 41H,#10H MOV 40H,#10H ACALL SUB1 HERE:JMP HERE SUB1: PUSH PSW MOV R0, #50H;被減數(shù)地址 MOV R1, #40H;減數(shù)地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 SUBB A, @R1;減 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP CLR A SUBB A, #0;得到借位 MOVX @DPTR, A;存 POP PSW RET END
3)編寫10位十進制加法子程序(十進制數(shù)采用壓縮BCD碼存放)入口: 加數(shù):24H—20H,低地址放低字節(jié)
被加數(shù):29H—25H,低地址放低字節(jié)
出口 和:4005H—4000H,低地址放低字節(jié)
要求調(diào)用多組數(shù)據(jù)調(diào)試,注意觀察PSW的變化,理解DA A指令的含義。例如:
執(zhí)行前地址:24 23 22 21 20 29 28 27 26 25
數(shù)據(jù):12 34 56 78 90 88 99 33 12 74
執(zhí)行后地址:4005 4004 4003 4002 4001 4000
數(shù)據(jù): 01 01 33 89 91 64
代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 24H,#12H MOV 23H,#34H MOV 22H,#56H MOV 21H,#78H MOV 20H,#90H MOV 29H,#88H MOV 28H,#99H MOV 27H,#33H MOV 26H,#12H MOV 5H,#74H ACALL ADD2 HERE:JMP HERE ADD2: PUSH PSW MOV R0, #20H;加數(shù)1地址 MOV R1, #25H;加數(shù)2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循環(huán)5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加
DA A;調(diào)整為BCD碼 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END
第三篇:單片機實驗
實驗一清0、移數(shù)
將片內(nèi)20H~2FH及片外0010H~001FH單元清0;
然后將片內(nèi)30H~3FH的數(shù)據(jù)移到片外0000H~000FH中;判斷:
若(30H)≤10,則求其平方存到31H中,并將位00H置1(其它位清0)若(30H)=10,則將AA存到31H中,并位01H置1(其它位清0)若(30H)≥10,則減10存到31H中,并位02H置1(其它位清0)
實驗二加法、排序
有兩個長度為10的無符號數(shù)分別放在片內(nèi)20H和30H為首的存儲單元中(低位),求其對應項之和(帶進位位),結(jié)果放在40H為首的單元中(若最高位有進位則存在后續(xù)單元中),然后按升序排列放在50H為首的單元中
實驗三查表、散轉(zhuǎn)
設有一表格,表中數(shù)為:00H、11H、22H、33H、44H、55H、66H、77H、88H、99H、AAH、BBH、CCH、DDH、EEH、FFH。根據(jù)片外0001H單元的低4位的數(shù),取出表中相應的值存到片內(nèi)30H中;根據(jù)片外0001H單元的高4位的數(shù),將片內(nèi)RAM區(qū)中可位尋址的相應的位置1(從位00H~位0FH,只可有一個位地址為1)
實驗四外中斷
P1.0~P1.7接8個發(fā)光二極管,管腳INT0、INT1接兩個按鍵,分別定義為“L”和“R”。
要求:上電全滅,按 “L”(或R)鍵,最右(左)側(cè)燈亮,每按一次“L” ”(或R)鍵,則亮的燈向左(右)移一位,當移到最左(右)端時,燈全滅
實驗五定時器
P1.0、P1.1分別接兩個發(fā)光二極管,INT0腳接
一按鍵做開關,按一次開關,則啟動,兩個發(fā)
光管一亮一滅,亮滅時間均為1秒;再按一次
開關,則關閉,即兩個發(fā)光管都滅。
實驗六定時器、計數(shù)器
P3.2口輸出周期為2S的方波,T1口為脈沖輸入端,記錄輸入的脈沖個數(shù),脈沖個數(shù)由P1口所接的8個數(shù)碼管顯示(二進制),設一按鍵作為開關控制系統(tǒng)運行,關閉時數(shù)碼管全滅,P3.2無輸出。
第四篇:2013單片機實驗教案
單片機技術實驗
教
案
馮
杰 實驗一(1)順序結(jié)構(gòu)程序設計
一、實驗目的
掌握匯編語言設計和調(diào)試方法。
二、實驗內(nèi)容
把外部RAM中2000h單元的內(nèi)容拆開,高位送2001h單元,低位送2002h單元,2001h、2002h高位清零,一般本程序用于把數(shù)據(jù)送顯示緩沖區(qū)時用。
三、程序流程
四、實驗步驟
1、LED環(huán)境
⑴在“P.”狀態(tài)下按“0→EV/UN”,裝載實驗所需的代碼程序。
⑵在“P.”狀態(tài)下鍵入0000,然后按“STEP”或“EXEC”進入實驗項目的調(diào)試與運行。
2、PC環(huán)境
在與PC聯(lián)機狀態(tài)下,編譯、連接、下載PH51se02.asm,用連續(xù)或單步方式運行程序。
3、運行結(jié)果檢查
⑴在單步運行時每走一步可觀察其運行結(jié)果。
⑵在連續(xù)運行狀態(tài)下,應按“暫停圖標”或?qū)嶒炏渖系摹皶和0粹o”,使系統(tǒng)無條件退出用戶運行狀態(tài)返回監(jiān)控,然后再用相應的命令鍵觀察與檢查2000~2002h中內(nèi)容變化情況。
五、思考
如何用斷點方式調(diào)試本程序。
ORG 0000H LJMP START
ORG 0030H START: MOV DPTR,#2000H
MOVX A,@DPTR ANL A,#0F0H SWAP A MOV DPTR,#2001H MOVX @DPTR,A
MOV DPTR ,#2000H MOVX A,@DPTR ANL A,0FH MOV DPTR,#2002H MOVX @DPTR,A SJMP $ END 實驗一(2)循環(huán)結(jié)構(gòu)程序設計
一、實驗目的
熟悉MCS-51指令系統(tǒng),掌握程序設計方法。
二、實驗內(nèi)容
編寫并調(diào)試一個排序子程序,其功能為用冒泡法將內(nèi)容RAM中幾個單元字節(jié)無符號的正整數(shù),按從小到大的次序重新排列。
三、程序框圖
四、實驗步驟
1、LED環(huán)境
⑴在“P.”狀態(tài)下按“0→EV/UN”,裝載實驗所需的代碼程序。
⑵對片內(nèi)RAM地址50h~5AH進行不規(guī)則置數(shù)。
⑶在“P.”狀態(tài)下鍵入0000,然后按“STEP”或“EXEC”進入實驗項目的調(diào)試與運行。
2、PC環(huán)境
在與PC聯(lián)機狀態(tài)下,編譯、連接、下載PH51se05.asm,用連續(xù)或單步方式運行程序。
3、運行結(jié)果檢查
⑴在單步運行時每走一步可觀察其運行結(jié)果。
⑵在連續(xù)運行狀態(tài)下,應按“暫停圖標”或?qū)嶒炏渖系摹皶和0粹o”,使系統(tǒng)無條件退出用戶運行狀態(tài)返回監(jiān)控,然后再用相應的命令鍵觀察與檢查片內(nèi)50~5Ah中內(nèi)容是否按從 小到大排列。
五、思考:修改程序把50~5Ah中內(nèi)容按從小到大排列。
ORG 0000H LJMP START ORG 0030H MOV R7,#09H MOV R6,#00H;清除標志 CLR C MOV A,@R0 INC R0 SUBB A,@R0 JC LOOP1 MOV R6,#01H DEC R0 MOV A,@R0 INC R0 XCH A,@R0 MOV @R0,A DJNZ R7,START1 CJNE R6,#00H,START SJMP $ END START:
MOV R0,#50H START1:
DEC R0
INC R0 LOOP1:
實驗一(3)選擇結(jié)構(gòu)程序設計
一、實驗目的
掌握匯編語言的編程。
二、實驗內(nèi)容
編寫程序,根據(jù)送入的數(shù)據(jù)轉(zhuǎn)移運行。
三、程序框圖
四、實驗步驟
1、LED環(huán)境
⑴在“P.”狀態(tài)下按“0→EV/UN”,裝載實驗所需的代碼程序。⑵在20H中分次送入00、01、02、03。
⑶在“P.”狀態(tài)下鍵入0A10,然后按“STEP”或“EXEC”進入實驗項目的調(diào)試與運行。
2、PC環(huán)境
在與PC聯(lián)機狀態(tài)下,編譯、連接、下載PH51se08.asm,用連續(xù)或單步方式運行程序。
3、運行結(jié)果檢查
(1)在單步運行時每走一步可觀察其運行結(jié)果。
(2)在連續(xù)運行狀態(tài)下,應按“暫停圖標”或?qū)嶒炏渖系摹皶和0粹o”,使系統(tǒng)無條件退出用戶運行狀態(tài)返回監(jiān)控,然后觀察每次運行程序后,數(shù)碼管上數(shù)字循環(huán)情況。
ORG 0000H
LJMP START
ORG 0030H START: MOV 20H,#00H MOV A,20H MOV B,#03H
MUL AB
MOV DPTR,#TAB
JMP @A+DPTR
SJMP $ ORG 3000H TAB:
LJMP LOOPA
LJMP LOOPB
LJMP LOOPC
LOOPA: MOV A,#01H LOOPA1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPA1
LOOPB: MOV A,#03H LOOPB1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPB1
LOOPC: MOV A,#05H LOOPC1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPC1
DELAY1S: DELAY1S3: DELAY1S2: DELAY1S1:
MOV R7,#10 MOV R6,#200 MOV R5,#250 DJNZ R5,DELAY1S1 DJNZ R6,DELAY1S2 DJNZ R7,DELAY1S3 RET END
實驗二 中斷實驗
一、實驗目的
熟悉單片機中斷概念及中斷編程方法。
二、實驗內(nèi)容
編寫程序,從P3.3輸入脈沖,記錄輸入脈沖個數(shù),并用P1口外部鏈接的發(fā)光二極管顯示技術結(jié)果。
二、參考程序
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1_COUNT
ORG 0030H START:
MOV SP,#60H
MOV A,#00H
SETB IT1;下降邊沿觸發(fā)方式
SETB EX1;開啟INT1中斷
SETB EA
SJMP $ INT1_COUNT:
INC A
MOV P1,A
RETI
END
實驗三 LED顯示實驗
一、實驗要求
利用實驗系統(tǒng)提供的顯示設備,動態(tài)顯示一行數(shù)據(jù)。
二、實驗目的
⑴了解數(shù)碼管動態(tài)顯示的原理; ⑵了解用總線方式控制數(shù)碼管顯示。
三、實驗說明
本實驗系統(tǒng)提供了8位七段碼LED顯示電路,學生只要按地址輸出相應數(shù)據(jù),就可以實現(xiàn)對顯示器的控制。
四、程序框圖
ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H MOV 50H,#8CH;顯示字符P.MOV 51H,#40H MOV 52H,#79H MOV 53H,#24H MOV 54H,#30H MOV 55H,#19H MOV 56H,#12H MOV 57H,#02H
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.TAB2: DB 7FH;END 的字符碼的字符碼
空,不顯示的字符
鍵盤電路實驗
電路圖:
程序:
;用int1中斷實現(xiàn)按鍵功能,鍵值存放在4fh單元中;通過P1口輸出按鍵值,用發(fā)光二極管顯示按鍵值;通過P2.4--P2.6和三八譯碼器輸出八列按鍵掃描碼;通過P2.0---P2.3讀入按鍵的行值;行列值組合,就是按鍵的鍵值 ORG 0000H LJMP START ORG 0013H LJMP key_value ORG 0030H START: MOV 4fH,#00h;存放按鍵鍵值單元 MOV P1,#00H MOV P2,#0FFH setb ex1 setb it1 setb ea KEY_SCAN: MOV P2,#0FH LCALL DELAY5MS
MOV P2,#1FH LCALL DELAY5MS
MOV P2,#2FH LCALL DELAY5MS
MOV P2,#3FH LCALL DELAY5MS
MOV P2,#4FH LCALL DELAY5MS
MOV P2,#5FH LCALL DELAY5MS
MOV P2,#6FH LCALL DELAY5MS
MOV P2,#7FH LCALL DELAY5MS
LJMP KEY_SCAN
DELAY5MS: MOV R7,#40 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV A,P2 MOV 4FH,A MOV P1,A POP PSW POP ACC RETI END
LED和鍵盤綜合實驗
電路圖:
參考程序:
ORG 0000H LJMP START ORG 0013H LJMP KEY_VALUE ORG 0030H START: MOV SP,#60H
MOV 4fH,#00h;存放按鍵鍵值單元 MOV P2,#0FFH setb ex1 setb it1 setb ea
MOV 50H,#0CH;顯示字符P.MOV 51H,#0CH MOV 52H,#7FH MOV 53H,#7FH MOV 54H,#7FH MOV 55H,#7FH MOV 56H,#7FH MOV 57H,#0CH
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS
MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV 4FH,P2 LCALL KEY_VALUE_DISP POP PSW POP ACC RETI
KEY_VALUE_DISP: MOV A,4FH ANL A,#0F0H SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV 56H,A MOV A,4FH ANL A,#0FH MOVC A,@A+DPTR MOV 57H,A RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6的字符碼 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.的字符碼
TAB2: DB 7FH;空,不顯示的字符 END
實驗四 A/D轉(zhuǎn)換實驗
一、實驗目的
(1)掌握A/D轉(zhuǎn)換與單片機接口的方法;(2)了解A/D芯片0809轉(zhuǎn)換性能及編程方法;(3)通過實驗了解單片機如何進行數(shù)據(jù)采集。
二、實驗內(nèi)容
利用實驗系統(tǒng)上的0809做A/D轉(zhuǎn)換器,實驗系統(tǒng)上的電位器提供模擬量輸入,編制程序,將模擬量轉(zhuǎn)換成數(shù)字,通過數(shù)碼管顯示出來。
三、程序框圖
四、實驗電路
五、實驗步驟
把0809的零通道INT0用插針接至AINl孔,0809CS位FFE0孔,運行程序,數(shù)碼管顯示0809.XX,后二位顯示當前采集的電壓轉(zhuǎn)換的數(shù)字量,調(diào)節(jié)W1,該二位將隨著電壓變化而相應變化。
六、思考
修改程序,用其它通道輪流采樣顯示。
實驗五 電腦時鐘(定時器、中斷綜合實驗)
一、實驗目的
熟悉MCS-51定時器,串行口和中斷初始化編程方法,了解定時器的應用實時程序的設計與調(diào)試技巧。
二、實驗內(nèi)容
編寫程序,從本實驗系統(tǒng)鍵盤上輸入時間初值,用定時器產(chǎn)生0.1S定時中斷,對時鐘計數(shù)器計數(shù),并將數(shù)值實時地送數(shù)碼管顯示。
三、程序框圖
四、實驗步驟
連續(xù)運行程序,在鍵盤上輸入時間初值,按執(zhí)行鍵EXEC執(zhí)行,數(shù)碼管上實時顯示時間值。
五、思考
(1)電子鐘走時精度和程序中那些常數(shù)有關?
(2)修改程序使定時器工作方式改變,調(diào)節(jié)有關參數(shù),進一步提高精度。
六、參考程序
ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H START: MOV 50H,#00H;時的低位字符碼 MOV 51H,#00H;時的高位字符碼 MOV 52H,#00H;“-”的字符碼 MOV 53H,#00H;分的低位字符碼 MOV 54H,#00H;分的高位字符碼 MOV 55H,#00H;“-”的字符碼 MOV 56H,#00H;秒的低位字符碼 MOV 57H,#00H;秒的高位字符碼 MOV 5FH,#00H;存放小時的單元 MOV 5EH,#00H;存放分鐘的單元 MOV 5DH,#00H;存放秒的單元 MOV 5CH,#00H;存放T0中斷次數(shù),50次為1秒
MOV SP,#60H;設置堆棧棧頂 MOV TH0,#???;設置T0定時器初值 MOV TL0,#??? MOV TMOD,#00000001H;T0工作在定時方式,工作方式0
SETB ET0;開放T0中斷 SETB EA;開放總中斷 SETB TR0;啟動定時器T0 LOOP: mov P2,#11111110H MOV R0,#50H loop1: MOV R7,#08H LOOP2: MOV A,@R0 MOV P1,A LCALL DELAY INC R0 MOV A,P2 RL A
MOV P2,A DJNZ R7, LOOP2 LJMP LOOP SJMP $
DELAY: MOV R6,#2;延時程序 DELAY1: MOV R5,#10 DELAY2: MOV R4,#100 DELAY3: DJNZ R4,DELAY3 DJNZ R5,DELAY2 DJNZ R6,DELAY1 RET 16 T0_INT: CLR TR0 PUSH ACC MOV A,5CH CJNE A,#50H,T0_INT1 MOV 5CH,#00H MOV A,5DH CJNE A,#59H,T0_INT2 MOV 5DH,#00H MOV A,5EH CJNE A,#59H,T0_INT3 MOV 5EH,#00H MOV A,5FH CJNE A,#23H,T0_INT4 MOV 5FH,#00H LJMP T0_END T0_INT1: INC 5CH LJMP T0_END T0_INT2: INC 5DH LJMP T0_END T0_INT3: INC 5EH LJMP T0_END T0_INT4: INC 5FH T0_END: MOV A,5FH
MOV B,#10 DIV AB MOV 51H,A MOV A,B MOV 50H,A MOV A,5EH MOV B,#10 DIV AB MOV 54H,A MOV A,B MOV 53H,A MOV A,5DH MOV B,#10 DIV AB MOV 57H,A MOV A,B MOV 56H,A POP ACC
MOV TH0,#??? MOV TL0,#??? SETB TR0 RETI
實驗六 LCD液晶顯示屏實驗
一、實驗目的
⑴掌握單片機擴展液晶顯示接口的設計與編程。⑵利用字符式液晶顯示器顯示字符。
二、實驗內(nèi)容
編制程序,在液晶顯示器上顯示:
學生所在的院系的漢語拼音字母和學生的名字。分兩行顯示。
三、實驗電路
四、參考程序
DAT1 DAT2 EQU EQU 30H;第一參數(shù)單元 31H;第二參數(shù)單元 32H;指令代碼單元 0100H;指令通道地址 0000H;數(shù)據(jù)通道地址 COM EQU C_ADD EQU D_ADD EQU
org 0000h ljmp main org 0030h;主程序
MAIN: MOV SP,#60H;
lcall delay;上電延時
LCALL INT;初始化
LCALL CLEAR;清緩沖區(qū) TEST: LCALL hgnu_disp;顯示“WELCOM TO HGNU” LCALL PL_XW_ZKB;顯示 “P_L :”
“X_W :”
“ZKB:” sjmp test
;上電延時子程序 delay: MOV R6,#50H;MOV R7,#00H;DELY1: NOP DJNZ R7,DELY1;上電延時
DJNZ R6,DELY1;ret;讀狀態(tài)字子程序
R_ST: MOV DPTR,#C_ADD;設置指令通道 MOVX A,@DPTR;RET;判斷狀態(tài)位STA1,STA0子程序(讀寫指令和數(shù)據(jù)),在指令的讀,寫
;數(shù)據(jù)之前這兩個標志必須同時為“1” ST01: LCALL R_ST;JNB ACC.0,ST01;JNB ACC.1,ST01;RET;判斷狀位STA2子程序(數(shù)據(jù)自動讀狀態(tài)),該位
;在數(shù)據(jù)自動操作過程中取代STA0和STA1有效。在連續(xù)讀過程中每讀一次;之前都要確認STA2=1 ST2: LCALL R_ST;JNB ACC.2,ST2;RET;判斷STA3子程序(數(shù)據(jù)自動寫狀態(tài))ST3: LCALL R_ST;JNB ACC.3,ST3;RET;判斷狀態(tài)位STA6子程序(屏讀/屏拷貝狀態(tài))ST6: LCALL R_ST;JB ACC.6,ERR;RET ERR: LJMP ST6;;出錯處理
;寫指令和寫數(shù)據(jù)子程序..;雙字節(jié)參數(shù)指令寫入入口
PR1: LCALL ST01;判斷狀態(tài)位STA1,STA0 MOV A,DAT1;取第一參數(shù)單元數(shù)據(jù)
LCALL PR13;寫入?yún)?shù);單字節(jié)參數(shù)指令寫入入口
PR11: LCALL ST01;判斷狀態(tài)位STA1,STA0 MOV A,DAT2;取第二參數(shù)單元數(shù)據(jù) LCALL PR13;寫入?yún)?shù)
;無參數(shù)指令寫入入口
PR12: LCALL ST01;無參數(shù)指令寫入入口
MOV A,COM;取指令代碼單元數(shù)據(jù)
MOV DPTR,#c_ADD;設置指令通道地址/數(shù)據(jù)寫入入口
LJMP PR14;寫入指令代碼
PR13: MOV DPTR,#D_ADD;設置數(shù)據(jù)通道地址/數(shù)據(jù)寫入入口 PR14: MOVX @DPTR,A;寫入操作 RET;讀數(shù)據(jù)子程序 PR2: LCALL ST01;判斷狀態(tài)位
MOV DPTR,#D_ADD;設置數(shù)據(jù)通道地址
MOVX A,@DPTR;讀數(shù)據(jù)操作 MOV DAT2,A;數(shù)據(jù)存入第二參數(shù)/數(shù)據(jù)單元
RET;初始化子程序
INT:
;顯示區(qū)域設置
MOV DAT1,#00H;設置文本顯示區(qū)首地址
MOV DAT2,#00h;MOV COM,#40H;LCALL PR1;雙字節(jié)參數(shù)指令寫入入口
MOV DAT1,#16;設置文本顯示區(qū)域?qū)挾?/p>
MOV DAT2,#00H;即一行顯示所占字節(jié)數(shù)
MOV COM,#41H;LCALL PR1;雙字節(jié)參數(shù)指令寫入入口
MOV DAT1,#00H;設置顯示區(qū)域首地址
MOV DAT2,#00H;或文本屬性區(qū)域首地址
MOV COM,#42H;LCALL PR1;雙字節(jié)參數(shù)指令寫入入口
MOV DAT1,#10H;設置圖形顯示區(qū)域?qū)挾?/p>
MOV DAT2,#00H;或為文本屬性區(qū)域狂寬度
MOV COM,#43H;即一行顯示所占字節(jié)數(shù)
LCALL PR1;雙字節(jié)參數(shù)指令寫入入口
;顯示光標設置
MOV COM,#0A1H;光標形狀設置
LCALL PR12;
;設置光標初始位置,是字符行和字符列,第0行第15列
MOV DAT1,#0;光標行位置
MOV DAT2,#0;光標列位置
MOV COM,#21H;LCALL PR1;雙字節(jié)參數(shù)指令寫入入口
;顯示方式設置,使用內(nèi)部字符發(fā)生器
MOV COM,#80H;顯示方式設置,邏輯“或”合成 LCALL PR12;無參數(shù)指令寫入入口+
MOV COM,#97H;僅用文本顯示
LCALL PR12;無參數(shù)指令寫入入口
;顯示開關方式
RET
;寫數(shù)據(jù)子程序,8*8點陣
;R6中裝入顯示位置的列數(shù)(字符的個數(shù)),每行16個字符,R7中裝入顯示位置距左上角的字符行數(shù)
;5FH單元中裝入待顯示的字符碼 DISP: mov b,r7
mov a,#16 mul ab mov r7,a CLR C mov a,R6
ADD A,R7 MOV R6,A;R7*16+R6
MOV DAT1,R6;設置顯示RAM首地址,水平方向字符數(shù)
MOV DAT2,#00H;固定送00H MOV COM,#24H;地址指針指令
LCALL PR1;MOV
dat2,5fH;取要顯示的字符
MOV COM,#0c4H;數(shù)據(jù)寫,地址不變 LCALL PR11;寫入數(shù)據(jù)
RET;清顯示緩沖區(qū)(16*8單元)clear: MOV 5FH,#00H
MOV R5,#0 CLEAR0: MOV R4,#0 CLEAR1: MOV A,R5
MOV R7,A MOV A,R4 MOV R6,A CLEAR2: LCALL DISP
INC R4 CJNE R4,#16,CLEAR1
mov r4,#00h
INC R5
CJNE R5,#8,CLEAR0 CLEAR9: RET;顯示頻率、相位、占空比、相位差等字符。(P_L :;PL_XW_ZKB:MOV R7,#3 MOV R6,#0 MOV
5fh,#30H;“P” LCALL DISP MOV R7,#3 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#3 MOV R6,#2 MOV
5fh,#2CH;“L”
X_W :
ZKB:)
LCALL DISP MOV R7,#3 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP MOV R6,#0 MOV
5fh,#38H;“X” LCALL DISP MOV R7,#5 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#5 MOV R6,#2 MOV
5fh,#37H;“W” LCALL DISP MOV R7,#5 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP
MOV R7,#5
MOV R7,#7 MOV R6,#0 MOV
5fh,#3AH;“Z” LCALL DISP
MOV R7,#7 MOV R6,#1 MOV
5fh,#2BH;“K” LCALL DISP MOV R7,#7 MOV R6,#2 MOV
5fh,#22H;“B ” LCALL DISP MOV R7,#7 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP RET;頂行顯示“黃岡師院物科院“的英文名稱。;”welcome to hgnu!“ hgnu_DISP:
MOV R7,#0;顯示位置的行列數(shù)
MOV R6,#0 MOV
5fh,#37H;”W“ LCALL DISP MOV R7,#0 MOV R6,#1 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#2 MOV
5fh,#2CH;”L“ LCALL DISP MOV R7,#0 MOV R6,#3 MOV
5fh,#23H;”C“ LCALL DISP MOV R7,#0 MOV R6,#4 MOV
5fh,#2FH;”0“ LCALL DISP MOV R7,#0 MOV R6,#5 MOV
5fh,#2DH;”M“ LCALL DISP MOV R7,#0 MOV R6,#6 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#7 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#8 MOV
5fh,#34H;”T“ LCALL DISP MOV R7,#0 MOV R6,#9 MOV
5fh,#2FH;”O(jiān)“ LCALL DISP MOV R7,#0 MOV R6,#10 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#11 MOV
5fh,#28H;”H“ LCALL DISP
MOV R7,#0 MOV R6,#12 MOV
5fh,#27H;”G“ LCALL DISP MOV R7,#0 MOV R6,#13 MOV
5fh,#2EH;”N“ LCALL DISP MOV R7,#0 MOV R6,#14 MOV
5fh,#35H;”U“ LCALL DISP RET tab: db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h;”0-----9“
db 21h,22h,23h,24h,25h,26h;”A-----F" end
實驗七 直流電機轉(zhuǎn)速測量與控制實驗
一、實驗目的
1.掌握直流電機的驅(qū)動原理。2.了解直流電機調(diào)速的方法。
二、實驗內(nèi)容
1.用0832 D/A轉(zhuǎn)換電路后的輸出經(jīng)放大后驅(qū)動直流電機。
2.編制程序改變0832輸出經(jīng)放大后的方波信號的占空比來控制電機轉(zhuǎn)速。本實驗中 D/A輸出為雙極性輸出,因此電機可以正反向旋轉(zhuǎn)。
三、程序流程
三、實驗電路
五、參考程序
DATA_TH0 EQU 00H DATA_TL0 EQU 00H;信號周期為130ms DATA_TH1 EQU 20H DATA_TL1 EQU 00H;高電平時間65ms ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0;啟動電機按鍵
ORG 000BH LJMP T_0;T0確定輸出信號的周期(或者頻率)ORG 0013H LJMP INT_1;電機轉(zhuǎn)動方向控制按鍵 ORG 001BH LJMP T_1;T1確定輸出信號高電平的時間期
ORG 0030H MAIN: MOV SP,#60H
CLR P1.0 CLR P1.1;關閉電機
setb 20h.0;初始化電機正轉(zhuǎn)
clr 20h.1;初始狀態(tài)時,電機停止轉(zhuǎn)動 MOV TMOD,#11H SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB ET0 SETB ET1 SETB EA
SJMP $
T_0: JNB 20H.1,T_01;
MOV TH1,#DATA_TH1
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0 MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,T_02 setb P1.0 clr P1.1 LJMP T_05 T_02: clr P1.0 setb P1.1 LJMP T_05 T_01: CLR P1.0
CLR P1.1 CLR TR0 CLR TR1 RETI CLR TR1 T_05: T_1: clr p1.0 clr p1.1 RETI int_1: CPL 20H.1;電機啟動標志求反,開啟電機或者關閉電機
JNB 20H.1,INT_11;啟動標志不為1,則停止電機,關閉定時器
MOV TH1,#DATA_TH1;啟動標志為1,則開啟定時器1和定時器2,輸出PWM波
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0
MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,INT_12;轉(zhuǎn)動方向標志不為1,則反轉(zhuǎn),否則正轉(zhuǎn) setb P1.0 clr P1.1 LJMP INT_19 setb P1.1 LJMP INT_19 INT_12: clr P1.0 INT_11: CLR P1.0 CLR P1.1 CLR TR0 CLR TR1 INT_19: RETI 26
INT_0: CPL 20H.0 RETI END
實驗八 步進電機控制實驗
一、實驗目的
1.了解步進電機控制的基本原理。2.掌握步進電機轉(zhuǎn)動編程方法。
二、實驗內(nèi)容
從鍵盤上輸入正、反轉(zhuǎn)命令,轉(zhuǎn)速參數(shù)和轉(zhuǎn)動步數(shù)顯示在顯示器上,CPU再讀取顯示器上顯示的正、反轉(zhuǎn)命令,轉(zhuǎn)速級數(shù)(16級)和轉(zhuǎn)動步數(shù)后執(zhí)行。轉(zhuǎn)動步數(shù)減為零時停止轉(zhuǎn)動。
三、實驗電路圖
四、參考程序
ORG 0000H
ljmp main ORG 000BH LJMP COUNT0 ORG 001BH LJMP COUNT1 ORG 0100H MAIN: MOV P0,#0FFH;輸送脈沖口,SETB P1.2;MOV R0,#1;延時變化變量 LOOP1: MOV P0,#0FCH LCALL DELAY MOV P0,#0F6H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F9H LCALL DELAY JNB P1.2,LOOP2 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP1 LOOP2: MOV P0,#0FCH LCALL DELAY MOV P0,#0F9H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F6H LCALL DELAY JB P1.2,LOOP1 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH 28 SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP2 SJMP $ COUNT0: MOV TH0,#0FFH;減速中斷 MOV TL0,#0FFH CJNE R0,#9,L4 JMP L5 L4: INC R0
L5: setb TR0 RETI COUNT1: MOV TH1,#0FFH;加速中斷 MOV TL1,#0FFH CJNE R0,#1,L6 JMP L7 L6: DEC R0 L7: setb TR1 RETI DELAY: MOV A,R0;延時 MOV R1,A L1: MOV R2,#50 L2: MOV R3,#250 L3: DJNZ R3,L3 DJNZ R2,L2 DJNZ R1,L1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;顯示程序查表,共陰 END
第五篇:單片機實驗 2
單片微型計算機原理、應用及接口技術
實驗報告
得分:
年級專業(yè):
測控1303班
學生姓名/學號:崔振振
/201323030325 評閱教師:
提交時間:2015—2016學年第1學期
單片機實驗1匯編語言程序設計實驗
----存儲器塊清零或賦值
一.實驗目的 熟悉存儲器的讀寫方法,熟悉51匯編語言結(jié)構(gòu)。2 熟悉循環(huán)結(jié)構(gòu)程序的編寫。
熟悉編程環(huán)境和程序的調(diào)試。二.實驗內(nèi)容
指定存儲器中某塊的起始地址和長度,要求將其內(nèi)容清零或賦值。例如將4000H開始的100個字節(jié)內(nèi)容清零或全部賦值為33H。三.實驗儀器
微機、WAVE6000編程環(huán)境軟件,(單片機實驗箱)仿真器--仿真器設置-?
Lab6000通用微控制器 MCS51實驗 8031
√ 使用偉福軟件模擬器 勾上
四、實驗內(nèi)容及步驟
1、運行WAVE 雙擊“WAVE”圖標,進入仿真調(diào)試環(huán)境。最上行為提示行:偉福6000 軟件模擬器(8***)[C:WAVESAMPLES***.PRJ]-[***-C:WAVESAMPLES***.ASM],其中,8***為要仿真的芯片,后面的.PRJ文件是你要調(diào)試的項目,最后一項是錄入的源程序。(如果有項目文件,請點擊菜單 文件-關閉項目)
2、仿真器設置
使用語言設置:點擊“仿真器—— 仿真器設置”
仿真器設置:點擊“仿真器—— 仿真器設置——語言”,選擇“偉福匯編器”“混合十、十六進制”;點擊仿真器設置下的“仿真器”,選擇 S51/S、POD8X5X、8751(或AT89C51);在“使用偉福軟件模擬器”選項上打“√”,點擊“好”。完成軟件模擬仿真器環(huán)境設置。
3、程序錄入
完成下列程序的錄入(SY1.ASM)。(注意:錄入源程序必須使用西文輸入法)錄入步驟為:點擊“文件”——點擊“新建文件”,則顯示器打開源程序錄入窗口,文件名默認為NONAME1;將SY1.ASM錄入并點擊“文件”———點擊“保存文件”。特別注意:保存文件時必須加上擴展名“.ASM”,并記錄保存的文件夾路徑。
建立項目,點擊新建項目,選擇剛才新建的文件,下一步可不選擇,然后填寫項目名字
參考程序:
Block equ 4000h mov dptr, #Block;起始地址 mov r0, #10;清10個字節(jié) mov a, #33h;Loop: movx @dptr, a inc dptr;指向下一個地址 djnz r0, Loop;記數(shù)減一 ljmp $ end
4、對錄入的源程序SY1.ASM進行編譯
編譯步驟為:點擊“項目———全部編譯”
若編譯完成,在左下角的“信息窗口”將顯示生成兩個文件SY1.HEX和SY1.BIN。若源程序在格式上有錯誤,則在“信息窗口”中出現(xiàn)錯誤提示,請檢查源程序,修改后再進行編譯,直至編譯成功。
窗口最下一行顯示:執(zhí)行時間和PC、DPTR、A、PSW、SP的當前值。
5、窗口介紹與練習(1)、左邊窗口:為“項目窗口”和“觀察窗口”: Project: 項目窗口;
REG: 工作寄存器和部分特殊功能寄存器窗口。SFR: 51系列單片機特殊功能寄存器窗口。
另:此窗口最右邊顯示的是某個特殊功能寄存器(點擊選中左邊的某個寄存器)的位及對應的二進制的值。
(2)、左下角為“信息窗口”。(3)、右下角為CODE(程序存儲器)窗口和XDATA(片外數(shù)據(jù)存儲器)窗口。(4)、點擊主菜單的“窗口——CPU窗口”,在右部窗口顯示PC值、機器碼和源程序。(5)、點擊主菜單的“窗口——數(shù)據(jù)窗口——DATA”:顯示片內(nèi)RAM窗口。
6、調(diào)試程序
點擊 “執(zhí)行—— 復位”:使程序指針指向第一條指令(CPU窗口指向0000H)點擊 “執(zhí)行—— 單步”:使程序單步執(zhí)行。
7、觀察寄存器單元中的內(nèi)容:
點擊 窗口—— 數(shù)據(jù)窗口-DATA: 可以觀看片內(nèi)RAM 00H 到 FFH 中的內(nèi)容,點擊 窗口—— 數(shù)據(jù)窗口-CODE: 可以觀看程序存儲器 0000H —— FFFFH 中的機器碼。點擊 窗口—— 數(shù)據(jù)窗口—— XDATA: 可以觀看片外RAM 數(shù)據(jù) 0000H— FFFFH 點擊 窗口—— 數(shù)據(jù)窗口—— DATA: 可以觀看RAM 數(shù)據(jù)00H— FFH 參考程序與流程圖
實驗心得:
通過實驗能夠讓我更了解單片機內(nèi)部工作的原理,能夠更深一層次的幫助我理解各個語句命令的功能
單片機實驗2存儲塊移動 一.實驗目的 熟悉51匯編語言程序結(jié)構(gòu)。2 熟悉循環(huán)結(jié)構(gòu)程序的編寫,進一 步熟悉指令系統(tǒng)。熟悉編程環(huán)境和程序的調(diào)試。二.實驗內(nèi)容
將指定源地址(3000H)和長度(100字節(jié))的存儲塊移動到目的地址(4000H)。三.實驗步驟
同實驗一項目文件建立過程,然后錄入代碼 四.代碼內(nèi)容
mov
r0, #30h mov
r1, #00h mov
r2, #40h mov
r3, #00h
mov
r7, #10 Loop: movdph, r0 movdpl, r1 movx a, @dptr movdph, r2 movdpl, r3 movx @dptr, a inc
r1 inc
r3 djnz r7, Loop ljmp $
實驗心得:
試驗中當時挺迷惑dph和dpl的,最終查書才知道是dptr的另一種表達方式,從這可以看出有時候?qū)嶒炇菣z驗自己學習不足的好方法,從而加深對本質(zhì)的理解
單片機實驗3數(shù)據(jù)排序
一.實驗目的
1了解數(shù)據(jù)排序的常用算法,掌握冒泡算法。2 進一步熟悉編程環(huán)境和調(diào)試方法。3 熟悉匯編程序設計。二.實驗內(nèi)容
將 50H開始的10個隨機數(shù)按從小到大的順序排列。三.實驗儀器微機、WAVE6000編程環(huán)境
試驗中由于上電后數(shù)據(jù)都一樣,所以需要手動修改50H后10個數(shù)據(jù)(要排序的數(shù))方法是:窗口---數(shù)據(jù)窗口---DATA 找到50H開始的10個2位16進制數(shù),雙擊,修改其數(shù)值如(6,2,4,9,3,7,1,5,8,0)之后編譯(下載),單步執(zhí)行,查看排序執(zhí)行過程
四.實驗步驟:同實驗一,值得注意的地方就是修改數(shù)據(jù)
參考程序:
Size
equ
;數(shù)據(jù)個數(shù)
Array equ
50h
;數(shù)據(jù)起始地址
Change equ
0
;交換標志 Sort:
mov
r0, #Array
mov
r7, #Size-1
clr
Change Goon:
mov
a, @r0
mov
r2, a
inc
r0
mov
B, @r0
cjne a, B, NotEqual
sjmp Next NotEqual:
jc
Next
;前小后大, 不交換
setb Change
;前大后小, 置交換標志
xch
a, @r0
;交換
dec
r0
xch
a, @r0
inc
r0 Next:
djnz r7, Goon
jb
Change, Sort
ljmp $
end
實驗心得:
其實有時候挺疑惑偽代碼到底是干什么的,因為程序在執(zhí)行中,不像c語言一樣調(diào)用子函數(shù)能夠讓人很理解,但究其最終的的過程,還是和c語言是一樣的,具有同樣的思想
單片機實驗4 P1口輸入輸出實驗
一.實驗目的
1.熟悉P1 口的功能。
2.熟悉延時子程序或定時中斷程序的編寫和使用。3.初步熟悉單片機軟硬件設計方法。二.實驗內(nèi)容(兩內(nèi)容分開做)
注意:硬件實驗小實驗箱的仿真器設置:
選擇仿真器選擇仿真頭選擇CPU G6W
POD51
8031
1.P1口做輸出口接八只發(fā)光二極管,編寫程序,使發(fā)光二極管循環(huán)亮滅。
注意:小實驗箱(G2010)的發(fā)光二級管LED是低電平亮,高電平滅;
大實驗箱(LAB6000)的發(fā)光二級管LED是高電平點亮,低電平滅。
2.P1.0,P1.1作輸入口接兩個撥動開關,P1.2,P1.3作輸出口,接兩個發(fā)光二極管。編寫程序讀取開關狀態(tài),將此狀態(tài)在發(fā)光二極管上顯示出來。三.實驗儀器
微機,WAVE6000編程環(huán)境、實驗箱
注意:當P1口用作輸入口時,必須先對它置”1”。
編程時應注意P1.0,P1.1作為輸入時應先置1,才能正確讀入值。
S0,S1就是實驗箱上K0,K1 鍵
實 驗 說 明 . P1 口 是 準 雙 向 口,它 作 為 輸 出 口 時 與 一 般 的 雙 向 口 使 用 方 法 相 同。由 準 雙 向 口 結(jié)構(gòu) 可 知 當 P1 口 用 為 輸 入 口時, 必 須 先 對 它 置 “ 1 ”。若 不 先 對 它 置 “ 1 ”,讀 入 的 數(shù) 據(jù) 是 不 正 確 的。內(nèi)容1大實驗箱參考程序:
rl
a Loop:
call Delay mov
a, #01h
djnz r2, Output mov
r2, #8
ljmp Loop Output:
Delay: mov
P1, a
mov
r6, #0 mov
r7, #0 DelayLoop: djnz r6, DelayLoop djnz r7, DelayLoop ret end 內(nèi)容2大實驗箱參考程序 KeyLeftequ P1.0 KeyRightequ P1.1 LedLeftequ P1.2 LedRightequ P1.3 SETB
KeyLeft 實驗心得:
SETB
KeyRight Loop:
MOV
C, KeyLeft MOV
LedLeft, C MOV
C,KeyRight MOV
Ledright,C LJMP
Loop END
當進行實驗時,我一直不明白,為什么可以用OX0000H這樣的值賦給dptr單片機就知道是對P0 P2操作,P1能不能這樣使用呢,在實驗中我們看到對單個引腳操作時是直接進行賦值的,但最終還是通過看書得以理解。
實驗五計數(shù)器實驗
一.實驗目的 熟悉計數(shù)器的使用方法。2 熟悉計數(shù)器的硬件電路連接。3 熟悉計數(shù)器的軟件設計。二.實驗內(nèi)容
注意:硬件實驗 小實驗箱的仿真器設置:
選擇仿真器 選擇仿真頭 選擇CPU G6W POD51 8031 8031內(nèi)部定時計數(shù)器0,按計數(shù)器模式和工作方式1工作,對P3.4(計數(shù)器0計數(shù)脈沖輸入T0)引腳進行計數(shù)。將其計數(shù)數(shù)值按二進制數(shù)用P1口驅(qū)動LED燈顯示出來。
說明
實 驗 中 內(nèi) 計 數(shù) 器 起 計 數(shù) 器 的 作 用,外 部 事 件 計 數(shù) 沖 由 P3.4 引 入 定 時 器T0。單 片 機 在 每 個 榌 器 周 期 采 樣 一 次 輸 入 波 形。因 此 單 片 機 至 少 需 要 兩 個 機 器 周 期 才 能 椧 到 一 次 跳 變。這 就 要 求 被 采 樣 電平至 少 維 特 一 個 完 整 的 機 器 周 期。以 保 證 電平在 變 化 之 前 即 被 采 樣。同 時 這 就 決 定 了 輸 入 波 形 的 率 不 能 超 過 機 器 周 期。
三.實驗儀器
微機、WAVE6000編程環(huán)境,偉福6000實驗箱 注意:P3.4接單次脈沖 實驗連線如圖:
大實驗箱單次脈沖
程序流程:
程序
mov
TMOD, #00000101b
;方式1,記數(shù)器 mov
TH0, #0 mov
TL0, #0 setb TR0
;開始記數(shù)
Loop: mov
P1, TL0
;將記數(shù)結(jié)果送P1口 ljmp
Loop end 實驗心得:
對于程序的過程我沒有太多的疑問,能夠更好地理解書中概念性的知識。
實驗六外部中斷實驗
一.實驗目的 熟悉外部中斷的硬件電路,中斷技術的基本使用方法。2 熟悉外部中斷的軟件設計。二.實驗內(nèi)容
注意:硬件實驗小實驗箱的仿真器設置:
選擇仿真器選擇仿真頭選擇CPU G6W
POD51
8031
利用實驗箱上的單脈沖按鍵和發(fā)光二極管實現(xiàn):用單次脈沖申請中斷,在中斷服務程序中對輸出信號進行翻轉(zhuǎn)(對每當輸出一個單次脈沖時(產(chǎn)生低電平一個脈沖),發(fā)光二極管(L0)亮滅變化)。
三.實驗儀器
微機、WAVE6000編程環(huán)境,實驗箱
連線:P1.0連接L0
INT0連接低電平單次脈沖。實驗電路及連線如下:小實驗箱低電平脈沖見上頁圖示。
注意
中斷服務程序(ISR)關鍵: 保護進入中斷時的現(xiàn)場,并在退出中斷之前恢復現(xiàn)場;中斷重入的設置中斷相關寄存器的設置:中斷寄存器IE,中斷觸發(fā)罰方式的設置。本例中保護CPU狀態(tài)寄存器PSW等。中斷程序和子程序的區(qū)別。中斷程序不是程序調(diào)用的,中斷發(fā)生時,CPU就執(zhí)行相應中斷服務程序。程序流程圖:
參考程序:
LED equ P1.0 LEDBufequ 0 ljmp Start org 3 Interrupt0: push PSW;保護現(xiàn)場 cplLEDBuf;取反LED mov c, LEDBuf mov LED, c pop PSW;恢復現(xiàn)場 reti Start: clrLEDBuf clr LED mov TCON, #01h;外部中斷0下降沿觸發(fā)
mov IE, #81h;打開外部中斷允許位(EX0)及總中斷允許位(EA)ljmp $ end 實驗心得:
剛開始一直在疑惑單片機進入中斷是怎樣進行的,是通過主函數(shù)調(diào)用還是怎樣執(zhí)行的,以前一直不明白為什么主函數(shù)沒有調(diào)用但是函數(shù)執(zhí)行了,通過實驗知道對于中斷服務子函數(shù)是不需要通過主函數(shù)調(diào)用的。