第一篇:微機(jī)原理實驗三子程序設(shè)計實驗
實驗三 子程序設(shè)計實驗
一、實驗?zāi)康?/p>
1.學(xué)習(xí)子程序的定義和調(diào)用方法。2.掌握子程序的程序設(shè)計、編制及調(diào)用。
二、實驗設(shè)備
TDN86/88教學(xué)實驗系統(tǒng)一臺
三、實驗內(nèi)容及步驟
1.求無符號字節(jié)序列中的最大值和最小值
設(shè)有一字節(jié)序列,其存儲首址為3000H,字節(jié)數(shù)為08H。利用子程序的方法編程求出該序列中的最大值和最小值。實驗程序及流程如下:
主程序STACK1SEGMENT STACK
開始DW 64 DUP(?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE START: MOV SI,3000H MOV CX,0008H CALL branch A1:JMP A1 branch: JCXZ A4 PUSH SI PUSH CX PUSH BX
結(jié)束序列的字節(jié)個數(shù)→CX數(shù)據(jù)區(qū)首址→SI調(diào)用求最大最小值子程序 MOV BH,[SI] MOV BL,BH A1: LODSB CMP AL,BH JBE A2 MOV BH,AL JMP A3 A2: CMP AL,BL JAE A3
Y子程序CX=0?NSI、CX、BX入棧[SI]→BHBH→BLSI+1→SI[SI]→ALNAL﹤BHAL→BHMOV BL,AL A3: LOOP A1 MOV AX,BX POP BX POP CX
YAL﹥BLYCX-1→CXNNAL→BLCX=0?POP SI A4: RET CODE ENDS END START
實驗步驟
(1)輸入源程序,進(jìn)行編譯、鏈接和加載。
YSI、CX、BX出棧RET
(2)在調(diào)試區(qū)鍵入E0000:3000↙,輸入8個字節(jié)的數(shù)據(jù):D9、07、8B、C5、EB、04、9D、F9。
(3)運行程序,查看結(jié)果,在調(diào)試區(qū)鍵入R AX↙,顯示結(jié)果應(yīng)為AX=F9 04,AH中為最大值,AL中為最小值。
2.?dāng)?shù)組求和
設(shè)有一字節(jié)序列(存儲地址和字節(jié)數(shù)可自定義),編寫程序,求出該序列的和,求和工作由子程序來實現(xiàn)。
程序:
STACK1 SEGMENT STACK DW 64 DUP(?)STACK1 ENDS CODE
SEGMENT ASSUME CS:CODE START: MOV SI,3000H MOV CX,0008H XOR AX,AX CALL branch A5: JMP A5 branch: JCXZ A4 PUSH SI
PUSH CX A1: ADD AL,[SI] INC SI A3: LOOP A1
POP CX POP SI A4: RET CODE
ENDS END START
8個01,總和為08
第二篇:微機(jī)原理實驗總結(jié)
微機(jī)原理實驗總結(jié)
不知不覺,微機(jī)原理與接口技術(shù)實驗課程已經(jīng)結(jié)束了?;叵肫饋硎芤娣藴\,主要是加深了對計算機(jī)的一些硬件情況和運行原理的理解和匯編語言的編寫匯編語言,對于學(xué)習(xí)機(jī)電工程的自動控制和計算機(jī)都是很重要的,因為它是和機(jī)器語言最接近的了,如果用它來編程序的話,會比用其它高級語言要快得多。本學(xué)期我們在老師的帶領(lǐng)下,進(jìn)行了微機(jī)原理實驗六到十這五組實驗。它們分別是: 實驗六
8255 PA口控制PB口
實驗?zāi)康恼莆諉纹瑱C(jī)系統(tǒng)中擴(kuò)展外圍芯片的方法,了解 8255 芯片的結(jié)構(gòu)及編程方法。實驗內(nèi)容
用 8255 PA 口作開關(guān)量輸入口,PB 口作輸出口。
實驗步驟
1、用8 芯線將8 255 PA口接至開關(guān)Kl~K8,PB口接至發(fā)光二極管L1~L8;
2、運行程序 HW06.ASM,撥動開關(guān)K1~K8,觀察L1~L8發(fā)光二極管是否對應(yīng)點亮。
實驗七
8255控制交通燈
實驗?zāi)康倪M(jìn)一步了解8 255 芯片的結(jié)構(gòu)及編程方法,學(xué)習(xí)模擬交通控制的實現(xiàn)方法。
實驗內(nèi)容
用8255 做輸出口,控制六個發(fā)光二極管燃滅,模擬交通燈管理。
實驗步驟
1、用雙頭線將 8 255 PA0~PA2 口接至發(fā)光二極管L3~L1,PA3~PA5口接至發(fā)光二極管L7~L5;
2、執(zhí)行 程序HW07.ASM,初始態(tài)為四個路口的紅燈全亮,之后,東西路口的綠燈亮,南北路口的紅燈亮,東西路口方向通車,延時一段時間后東西路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次后,東西路口紅燈亮,而同時南北路口的綠燈亮,南北路口方向開始通車,延時一段時間后,南北路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次后,再切換到東西路口方向,之后重復(fù)以上過程。實驗八
簡單I /O口擴(kuò)展
實驗?zāi)康膶W(xué)習(xí)單片機(jī)系統(tǒng)中擴(kuò)展簡單I/O 口的方法; 學(xué)習(xí)數(shù)據(jù)輸入輸出程序的編制方法。實驗內(nèi)容
利用74LS244 作為輸入口,讀取開關(guān)狀態(tài),并將此狀態(tài),通過74LS273再驅(qū)動發(fā)光二極管顯示出來。
五、實驗步驟
1、用8 芯線將Y0~Y7接至開關(guān)K1~K8,Q0~Q7 接至發(fā)光二極管L1~L8,用雙頭線將 CS1 接至8 000 孔,CS2 接至9 000 孔,用8 芯線將J X0 接至JX7(D0~D7數(shù)據(jù)線);
2、執(zhí)行程序 HW08.ASM,按動開關(guān)K1~K8,觀察發(fā)光二極管L1~L8是否對應(yīng)點亮。
實驗九
A/D 0809轉(zhuǎn)換實驗
實驗?zāi)康模┱莆誂/D 轉(zhuǎn)換與單片機(jī)接口的方法;)了解A/D 芯片0809轉(zhuǎn)換性能及編程方法;)通過實驗了解單片機(jī)如何進(jìn)行數(shù)據(jù)采集。實驗內(nèi)容
利用實驗系統(tǒng)上的 0809 做A /D 轉(zhuǎn)換器,實驗系統(tǒng)上的電位器提輸入,編制程序,將模擬量轉(zhuǎn)換成數(shù)字,通過數(shù)碼管顯示出來。實驗步驟
1、用雙頭線將可調(diào)電壓區(qū)的VOUT接至ADC0809 模數(shù)轉(zhuǎn)換區(qū)的IN0,可調(diào)電壓區(qū)的VIN 接至電源+5V,ADC0809 模數(shù)轉(zhuǎn)換區(qū)的CS4 接至系統(tǒng)接口區(qū)的8000H 端口,ADC0809模數(shù)轉(zhuǎn)換區(qū)的WR接至系統(tǒng)接口區(qū)的/IOWR端口,ADC0809 模數(shù)轉(zhuǎn)換去的 RD 接至系統(tǒng)接口區(qū)的/IORD,ADC0809 模數(shù)轉(zhuǎn)換區(qū)的ADDA、ADDB、ADDC接至G ND,CLK接至單脈沖與時鐘區(qū)的500K,用8 芯線將數(shù)據(jù)總線JX0 接至A DC0809模數(shù)轉(zhuǎn)換區(qū)的JX6;
2、運行程序 HW09.ASM,數(shù)碼管上顯示0809.XX,后二位顯示當(dāng)前采集的電壓轉(zhuǎn)換的數(shù)字量,調(diào)節(jié)可調(diào)電壓,該二位將隨著電壓變化而相應(yīng)變化,變化范圍為00至FF。
實驗十
D/A 0832轉(zhuǎn)換實驗
實驗?zāi)康模?)了解D/A 轉(zhuǎn)換與單片機(jī)的接口方法;
(2)了解D/A 轉(zhuǎn)換芯片 0832 的性能及編程方法;
(3)了解單片機(jī)系統(tǒng)中擴(kuò)展D/A 轉(zhuǎn)換芯片的基本方法。
實驗步驟
1、用雙頭線將DAC0832 數(shù)模轉(zhuǎn)換區(qū)的CS5 端口接至系統(tǒng)接口區(qū)的8000H端口,WR端口接至系統(tǒng)接口區(qū)的/IOWR端口,AOUT輸出接電壓表或小直流電機(jī)DJ,用8 芯線將DAC0832 數(shù)模轉(zhuǎn)換區(qū)的JX2 接至數(shù)據(jù)總線JX0
2、運行程序HW10.ASM,數(shù)碼管上顯示不斷加大或減小的數(shù)字量,數(shù)字變化范圍 00 到FF,用萬 用表測試 D/A 輸出孔 AOUT 應(yīng)能測出不斷加大或減小的電壓值,電壓變化范圍 0V 到5V。
這次實驗課程加深了我們對匯編語言指令的熟悉和理解。不僅鞏固了書本所學(xué)的知識,還具有一定的靈活性,發(fā)揮了操作,加深了我們對硬件的熟悉,鍛煉了動手能力,發(fā)揮創(chuàng)造才能。
通過這次課程使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。
這門課程可以闡明微處理器,匯編語言程序設(shè)計,計算機(jī)結(jié)構(gòu)和操作系統(tǒng)等基本概念。詳盡地論述了有關(guān)微處理器及其指令系統(tǒng)的概念和程序設(shè)計方法,介紹構(gòu)成微型計算機(jī)的存儲器,接口部件,總線等各項技術(shù)。.微機(jī)的最基礎(chǔ)語言--匯編語言是一個最基礎(chǔ)最古老的計算機(jī)語言,依賴于計算機(jī)的低級程序設(shè)計語言。匯編語言是我們理解整個計算機(jī)系統(tǒng)的最佳起點和最有效途徑。匯編是對寄存的地址,以及數(shù)據(jù)單元進(jìn)行最直接的修改,而在某些時候,這種方法的確是最有效,也是最可靠的.然而有優(yōu)點,自然也就有缺點,最重要的一點就是匯編語言很繁瑣,對某個數(shù)據(jù)進(jìn)行修改時,本來很簡單一個操作會用很多條繁瑣的語句來解決,而這些語句本身在執(zhí)行和操作的過程中,占用大量的時間和成本。并有大量的程序和硬件設(shè)計類題目,使我們能夠深入了解計算機(jī)的原理、結(jié)構(gòu)和特點,以及如何運用這些知識來設(shè)計一個實用的微型計算機(jī)系統(tǒng)。具體來說,就是掌握Intel8086/8088微型計算機(jī)系統(tǒng)地組成原理,熟練運用8086宏匯編語言進(jìn)行程序設(shè)計,熟悉各種I/O接口芯片的配套使用技術(shù),并通過一定的課程實驗與實踐,進(jìn)一步提高系統(tǒng)設(shè)計的能力,使學(xué)生能夠完成實用的微型計算機(jī)系統(tǒng)的軟硬件設(shè)計。
學(xué)習(xí)該門課程知識時,其思維方法也和其它課程不同,該課程偏重于工程思維,具體地說,在了解了微處理器各種芯片的功能和外部特性以后,剩下額是如何將它們用于實際系統(tǒng)中,其創(chuàng)造性勞動在于如何用計算機(jī)的有關(guān)技術(shù)和廠家提供的各種芯片,設(shè)計實用的電路和系統(tǒng),再配上相應(yīng)的應(yīng)用程序,完成各種實際應(yīng)用項目。
這次實驗并不是很難,主要的困難來自對程序的理解。我們最后對實驗的原理有了清晰的認(rèn)識。讓我們知道了實驗臺上各個模塊的用法;而且它還讓我們對自己動手寫程序來控制實驗臺的運作有了一定的基礎(chǔ)。雖然實驗臺只是一個小型的模擬平臺,但是通過對它的學(xué)習(xí)和操作,我們對有關(guān)接口的知識將會有一個更廣泛的認(rèn)識,而且它對我們以后的學(xué)習(xí)也會有幫助的。
實驗中個人的力量是不及群體的力量的,我們分工合作,做事的效率高了很多。雖然有時候會為了一些細(xì)節(jié)爭論不休,但最后得出的總是最好的結(jié)論。而且實驗也教會我們在團(tuán)隊中要善于與人相處,與人共事,不要一個人解決所有問題??傊?,這次課程設(shè)計對于我們有很大的幫助,通過課程設(shè)計,我更加深入地理解了,微機(jī)原理課程上講到的各種芯片的功能,以及引腳的作用,同時加深了對于主要芯片的應(yīng)用的認(rèn)識,同時在試驗室的環(huán)境里熟悉了匯編程序的編寫過程和運行過程,最后還提高了自己的動手能力 對課程設(shè)計的建議
本次課程設(shè)計的幾個實驗相對都比較簡單,而且經(jīng)過老師的講解以及實驗書上的指導(dǎo),幾乎把我們要用到的程序和實驗臺電路的接線方法都告訴我們了,所以做起來很容易。
實驗過程中,獲得了很多收獲,獲得了很多感悟,當(dāng)然也遇到了很多困難。但我們都一一克服了他們,成功的完成了實驗。并在解決問題,克服困難的過程中,發(fā)現(xiàn)了自己平時忽略的,隱藏的問題,以及一些不該出現(xiàn)的粗心大意的小毛病。通過這些,我們認(rèn)識的更加深刻,了解的更加深入。做到了學(xué)以致用,對知識掌握得更加牢固。通過了這一學(xué)期對微機(jī)原理的學(xué)習(xí),真的對它有了一個全新的認(rèn)識,我會堅持對它的學(xué)習(xí),使自己在匯編語言上有一個長足的提高!
第三篇:微機(jī)實驗心得
微機(jī)實驗心得
這學(xué)期通過對微機(jī)原理和微機(jī)實驗課的學(xué)習(xí),對微機(jī)系統(tǒng)和它的工作原理有了很大的了解。微機(jī)實驗課,總共做了十幾個實驗,回想起來受益匪淺,主要是加深了對計算機(jī)的一些硬件情況和運行原理的理解和匯編語言的編寫匯編語言,它是和機(jī)器語言最接近的,用它來編程序,會比用其它高級語言要快得多。實驗課程加深了我們對匯編語言指令的熟悉和理解。不僅鞏固了書本所學(xué)的知識,還具有一定的靈活性,發(fā)揮了操作,加深了我們對硬件的熟悉,鍛煉了動手能力,發(fā)揮創(chuàng)造才能。
通過這次課程使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。
對于這門課,我們收獲了很多,我覺得這門課偏重于工程思維,主要難點在于對程序的理解。但是老師讓我們通過手打程序,控制實驗平臺很好的理解了各實驗的實驗程序。對于課程的建議,實驗講義給的程序很清楚,大大降低了實驗預(yù)習(xí)和自主編程的難度,給實驗講義可以更多的給方法和方式,提供一些程序建議而減少直接給出程序內(nèi)容。實驗課上,請一個或兩個同學(xué)講解一下實驗程序設(shè)計思路,通過講解與其他人互動,可以收獲更多。微機(jī)原理課程上講到的各種芯片的功能,以及引腳的作用,在實驗中都得到了運用,使我們加深了對于主要芯片的應(yīng)用的認(rèn)識,同時在實驗室的環(huán)境里熟悉了匯編程序的編寫過程和運行過程,最后還提高了自己的動手能力??偨Y(jié)這門課,個人感覺很有必要,學(xué)習(xí)理論的過程中邊通過實驗輔助,使我們更容易的接受微機(jī)原理的知識。實驗過程中,獲得了很多收獲,獲得了很多感悟,當(dāng)然也遇到了很多困難。但我們都一一克服了他們,成功的完成了實驗。并在解決問題,克服困難的過程中,發(fā)現(xiàn)了自己平時忽略的,隱藏的問題,以及一些不該出現(xiàn)的粗心大意的小毛病。通過這些,我們認(rèn)識的更加深刻,了解的更加深入。做到了學(xué)以致用,對知識掌握得更加牢固。
這學(xué)期的課程告一段落,但是對微機(jī)原理的理解和認(rèn)識,我深知我們做的還遠(yuǎn)遠(yuǎn)不夠,我們接下來還要繼續(xù)努力多學(xué)習(xí)更多知識,當(dāng)然動手實踐很重要,我們平時也應(yīng)該多編寫多運用。通過了這一學(xué)期對微機(jī)原理的學(xué)習(xí),真的對它有了一個全新的認(rèn)識,我會堅持對它的學(xué)習(xí),使自己在匯編語言上有一個長足的提高!
第四篇:微機(jī)原理與接口技術(shù)實驗總結(jié)
微機(jī)原理與接口技術(shù)實驗總結(jié)
11107108
徐寒黎
一、實驗內(nèi)容以及設(shè)計思路
1、①試編寫一程序,比較兩個字符串STRING1、STRING2 所含字符是否相同,若相同輸出“MATCH”,若不相同輸出 “NO MATCH”。設(shè)計思路:定義一個數(shù)據(jù)段,在數(shù)據(jù)段中定義兩個字符串作為STRING1、STRING2以及幾個用于輸入提示的和輸出所需內(nèi)容的字符串,定義一個堆棧段用于存放,定義代碼段。關(guān)鍵步驟以及少量語句:第一步將STRING1和STRING2都實現(xiàn)用鍵盤輸入,方法是
MOV DX,OFFSET STRING2 MOV AH,0AH INT 21H 并且顯示在顯示器上,顯示方法將0AH改成09H,語句與上面類似。然后進(jìn)行比較第一個單元,MOV AL,[STRING1+1] CMP AL,[STRING2+1] JNZ NOMATCH 若字符串長度不等,則直接跳轉(zhuǎn),輸出輸出 “NO MATCH”; 若長度相等再逐個比較 LEA SI,[STRING1+2] LEA DI,[STRING2+2] MOV CL,[STRING1+1] MOV CH,0 CLD REPE CMPSB JCXZ MATCH,意思是全部相同就跳轉(zhuǎn)MATCH,輸出“MATCH”;不然進(jìn)入下面的NOMATCH。退出。
②試編寫求級數(shù)1^3+2^3 +3^3 …..前幾項和剛大于10000的程序。
設(shè)計思路:原先編寫的程序,設(shè)定和為10000,結(jié)果是14。但要求高一點的話,可以自己設(shè)置,實現(xiàn)用鍵盤輸入和的值。
一個難點是將輸入的ASCII碼字符串,轉(zhuǎn)換成與之相同的十進(jìn)制數(shù)的數(shù)值。關(guān)鍵的思路部分是:從1開始求級數(shù),將和的值存在AX里,要加下一項級數(shù)前,比如這時已經(jīng)加到4,PUSH一下AX,然后將5乘三遍,將乘積MOV到BX里,再POP AX,然后將BX的值加到AX里,然后將AX與N比較,如果比N小就繼續(xù)上述步驟,知道剛比N大就輸出數(shù)字。
③試編寫一程序,完成字符串中各字符出現(xiàn)頻度的統(tǒng)計,統(tǒng)計結(jié)果在屏幕上輸出。
設(shè)計思路:因為這個程序需要統(tǒng)計所有的字符,所以首先要定義一個存儲區(qū),用來存放26個字符以及每個字符出現(xiàn)的個數(shù)。用鍵盤控制輸入字符串以后,將字符串的第一個字符與這二十六個字符逐個比較,若有相同,在存放相應(yīng)次數(shù)的存儲單元的值上加1。然后比較第二個字符,依次類推,將字符串里的字符全部比較完。將個數(shù)大于1的字符以及字符的個數(shù)都輸出到屏幕上。退出語句。缺點和不足:這樣需要定義一個非常繁的存儲區(qū)??梢愿鶕?jù)輸入的字符,然后進(jìn)行比較和統(tǒng)計。
④設(shè)計一個動畫程序。
設(shè)計思路:這個程序參考了網(wǎng)上的資料,沒有什么新意,是小鳥的圖形,可以用上下左右鍵進(jìn)行移動,可以退出。
步驟:首先設(shè)置堆棧段,數(shù)據(jù)段,代碼段,設(shè)置顯示方式等一些屬性,設(shè)置背景色,設(shè)置小鳥的初始位置以及寫出小鳥圖形的像素的點。功能性的語句是,用鍵盤接受一個輸入,將其與1bh比較,用JZ語句跳轉(zhuǎn)到退出。若不是便與48h比較,看是否為向上,是則跳轉(zhuǎn)到相應(yīng)語句,不是則繼續(xù)與50h比較;,看是否向下,是則跳轉(zhuǎn)到關(guān)于向下移動的相關(guān)語句,否則再與4bh比較,看是否向左,依次類推,根據(jù)鍵盤輸入的上下左右跳轉(zhuǎn)到不同的語句。再將小鳥的位置進(jìn)行與上下左右鍵的輸入相應(yīng)的移動。
最后編寫好退出語句。
2、硬件接口主要是了解8255與8253的功能,以及控制字。①I/O地址譯碼
只要對硬件概念清晰,很簡單的。基本上沒有什么創(chuàng)造性。收獲:熟悉實驗箱結(jié)構(gòu),了解每部分元件和標(biāo)注的意義。掌握I/O地址譯碼電路的工作原理。②可編程定時器8253 1,對照實驗電路圖,將計數(shù)器0設(shè)置為方式0,即數(shù)初值設(shè)為N(N<0fh),用手動逐個輸入單脈沖,編程使計數(shù)值在屏幕上顯示,并用邏輯筆觀察OUT0點平變化。
2,將計數(shù)器0、計數(shù)器1分別設(shè)置為方式3,計數(shù)初值設(shè)為1000用邏輯筆觀察out1輸出電平的變化。
收獲:掌握8253的基本工作原理和編程方法
③并行接口8255 1,試驗電路如圖所示,8255C口接邏輯電平開關(guān)K0~K7,A口接LED顯示電路L0~L7。3,數(shù)碼管靜態(tài)顯示:按下圖接好電路,將8255A口PA0~PA6分別與七段數(shù)碼管的段碼驅(qū)動輸入端a~g相連,位碼驅(qū)動輸入端S1接5V(選中),S0和dp接地(關(guān)閉)。編程從鍵盤輸入一位十進(jìn)制數(shù)(0-9),在七段數(shù)碼管上顯示。
4,數(shù)碼管動態(tài)顯示:按下圖接好電路,七段數(shù)碼管的連接不變,位碼驅(qū)動輸入端S1、S0接8255 C口的PC1和PC0。編程在兩個數(shù)碼管上顯示“56”。
動態(tài)顯示時,先送“5”的段碼送A口,再送02h到C口為位碼;經(jīng)一定延時后,送“6”的段碼送A口,再送01h到C口為位碼。循環(huán)完成,可以顯示數(shù)碼。5,數(shù)碼管動態(tài)顯示(選做):同圖接好電路,編程在兩個數(shù)碼管上顯示循環(huán)顯示“00-99”。只要搞清楚各個口的地址,以及選擇適當(dāng)?shù)目刂谱?,其實很簡單的?/p>
收獲:掌握8255的基本工作原理和編程方法,對方式0的認(rèn)識加深了。
二、試驗中遇到的問題 1在編寫程序時,我深深體會到,畫程序框圖的重要性,每一步跳轉(zhuǎn)的條件一定要搞清楚,Y和N不能搞反了,否則就錯了。
2實驗2,里面涉及的寄存器很多,很容易就會用亂了,還是很需要注意的。3比如那個小鳥動畫的題目,當(dāng)時在控制左右移動的時候,選擇的起始位置的語句沒寫對位置,每次按一個移位的鍵以后,都從最初的初始位置向某個方向移動。
4硬件方面的,一開始沒搞懂地址什么意思,所以連線時很懵懂,后來清楚了,發(fā)現(xiàn)就沒什么了。
三、心得感受
微機(jī)原理與接口技術(shù)的課程實驗歷時大半個學(xué)期,通過自己編寫、運行程序,不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。以前對于編程工具的使用還處于一知半解的狀態(tài)上,但是經(jīng)過一段上機(jī)的實踐,對于怎么去排錯、查錯,怎么去看每一步的運行結(jié)果,怎么去了解每個寄存器的內(nèi)容以確保程序的正確性上都有了很大程度的提高。
前四個簡單程序設(shè)計,加深了我們對初學(xué)的匯編語言指令的熟悉和理解,匯編語言直接描述機(jī)器指令,比機(jī)器指令容易記憶和理解。通過學(xué)習(xí)和使用匯編語言,向上為理解各種軟件系統(tǒng)的原理,打下技術(shù)理論基礎(chǔ);向下為掌握硬件系統(tǒng)的原理,打下實踐應(yīng)用基礎(chǔ)。不僅鞏固了書本所學(xué)的知識,還具有一定的靈活性,發(fā)揮了我們的創(chuàng)造才能。
后面幾個實驗是并行輸入輸出接口8255和計數(shù)器8253的功能的操作,加深了我們對硬件的熟悉,鍛煉了動手能力,發(fā)揮創(chuàng)造才能。
通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在自己的思考以及和同學(xué)的討論中,終于迎刃而解。
第五篇:北京郵電大學(xué) 微機(jī)原理軟件實驗3
北京郵電大學(xué)
微機(jī)原理軟件實驗·第三次實驗
題目一:
一、實驗?zāi)康?、2、初步掌握中斷程序的設(shè)計方法;
初步掌握修改 DOS 系統(tǒng)中斷,以適應(yīng)實際使用的方法。
二、實驗內(nèi)容
編一程序,在顯示器上顯示時、分、秒。借用計數(shù)器8253的Timer0作為中斷源,通過8259A向CPU發(fā)中斷,每10ms產(chǎn)生一次中斷。在中斷服務(wù)程序中管理刷新時、分、秒。
要求:
1、輸入文件名(如:CLK)后清屏后顯示:
2、Current time is: xx:xx:xx(時分秒鍵盤輸入)
3、打回車,時、分、秒開始計時。時鐘不停的刷新。
4、當(dāng)鍵入CTRL+C時,停止計時,返回系統(tǒng),且系統(tǒng)正常運行不死機(jī)。
提示:
8253的初始化程序段可借用??诘刂窞?0H、41H、42H、43H,控制字為36H=00110110B,時間常數(shù)TC=11932:1.1932MHz/11932=100Hz,輸出方波頻率為100Hz,其周期為1000/100=10ms。
三、設(shè)計思路
1、開始程序流程圖
重新在屏幕上打印時間是判斷鍵盤緩沖區(qū)有無按鍵按下定義數(shù)據(jù)段和堆棧段回車是否按下判斷內(nèi)存中的時間是否被修改保存源中斷向量否是秒表功能否否將timer子程序地址設(shè)置為中斷向量顯示字符串:“Now the time is:”是判斷“S”是否按下否設(shè)置8253工作狀態(tài),使其輸出方波100Hz判斷設(shè)定時間是否符合規(guī)范否輸出一條錯誤信息判斷Ctrl+C是否按下是設(shè)置8259A工作狀態(tài)輸出一條提示信息,要求用戶設(shè)定時間是退出程序
2、中斷子程序流程圖
子程序開始記下進(jìn)入中斷的次數(shù)判斷次數(shù)是否為100是計數(shù)清零,修改內(nèi)存中存儲的時間查看是否有進(jìn)位否進(jìn)位調(diào)整結(jié)束
3、可能用到的指令
① STI 置中斷允許位.CLI 清中斷允許位.格式:CLI STI 功能:開關(guān)中斷允許標(biāo)志,用于在程序中防止中斷嵌套,設(shè)置中斷。
② STOS(STOre into String)存入串指令 格式:STOS DST STOSB //存放字節(jié)串(DI)= AL STOSW //存放字串(DI)= AX 執(zhí)行操作:把AL或AX中的內(nèi)容存放由DI指定的附加段的字節(jié)或字單元中,并根據(jù)DF值修改及數(shù)據(jù)類型修改DI的內(nèi)容。字節(jié)操作:((DT))←(AL),(DI)←(DI)±1
③
④
⑤
⑥
4、① 字操作:((DI))←(AX),(DI)←(DI)±2無條件轉(zhuǎn)移指令
IN輸入指令
長格式為:IN AL,PORT(字節(jié))IN AX,PORT(字)執(zhí)行的操作:(AL)<-(PORT)(字節(jié))(AX)<-(wPORT+1,PORT)(字)短格式為:IN AL,DX(字節(jié))IN AX,DX(字)
OUT輸出指令
長格式為:OUT PORT,AL(字節(jié))OUT PORT,AX(字)執(zhí)行的操作:(PORT)<-(AL)(字節(jié))(PORT+1,PORT)<-(AX)(字)短格式為:OUT DX,AL(字節(jié))OUT DX,AX(字)執(zhí)行的操作:((DX))<-(AL)(字節(jié))((DX)+1,(DX))<-AX(字)
設(shè)置中斷向量 格式:
mov al,8 mov ah,25h int 21h DS:DX=中斷向量 AL=中斷類型號
查看中斷向量 格式:
mov al,8
mov ah,35h AL=中斷類型 ES:BX=中斷向量
計數(shù)器芯片8253簡介 初始化
使用8253前,要進(jìn)行初始化編程。初始化編程的步驟是:
A向控制寄存器端口寫入控制字對使用的計數(shù)器規(guī)定其使用方式等。B 向使用的計數(shù)器端口寫入計數(shù)初值。
② 8253控制字
D7D6=00:使用0號計數(shù)器,D7D6=01:使用1號計數(shù)器
D7D6=10:使用2號計數(shù)器,D7D6=11:無效 D5D4=00:鎖存當(dāng)前計數(shù)值
D5D4=01:只寫低8位(高8位為0),讀出時只讀低8位 D5D4=10:只寫高8位(低8位為0),讀出時只讀高8位 D5D4=11:先讀/寫低8位,后讀/寫高8位計數(shù)值
D3D2D1=000:選擇方式0,D3D2D1=001:選擇方式1 D3D2D1=X10:選擇方式2,D3D2D1=X11:選擇方式3 D3D2D1=100:選擇方式4,D3D2D1=101:選擇方式5 D0=0:計數(shù)初值為二進(jìn)制,D0=1:計數(shù)初值為BCD碼數(shù)
四、源程序
data segment count100 db 100
;100個10ms=1s,此處count100起計數(shù)作用 msg1 db 'Please enter the current time(XX:XX:XX)!(Press ENTER to use default time)$' msg2 db 'Sorry,your date entered incorrectly ,please try again!$' msg3 db 'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press Enter to use as a Stopwatch.)',0ah,'(Press S or s to set current time again.)(XX:XX:XX)$' msg4 db 0ah,'Program EXIT normally.$' tenhour db '0';小時十位數(shù) hour db '0',':';小時個位數(shù) tenmin db '0';分鐘十位數(shù) minute db '0',':';分鐘個位數(shù) tensec db '0';秒十位數(shù) second db '0’;秒個位數(shù) data ends
stack segment stack 'stack' db 256 dup(0)stack ends
code segment assume cs:code,ds:data,es:data
start: mov ax,seg data mov es,ax mov ds,ax
cli;使中斷標(biāo)志IF=0 mov al,8;保存源中斷向量 mov ah,35h int 21h push es push bx
mov ax,0
mov es,ax;es置零,這是準(zhǔn)備中斷向量的寫入 mov di,20h
mov ax,offset timer;中斷子程序timer的偏移量 stows
;字符串填充,將AX的內(nèi)容
;(timer偏移量)存入di所指向的單元,;di的增減取決于DF,默認(rèn)段基址總是ES mov ax,cs
stosw;timer端基址
mov al,36h
out 43h,a;設(shè)置8253控制字為36H
mov bx,11932
;分頻系數(shù)為11932,分頻結(jié)
;果1.1932MHz/11932=100Hz,10ms變化一次
mov al,bl;分兩次設(shè)置分頻系數(shù) out 40h,al
mov al,bh out 40h,al
mov al,0fch;主PIC端口設(shè)置為0fch out 21h,al
sti;開中斷,允許外部中斷
mov ax,seg data mov es,ax mov ds,ax
mov dx,offset msg1;打印提示信息1 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h
settime:mov si,offset tenhour;設(shè)定時間 mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2;如果輸入不合法,報錯 cmp al,'3' jnc error2 mov [si],al inc si cmp al,'2' jz ershi
mov ah,01h;如果小時高位為1,;低位可以設(shè)置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'9'+1 jnc error2 mov [si],al inc si jmp fen
ershi: mov ah,01h;如果小時高位為2,低位可以設(shè)置0~4 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'4' jnc error2 mov [si],al inc si jmp fen
fen: mov ah,01h;分高位可設(shè)置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si
mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si
zcy4: mov ah,01h;分低位0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si jmp zcy
settime2:jmp settime;用來跳轉(zhuǎn)接力 error2: jmp error1 forever1:jmp next2
zcy: mov ah,01h;秒高位可設(shè)置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si
mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si
mov ah,01h;秒低位可設(shè)置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si
jmp next2
error1: mov dl,0ah;用來報錯:設(shè)置時間不合法 mov ah,02h int 21h
mov dx,offset msg2;打印提示信息2 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h
jmp settime
settime3: jmp settime2;跳轉(zhuǎn)接力
next2: MOV AX,0003H;做時鐘顯示初始化 INT 10H;清屏顯示 mov dl,0ah mov ah,02h int 21h mov dx,offset msg3;打印提示信息3 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h forever:mov bx,offset tenhour;這個程序段循環(huán)執(zhí)行 mov cx,8 cmp tenhour,'2';如果超過24點,置為0點 jnz dispclk cmp hour,'4' jnz dispclk mov tenhour,'0' mov hour,'0' dispclk:mov dl,[bx];用來顯示當(dāng)前時間 call dispchar inc bx loop dispclk
;調(diào)用顯示子程序,顯示初始狀態(tài)時間,;比如”11:11:11"
mov dl,0dh;輸出一個換行 call dispchar
xor al,al;讀鍵盤緩沖區(qū) mov ah,0bh int 21h cmp al,0FFH jnz next3 mov ah,08h;取其字符 int 21h cmp al,03h;Ctrl+C退出 jz stop cmp al,'s';S/s設(shè)定時間 jz settime3 cmp al,'S' jz settime3 cmp al,0dh jnz next3 mov dl,0ah;回車則使用秒表功能 mov ah,02h int 21h jmp forever
next3: mov al,second
next: cmp al,second;判斷second是否發(fā)生變化je next;如果沒有,循環(huán)比較
jmp forever;如果有變化,刷新輸出
stop: mov dx,offset msg4;打印提示信息4 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h
pop dx;恢復(fù)中斷向量 pop ds mov al,8 mov ah,25h int 21h mov ah,4ch int 21h
timer proc far;中斷程序timer push ax
dec count100;計數(shù)100次
jnz timerx;如果計數(shù)小于100,跳出中斷 mov count100,100
;否則重置count100<=100;1s已經(jīng)到達(dá)
inc second;加一秒 cmp second,'9'
;判斷大小,用于進(jìn)位,以下原理相同 jle timerx
mov second,'0' inc tensec cmp tensec,'6' jl timerx
mov tensec,'0' inc minute cmp minute,'9' jle timerx
mov minute,'0' inc tenmin cmp tenmin,'6' jl timerx
mov tenmin,'0' inc hour cmp hour,'9' ja adjhour cmp hour,'3' jnz timerx
cmp tenhour,'1' jnz timerx mov hour,'1' mov tenhour,'0'
jmp short timerx;段內(nèi)短轉(zhuǎn)移
adjhour:inc tenhour mov hour,'0' timerx: mov al,20h out 20h,al;主PIC口地址 pop ax;出?;謴?fù) iret;中斷返回 timer endp
dispchar proc near;顯示子函數(shù) push bx mov bx,0 mov ah,02h
int 21h
;DOS功能調(diào)用,輸出DL內(nèi)容 pop bx ret
dispchar endp
code ends end start
五、實驗結(jié)果(反色)
這幅圖是運行程序之后,設(shè)定時間,輸入的時間不合法的截圖。當(dāng)輸入不合法的字符時,對彈出一條錯誤信息,然后要求重新輸入時間。
這幅圖是輸入一個合法字符串后,時鐘被設(shè)定為該值,并且正常計數(shù)的程序截圖。
這幅圖是在時鐘運行的過程中,按下Enter鍵,進(jìn)入秒表模式的截圖。秒表模式,會將按下Enter的時間保存下來。
這幅圖是在時鐘運行的過程中,按下S鍵,進(jìn)入設(shè)定模式的截圖。該截圖輸入字符串不合法。當(dāng)輸入合法的字符串后,程序?qū)⑶迤?,這是截圖和正常計時狀態(tài)一樣。
這幅圖是按下Ctrl+C,程序正常退出的截圖。程序正常退出后,與之前的運行情況完全一樣,程序運行不死機(jī)。
六、實驗總結(jié):
這次微原實驗是我設(shè)計比較大型的匯編程序,從如何使用8253/8255開始,到程序被完整調(diào)通為止,這個實驗帶給我的是對于課本第七章、第八章的知識更加清晰的認(rèn)識與了解,和對于微機(jī)運行的原理的進(jìn)一步認(rèn)識。在這次實驗中,我都要求自己先做整體思路規(guī)劃,再去做代碼實現(xiàn),這樣節(jié)省了我大量時間。也給我?guī)砹撕芏嗍斋@。
整體的思路規(guī)劃:我認(rèn)識到,相比于直接悶頭就上的編程方法,有一個好的整體思路規(guī)劃,會節(jié)省很多后期的力氣,對于任務(wù)的完成大有裨益。
嚴(yán)謹(jǐn)認(rèn)真的代碼風(fēng)格:匯編語言的編譯器不如C++等高級語言,當(dāng)程序出錯時,并不會給出錯誤。我們要有嚴(yán)謹(jǐn)?shù)拇a風(fēng)格,才能保證效率。
學(xué)會調(diào)試:匯編語言的編譯器較差,當(dāng)程序出錯時,我們要善用DEBUG工具,去認(rèn)真地分析程序的每一部動向,找到問題所在。
回歸課本基本概念:在編程的過程中,曾經(jīng)出過一個bug,總是無法正常的進(jìn)入計時中斷Timer。經(jīng)過我查閱課本,發(fā)現(xiàn)是8253的控制字設(shè)置有問題。這說明我對課本的內(nèi)容掌握的還不夠好,應(yīng)該多多回歸課本基本概念,才可以順利的編程。