第一篇:單片機實驗代碼總結
編者:方園
單片機實驗代碼集合(by fangyuan)
1.多字節(jié)累加程序:
ORG 0000H LJMP MAIN ORG 0030H;將加數(shù)和被加數(shù)送到指定地址 MAIN: MOV 20H,#45H
MOV 21H,#74H
MOV 30H,#67H
MOV 31H,#28H
;低位相加
MOV A,21H
ADD A,31H
DA A
MOV 42H,A
;高位相加
MOV A,20H
ADDC A,30H
DA A
MOV 41H,A
CLR A
ADDC A,#0
MOV 40H,A
SJMP $ END
2.數(shù)據(jù)交換實驗
編寫程序,實現(xiàn)以下操作:
【功能1】產(chǎn)生數(shù)組Hex1:0H、1H、2H、? 0FH,存儲到片內(nèi)RAM區(qū)中,數(shù)組Hex1的首地址為30H。
【功能2】產(chǎn)生數(shù)組Hex2:0FH、0EH、0DH、? 0H,存儲到片外RAM區(qū)中,數(shù)組Hex2的首地址為3000H。
【功能3】將片內(nèi)RAM數(shù)組Hex1與片外RAM數(shù)組Hex2交換內(nèi)容。
代碼:
ORG 0000H
Hex1 EQU 30H
;定義內(nèi)部RAM數(shù)組首地址
Hex2 EQU 3000H;定義外部RAM數(shù)組首地址
編者:方園
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#4FH
;定義棧頂?shù)刂?/p>
MOV R7,#16
MOV R0,#Hex1
MOV DPTR,#Hex2
LCALL HEX1DE
;調(diào)用內(nèi)部送數(shù)據(jù)函數(shù)
LCALL HEX2DE;調(diào)用外部送數(shù)據(jù)函數(shù)
LCALL XCHDE;調(diào)用交換函數(shù)
SJMP $
ORG 0100H
;內(nèi)部送數(shù)據(jù)
HEX1DE: PUSH 00H
PUSH 07H
MOV A,#0 LOOP1: MOV @R0,A
INC A
INC R0
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
;外部送數(shù)據(jù)
HEX2DE: PUSH 07H
PUSH DPL
PUSH DPH
MOV A,#0FH LOOP2: MOVX @DPTR,A
DEC A
INC DPTR
DJNZ R7,LOOP2
POP DPH
POP DPL
POP 07H
RET
;交換子程序 XCHDE:
LOOP3: MOVX A,@DPTR
XCH A,@R0
編者:方園
END
MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,LOOP3 RET
3.查表實驗
1、《單片機原理及應用實驗教程》(第2版)“第2章 實驗3”(P49)。要求: 16進制數(shù)(00H~0FH)ASCⅡ碼表定義在內(nèi)部ROM中(用偽指令定義);R0為片內(nèi)RAM區(qū)Hex數(shù)組指針;R1為片內(nèi)RAM區(qū)Asc數(shù)組指針;數(shù)據(jù)塊長度放在寄存器R2中。
代碼如下:
ORG 0000H
Hex EQU 40H
Asc EQU 50H
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI
LCALL ZHUANHUAN
SJMP $
TABLE:
DB '0123456789'
;查表子程序 ORG 1000H ZHUANHUAN:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
編者:方園
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET END
2、編寫用@A+PC指令的查表程序,實現(xiàn)用查表方式將片內(nèi)RAM中16進制數(shù)組Hex(00H~0FH)轉(zhuǎn)換為ASCⅡ碼并存入片內(nèi)RAM數(shù)組Asc中。要求:
16進制數(shù)(00H~0FH)ASCⅡ碼表在內(nèi)部ROM中; R0為片內(nèi)RAM區(qū)Hex數(shù)組指針; R1為片內(nèi)RAM區(qū)Asc數(shù)組指針; 數(shù)據(jù)塊長度放在寄存器R2中。代碼如下:
ORG 0000H
Hex EQU 40H
;內(nèi)部Hex送數(shù)據(jù)地址定義
Asc EQU 50H;查表后數(shù)據(jù)儲存地址定義
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
編者:方園
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI;送值函數(shù)
LCALL CHABIAO;查表函數(shù)
SJMP $
ORG 1000H;查表子程序 CHABIAO:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
ADD A,#20H
MOVC A,@A+PC
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET
編者:方園
TABLE:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
END
4.十進制數(shù)1-100累加運算
《單片機原理及應用實驗教程》(第2版)“第2章 實驗5”(P30)。編寫程序,實現(xiàn)以下功能:
【功能1】產(chǎn)生十進制數(shù)1~100,并存放在片外RAM中以1000H為首地址的Deci數(shù)組中?!竟δ?】對Deci數(shù)組元素進行累加運算,并將累加和存入內(nèi)部RAM中60H(存累加和低位)和61H(存累加和高位)單元。代碼如下: 方法一:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0
MOV R3,#0 LOOP1: INC A
DA A
XCH A,R3
ADDC A,#0
MOVX @DPTR,A
INC DPTR
XCH A,R3
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
POP DPL
編者:方園
POP DPH
POP 07H
RET
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
MOV R3,#0
LOOP2: INC DPTR
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOV A,#1
ADD A,61H
DA A
MOV 61H,A
POP DPL
POP DPH
POP 07H
RET
END
方法二:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
編者:方園
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
;送值子函數(shù)
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0 LOOP1: INC A
DA A
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
CLR A
ADDC A,#0
MOVX @DPTR,A
POP DPL
POP DPH
POP 07H
RET
;累加子函數(shù)
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
LOOP2:
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOVX A,@DPTR
ADD A,61H
DA A
編者:方園
MOV 61H,A POP DPL POP DPH POP 07H RET
END
5.DPTR指針應用
《單片機原理及應用實驗教程》(第2版)“第2章 實驗6”(P31)。編寫程序,實現(xiàn)以下功能:
【功能1】產(chǎn)生十進制數(shù)組Deci(1~99),并存放在片內(nèi)RAM中,Deci數(shù)組首地址為08H。【功能2】將Deci數(shù)組中的偶數(shù)元素全部送入外部RAM偶數(shù)區(qū),首地址為2000H;將Deci數(shù)組中的奇數(shù)元素全部送入外部RAM奇數(shù)區(qū),首地址為3000H;分別統(tǒng)計外部RAM偶數(shù)區(qū)和奇數(shù)區(qū)元素個數(shù)。代碼如下:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#70H
MOV R7,#99
MOV R0,#08H
MOV R5,#0
MOV R6,#0
LCALL STEP1
LCALL STEP2
SJMP $
STEP1: PUSH 00H
PUSH 07H
MOV A,#1 LOOP1: DA A
MOV @R0,A
INC R0
INC A
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
編者:方園
STEP2: MOV DPTR,#2000H
PUSH DPL
PUSH DPH
MOV DPTR,#3000H
MOV R3,DPH
MOV R4,DPL LP1: MOV A,@R0
MOV R2,A
JNB ACC.0,LOOP2
SJMP LOOP3
LOOP2: POP DPH
POP DPL
MOVX @DPTR,A
MOV A,R5
ADD A,#1
DA A
MOV R5,A
INC DPTR
PUSH DPL
PUSH DPH
SJMP NEXT
LOOP3: MOV DPH,R3
MOV DPL,R4
MOVX @DPTR,A
MOV A,R6
ADD A,#1
DA A
MOV R6,A
INC DPTR
MOV R3,DPH
MOV R4,DPL
SJMP NEXT
NEXT:
INC R0
DJNZ R7,LP1
POP DPH
POP DPL
RET
END
編者:方園
6.定時器應用實驗
DBUF EQU 30H ORG 0000H STRT: LJMP MAIN ORG 000BH LJMP PTF00 ORG 0030H MAIN: MOV DPTR,#5FFFH MOV A,#0DCH MOVX @DPTR,A MOV R5,#20 LP: MOVX A,@DPTR JNB ACC.7,LP MOV A,#00H MOVX @DPTR,A MOV A,#34H MOVX @DPTR,A MOV SP,#60H MOV R0,#39H MOV R7,#06H ML1: MOV @R0,#00H INC R0 DJNZ R7,ML1 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H MOV 40H,#10H ML0: LCALL DIR LJMP ML0 PTF00: PUSH PSW PUSH ACC SETB PSW.3 MOV TL0,#0B0H MOV TH0,#3CH
編者:方園
DJNZ R5,PTFY MOV R5,#20
MOV A,40H DEC A MOV 40H,A JNZ PTFY MOV 40H,#10H MOV R0,#39H MOV R7,#6 PTFX: MOV A,@R0 ADD A,#1 DA A MOV @R0,A CJNE A,#0AH,$+3 JC PTFY MOV @R0,#0 INC R0 DJNZ R7,PTFX PTFY: POP ACC POP PSW RETI DIR:
MOV R3,#06H MOV A,#92H MOV DPTR,#5FFFH MOVX @DPTR,A MOV R1,#39H TY11: MOV A,@R1 MOV DPTR,#CODE1 MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A
INC R1 DJNZ R3,TY11 RET
CODE1: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H,88H
編者:方園
DB 83H,0C6H,0A1H,86H,8EH,8CH DB 0C1H,89H,0C7H,0BFH,91H DB 00H,0FFH END
7.廣告燈實驗
ORG 0000H LJMP MAIN ORG 000BH LJMP DELAY ORG 0030H MAIN: MOV DPTR,#TAB MOV R5,#71H MOV R2,#00H MOV R6,#20 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H SJMP $ DELAY: MOV TL0,#0B0H MOV TH0,#2CH
DJNZ R6,LP ACALL STEP MOV R6,#20 DJNZ R5,LP MOV R5,#71H
LP: RETI
STEP: LOOP: MOV A,R2 MOVC A,@A+DPTR MOV P1,A INC R2 DEC R5
編者:方園
RET
TAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 0FFH,7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH
DB 0FEH,0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H
DB 80H,00H,80H,0C0H,0E0H,0F0H,0F8H,0FCH
DB 0FEH,0FFH,7FH,3FH,1FH,0FH,07H,03H
DB 01H,00H,01H,03H,07H,0FH,1FH,3FH
DB 7FH,0FFH,7EH,3CH,18H,00H,18H,3CH
DB 7EH,0FFH,0FEH,0FCH,0FCH,0F9H,0F3H,0E7H
DB 0CFH,9FH,3FH,7FH,0FFH,7FH,3FH,9FH
DB 0CFH,0E7H,0F3H,0F9H,0FCH,0FEH,0FFH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 80H,40H,20H,10H,08H,04H,02H,01H,00H
DB 01H,02H,04H,08H,10H,20H,40H,80H,00H
DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END
第二篇:單片機實驗總結
單片機原理及接口技術實驗總結
本學期的單片機實驗轉(zhuǎn)眼已到尾聲,共做了六項實驗,分別是KEIL4、ISP下載軟件的安裝于使用、P1口輸出循環(huán)燈實驗、P1口轉(zhuǎn)彎燈實驗、P3.3口輸入P1口輸出實驗和中斷實驗。在王承林老師的帶領與指導下,我們認真完成每次的實驗任務,并在實驗中拓展,去發(fā)現(xiàn)一些新的問題。
在這六項實驗中讓我刻骨銘心的是中斷實驗。中斷可以說是我的一個弱點,首先從概念上我理解比較含糊,理解能力差;其次,6個中斷源比較難記清,經(jīng)常記混,加之它們分配的寄存器存在太多的異同,工作方式更是讓人頭疼;再次,中斷的使用。中斷的精髓是在于使用,在電路設計中使用中斷來控制單片機的工作,使之更好的達到所需目的。我剛開始學習的時候連怎么使用中斷還是一無所知,后來我到圖書館里查找資料,慢慢的琢磨。至今學會了中斷源的4種工作方式,能簡單設計出中斷電路。雖然起步晚,但我相信能厚積薄發(fā),未來一定能熟練使用它們。
經(jīng)過學習單片機的中斷控制,我發(fā)現(xiàn)自己存在許多不足,但這些都困難無法阻擋我對單片機的追求。許多同學在做實驗時都抱著不良的心態(tài),他們只想照著實驗本的步驟原原本本把實驗完成就算大功告成,很少更深層次挖掘里面的奧秘,更有甚者是打醬油的,我不得不為他們?nèi)绱死速M那么好的學習機會感到可惜。我能為他們做的就是幫助他們講解一些單片機知識,有時教他們編寫程序。實驗室是培養(yǎng)高層次人才和開展科學研究的重要基地。邢臺學院對培養(yǎng)學生的動手能力是十分重視的,為了提高學生的動手能力,讓學生做相關實訓并完成單片機實驗,在實驗的形式上注重培養(yǎng)學生的實驗技能和動手能力。從單片機實驗中學生就可以總結出大量的經(jīng)驗以適應當代社會的發(fā)展。
學習單片機這門課程,要掌握單片機指令系統(tǒng)中匯編語言各種基本語句的意義及匯編語言程序設計的基本知識和方法,以及單片機與其他設備相連接的輸入輸出中斷等接口技術。使我從硬件軟件的結合上理論聯(lián)系實際,提高動手能力,從而全面掌握單片機的應用。
單片機課是一門實踐性很強的課程,僅有課堂上理論知識的學習,對運用好單片機是完全不夠的,必須親自做實驗,從實驗中吸取教訓,總結經(jīng)驗,增加實戰(zhàn)經(jīng)驗,加深對單片機的理解,更好的運用單片機。單片機實驗課的目的就是為學生提供做實驗的機會,讓學生能夠從幾個簡單的實驗中學會單片機開發(fā)的過程和單片機的實際運用。單片機實驗課讓我將課堂上學到的理論知識運用到實驗當中去,在實驗中發(fā)現(xiàn)問題,解決問題,強化理論知識的運用。下面是自己做實驗當中遇到的一些問題和體會。
首先,自己在實驗課上對老師講解的東西沒有很好的領會。自己覺得老師講的電路和原理自己都懂,就沒有認真聽老師的講解,但是當自己去理解程序和修改程序就發(fā)現(xiàn)自己對電路的工作原理和過程并不是很了解,使得自己在改編程序?qū)崿F(xiàn)不同功能時遇到較多的問題。
其次,自己對匯編語言的運用不是很熟練。自己之前接觸和使用的編程語言都是諸如C語言等的高級語言,對匯編語言基本上是空白狀態(tài)。雖然每個實驗老師都給出了參考程序,但是自己理解整個程序的運行過程和程序的功能依然遇到了比較大的困難。這就說明基礎薄弱是實驗中最大的問題。
最后,也是最突出的一個問題。自己邏輯思維和分析問題的能力比較欠缺。對程序的分析能力不足,不能夠很好的理解程序段之間的邏輯關系。同時,自己對實驗中遇到的問題不能及時分析并找出解決的辦法,知識一味的依賴老師的指導和同學的幫助。這也提醒自己,只有多加強鍛煉,才能不斷提高這方面的能力。
六周的時間說短不短,說長不長,因為在這個不同尋常的六周時間里,我除了做實驗,還到圖書管理查閱了許多與單片機相關的書籍,學習用C語言編寫程序,艱苦奮斗,使我在單片機學習上有了質(zhì)的飛躍。現(xiàn)在的我雖然不是學習最好的,可是我已經(jīng)改變過去一事無成的我,如今站在大家面前是個全新的我。我始終夢想著以后自己能在單片機行業(yè)上有所建樹,經(jīng)過自己的雙手創(chuàng)造無價的財富,成就感伴隨終生。
身存在的不足之處。而且這也激發(fā)了我今后努力學習的興趣。
發(fā)現(xiàn)問題、提出問題、分析問題、解決問題和實踐能力的提高都會受益于我在以后的學習、工作和生活中。
1、不管做什么事,計劃是很重要的。沒有一個完好的計劃,做事情就會沒有一個好的順序,做事情會比較亂,很難成功。而有一個好的計劃,不管做什么事都會事半功倍,做事心中有數(shù),明確重點和緩急,不會有疏漏。這樣才能提高成功率。
2、做事要多動腦,選出最好的方法。一件事往往有多種解決方法,一個好的方法,不僅能使事情事半功倍,而且往往決定最后的成與敗,所以做事時一定要多動一下腦筋,想出最好的方法。
3、要注意細節(jié)。細節(jié)決定成敗,這句話在這次課題中不僅一次得到了印證,特別是在軟件的編程過程中,一點點的錯誤就會使你整個程序不能運行。因此我們不僅僅要有整體意識,也要注意細節(jié),不要因一個關鍵地方的一個細節(jié)而導致滿盤皆輸。
4、最后,也是最重要的一點,通過這次課題,我們學到了很多有關單片機方面的知識,也對單片機有了更深入的了解。使我們受益匪淺。
總之,親自動手是課堂學習的延續(xù),電子領域隨時隨地都在發(fā)生著翻天覆地的變化,現(xiàn)有的知識儲備總是落后于科技的發(fā)展腳步,我們只有不斷學習新知識,才能做到面對新課題時游刃有余。
感謝王承林老師的教育指導!
教會我單片機應用技術,使我受益終生。
第三篇:單片機實驗
實驗
一、MCS51單片機基本開發(fā)環(huán)境
1. 實驗目的:
1)熟悉軟件的集成開發(fā)環(huán)境 2)掌握單片機軟件設計流程
3)掌握單片機存貯器結構及各窗口之間的聯(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)試,沒有對結果進行檢驗。其中值得注意的是對于布爾(位)操作指令的用法,比如傳送指令必須經(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)槎嗌??從哪些窗口可以發(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)試,也不清楚該如何觀察結果,沒有一個整體的概念,所以在了解其開發(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為首的存儲單元中(低位),求其對應項之和(帶進位位),結果放在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無輸出。
第五篇:數(shù)據(jù)庫上機實驗總結(含代碼)
實驗一
(1)無條件單表查詢
select sname NAME,'year of birth:' BIRTH,2004-sage BIRTHDAY,LOWER(sdept)DEPARTMENT FROM student;(2)有條件單表查詢
SELECT sname,sdept,sage FROM student WHERE sage NOT BETWEEN 20 AND 23;(3)單表嵌套(一層)查詢
SELECT sno,sname,sdept FROM student WHERE sdept IN(SELECT sdept FROM student WHERE sname='劉晨');(4)復合條件多表查詢
SELECT student.sno,sname,cname,grade FROM student ,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno;(5)使用COUNT()的單表查詢 SELECT COUNT(*)FROM student;(6)使用AVG()的單表查詢
SELECT AVG(grade)'平均成績' from SC where CNO='1';(7)查詢結果分組
SELECT cno,COUNT(sno)'人數(shù)' FROM sc GROUP BY cno;(8)查詢結果排序
SELECT * FROM student ORDER BY sdept,sage DESC;(9)使用通配符的查詢
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'劉%';(10)使用換碼字符的單表查詢
SELECT cno,ccredit FROM course WHERE cname LIKE 'DB_Design'ESCAPE'';(11)插入單個元組 插入一個新學生元組
Insert into student(sno,sname,ssex,sdept,sage)values('200215128','陳冬','男','IS',18)(12)插入子查詢結果
對每一個系,求學生平均年齡,并把結果存入數(shù)據(jù)庫 Create table dept_age(sdept char(15),avg_age int)Insert into dept_age(sdept,avg_age)select sdept,avg(sage)from student group by sdept(13)修改某個元組的值
將學生200215121的年齡改為22歲
Update student set sage=’22’ where sno=’200215121’(14)修改多個元組的值 將所有學生的年齡增加一歲 Update student set sage=sage+1(15)刪除一個元組的值 刪除學號為200215128的學生記錄
delete from student where sno='200215128'(16)建立視圖 建立信息系學生的視圖
create view is_student as select sno,sname,sage from student where sdept='IS' ×(17)查詢視圖
查詢選修了1號課程的信息系學生信息
Select is_student.sno,sname from is_student,sc where is_student.sno=sc.sno and sc.cno=’1’ ×(18)更新視圖
將信息系學生視圖is_student中學號為95001的學生姓名改為李楠 update is_student set sname='李楠' where sno='95002' 將下列問題用SQL命令表示:
1.查詢‘IS’系學生的學號、姓名、性別。
SELECT sno,sname,ssex FROM student WHERE sdept='IS';2.查詢‘IS’系年齡在20歲以下的學生。
SELECT * FROM student WHERE sdept='IS'AND sage<20;3.查詢所有不姓‘劉’的學生的學號、姓名、性別。
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'劉%';4.查詢student表中學生的總?cè)藬?shù)。
SELECT COUNT(*)'總?cè)藬?shù)' FROM student;5.查詢和‘李勇’同性別的所有同學的姓名。
SELECT sname from student where ssex in(select ssex from student where sname='李勇');6.查詢和‘李勇’同性別并同系的所有同學的姓名。
Select sname from student where ssex in(select ssex from student where sname='李勇')and sdept in(select sdept from student where sname='李勇')7.查詢選修2號課程的學生的學號。Select sno from sc where cno='2' 8.求3號課程的平均成績。
Select avg(grade)from sc where cno=’3’ 9.查詢選修2號課程的學生的最高分。Select max(grade)from sc where cno=’2’
10.按成績降序排列,輸出‘IS’系學生選修了2號課程的學生的姓名和成績。
Select sname,grade from student,sc where sdept='IS' and cno='2' and student.sno=sc.sno order by grade desc SQL查詢分析器下建數(shù)據(jù)庫的命令代碼: create database 霍雙雙200826352 on(name='霍雙雙200826352_data',filename='E:
霍霍
雙雙
雙雙
***5
霍霍
雙雙
雙雙200826352_data.mdf',size=10mb,maxsize=50mb,filegrowth=10%)log on(name='霍雙雙200826352_log',filename='E:200826352_log.ldf',size=10mb,maxsize=50mb,filegrowth=10%)在查詢分析器重建立各表的命令代碼: 建立student表:
create table student(sno char(5)primary key,sname char(20),ssex char(2),sage int,sdept char(15))建立course表:
create table course(cno char(2)primary key,cname char(15),cpno char(2),ccredit int)建立cs表:
use 霍雙雙200826352 create table sc(sno char(5),cno char(2),grade smallint,primary key(sno,cno),foreign key(sno)references student(sno),foreign key(cno)references course(cno))實驗二
T-SQL查詢、存儲過程、觸發(fā)器、完整性上機作業(yè)題 第一部分 :T-SQL程序設計
(1).如果3號課程的平均成績在80分以上,則輸出“3號課程成績良好”,否則輸出“3號成績一般” declare @avg float set @avg=(select avg(grade)from sc where cno='3')if @avg>80print'3號課程成績良好'else print'3號成績一般'(2)計算并輸出95003號學生的平均成績,若無該生信息,則顯示“該生未選課”,提示信息.declare @avg float if(select count(*)from sc where sno='95003')=0 print '該生未選課' else begin select @avg=avg(grade)from sc where sno='95003' print'95003號學生平均成績' print @avg end(3).如果有成績在90分以上的學生,則顯示他的學號,課程和成績,否則顯示“沒有學生的課程成績在90分以上”提示信息
declare @text char(10)if exists(select grade from SC where grade>90)select Sno,Cno,Grade from SC where Grade>90 else begin set @text='沒有學生的課程成績在90分以上' print @text end ×(4).利用游標逐行顯示student表中的記錄。
declare stu cursor for select *from student open stu fetch next from stu while @@fetch_status=0 fetch next from stu close stu deallocate stu(5).用自定義函數(shù)計算全體男生的平均年齡
create function avg_age(@sex char(2))returns int as begin declare @aver int select @aver=(select avg(Sage)from Student where Ssex=@sex)return @aver end go declare @aver1 int,@sex char(2)set @sex='男' select @aver1=dbo.avg_age(@sex)select @aver1 as '全體男生的平均年齡' go(6).顯示course表中課程名的前2個字符。select substring(Cname,1,2)from Course(7).在一列中顯示student中各元組的學號中的年級,列名顯示為“年級”;另一列中顯示學號中的學生序列號,列名顯示為“序號”。
select substring(Sno,1,2)年級,substring(Sno,3,len(Sno)-1)序號 from Student order by Sno(8).在選課表中顯示學號、課程號,并根據(jù)成績:0-59顯示“不合格”;60-79顯示“合格”;80-89顯示“良好”;90-100顯示“優(yōu)秀?!?/p>
select Sno as '學號',Cno as '課程號', grade =case when Grade<=59 then '不合格' when Grade>=60 and Grade<=79 then '合格' when Grade>=80 and Grade<=89 then '良好' else '優(yōu)秀' end from SC 第二部分 :存儲過程
(1)創(chuàng)建一個為worker表添加職工記錄的存儲過程Addworker go
if exists(select name from sysobjects where name='Addworker' and type='P')drop procedure Addworker go create proc Addworker @職工號 char(4),@姓名 char(8),@性別 char(2),@出生日期 datetime,@黨員否 char(2),@參加工作 datetime,@部門號 char(4)as insert into worker(職工號,姓名,性別,出生日期,黨員否,參加工作,部門號)values(@職工號,@姓名,@性別,@出生日期,@黨員否,@參加工作,@部門號)go exec Addworker '16','王璐','女','1988-11-20','否','2010-08-21','11'(2)創(chuàng)建一個存儲過程Delworker刪除worker表中指定職工號的記錄 go
if exists(select name from sysobjects where name='Delworker' and type='P')drop procedure Delworker go create procedure Delworker @職工號 char(4)as delete from worker where 職工號=@職工號
go exec Delworker '16'(3)顯示存儲過程Delworker的定義信息。Sp_helptext Delworker(4)刪除存儲過程Addworker和Delworker。drop procedure Addworker, Delworker(5)創(chuàng)建并執(zhí)行以下存儲過程:
a.從數(shù)據(jù)庫表中查詢,返回學生學號、姓名、課程名、成績 use 霍雙雙200826351 go if exists(select name from sysobjects where name='select_stu' and type='P')drop procedure select_stu go create procedure select_stu as select SC.Sno,Sname,Cname,Grade from Student,SC,Course where SC.Sno=Student.Sno and SC.Cno=Course.Cno go exec select_stu b.從數(shù)據(jù)庫表中查詢指定學號的學生學號,姓名,該存儲過程接受與傳遞參數(shù),精確匹配的值 use 霍雙雙200826351 go if exists(select name from sysobjects where name='select_sno' and type='P')drop procedure select_sno go create procedure select_sno @Sno char(5)as select Sno,Sname from Student where Sno=@Sno go exec select_sno '95002' ×第三部分:觸發(fā)器
(1)在表depart上創(chuàng)建一個觸發(fā)器 depart_update , 當更改部門號時同步更改 worker表中對應的部門號。Go If exists(select name from sysobjects where name='depart_update'and type='tr')drop trigger depart_update go Create trigger depart_update on depart for update as set worker.部門號=(select 部門號 from inserted)where worker.部門號=(select 部門號from deleted)(2)在表worker上創(chuàng)建一個觸發(fā)器worker_delete,當刪除職工記錄時同步刪除salary表中對應的職工記錄。Go If exists(select name from sysobjects where name='worker_delete'and type='tr')drop trigger worker_delete go create trigger worker_delete on worker for delete as delete salary where salary.職工號=(select 職工號 from deleted)(3)刪除觸發(fā)器depart_update(4)刪除觸發(fā)器worker_delete(5)在數(shù)據(jù)庫中創(chuàng)建一個觸發(fā)器,向選課表添加一條紀錄時,檢查該紀錄的學號在學生表中是否存在,檢查該紀錄的課程號在課程表中是否存在,若其中有一項為否,則拒絕添加操作,并顯示“違反數(shù)據(jù)一致性”提示信息。Go If exists(select name from sysobjects where name='add_student'and type='tr')drop trigger add_student go
create trigger add_student on sc for insert as go 第四部分:數(shù)據(jù)庫完整性
1、實施worker表的“性別”字段默認值為“男”的約束 create default default_sex as '男' go sp_bindefault'default_sex','worker.性別'
2、實施salary表的“工資”字段值在0~9999的約束、create rule salary_rule as @salary='[0~9999]' go sp_bindrule 'salary_rule','salary.工資'
3、實施depart表的“部門號”字段值唯一的非聚集索引的約束
4、為worker表建立外鍵“部門號”,參考表depart的“部門號”列。
5、建立一個規(guī)則 sex:@性別=’男’OR @性別=’女’,將其綁定到worker表的“性別”列上。Create rule sex as @性別='男'OR @性別='女' Go Sp_bindrule 'sex','worker.性別'
6、刪除1小題所建立的約束。
7、刪除2小題所建立的約束。
8、刪除3小題所建立的約束
9、刪除4小題所建立的約束
10.解除5小題所建立的綁定并刪除規(guī)則sex