微機(jī)原理與接口技術(shù)實(shí)驗(yàn)報(bào)告!學(xué)習(xí)資料僅供參考![智慧交通路口控制實(shí)驗(yàn)]班級(jí):姓名:學(xué)號(hào):組員:一、實(shí)驗(yàn)?zāi)康闹腔劢煌房诳刂剖且粋€(gè)基于實(shí)際工程原理,結(jié)合文獻(xiàn)、現(xiàn)實(shí)十字路口交通的研究,對(duì)工程問題進(jìn)行確定、表述和建模分析,獲得最優(yōu)設(shè)計(jì)方案,理解并在工程實(shí)踐中遵守工程職業(yè)道德規(guī)范,根據(jù)實(shí)驗(yàn)室實(shí)驗(yàn)環(huán)境限定條件來確定實(shí)驗(yàn)方案。所有知識(shí)涵蓋本課程中的并行接口8255芯片、匯編語言程序設(shè)計(jì)、算法分析、接口地址的確定、外圍設(shè)備的控制等。通過此實(shí)驗(yàn)可以理解微機(jī)系統(tǒng)中接口電路的作用,掌握軟件硬件協(xié)同工作原理,熟悉微機(jī)原理與接口技術(shù)的綜合應(yīng)用。最終達(dá)到如下實(shí)驗(yàn)?zāi)康模?.掌握可編程并行接口8255芯片的工作原理2.掌握利用并行接口芯片8255實(shí)現(xiàn)信號(hào)燈控制的硬件設(shè)計(jì)和軟件設(shè)計(jì)3.掌握接口電路及匯編語言程序設(shè)計(jì)的調(diào)試方法4.了解PC機(jī)和實(shí)驗(yàn)系統(tǒng)板的連接原理,理解系統(tǒng)機(jī)擴(kuò)展原理5.了解并行接口芯片在工程實(shí)踐中的典型應(yīng)用及實(shí)現(xiàn)方式。二、實(shí)驗(yàn)設(shè)備與環(huán)境1.TPC-JK-II實(shí)驗(yàn)系統(tǒng)1臺(tái)2.TPC-JK-II實(shí)驗(yàn)系統(tǒng)所配套的軟件---TPC-JK-II集成開發(fā)環(huán)境1套3.PC微機(jī)1臺(tái)三、實(shí)驗(yàn)內(nèi)容及指標(biāo)1、設(shè)計(jì)要求設(shè)計(jì)利用TPC-ZK-II實(shí)驗(yàn)系統(tǒng)提供的8254芯片和實(shí)驗(yàn)臺(tái)能提供、2MHz的時(shí)鐘頻率發(fā)生器分頻的模車輛測(cè)速制硬連和程序設(shè)計(jì)。2、設(shè)計(jì)目標(biāo)和性能指標(biāo)主要內(nèi)容是:設(shè)計(jì)利用TPC-JK-II實(shí)驗(yàn)系統(tǒng)提供的8254(8253)、8255芯片、七段數(shù)碼管、液晶顯示器、8*8點(diǎn)陣實(shí)現(xiàn)智慧交通測(cè)速制的硬件電路設(shè)計(jì)和程序設(shè)計(jì)。eq\o\ac(○,1)基礎(chǔ)部分:1)通過實(shí)際調(diào)研了解交通測(cè)速原理,確定實(shí)現(xiàn)的算法流程,編程實(shí)現(xiàn)并調(diào)試完成基于定時(shí)器測(cè)量的車輛測(cè)速的模擬控制。2)利用實(shí)驗(yàn)系統(tǒng)設(shè)計(jì)硬件電路,明確8254、8255芯片端口地址(1)編程實(shí)現(xiàn)并調(diào)試完成車輛測(cè)速的模擬控制。通過TPC-ZK-II實(shí)驗(yàn)箱8254(8253)接口芯片實(shí)現(xiàn)計(jì)數(shù)和定時(shí)功能。通過撥碼開閉模擬車輛進(jìn)入或駛離測(cè)速區(qū)域,當(dāng)開關(guān)處于閉合狀態(tài)時(shí)(向上撥通),表示車輛進(jìn)入測(cè)速區(qū)域,反之表示駛離測(cè)速區(qū)域。通過TPC-ZK-II實(shí)驗(yàn)箱LCD操作顯示速度值。合理選擇8254的工作方式以及計(jì)數(shù)初值,通過計(jì)數(shù)器來間接計(jì)算出時(shí)間,通過與距離換算得到速度,并通過DOS功能調(diào)用在屏幕上打印出來。通過12864LCD液晶滾動(dòng)顯示出計(jì)數(shù)值(2)了解定時(shí)/計(jì)數(shù)器在工程實(shí)踐中的典型應(yīng)用及實(shí)現(xiàn)方式分析設(shè)計(jì)方案并比較和其它可選的測(cè)速的技術(shù)性能差別。eq\o\ac(○,2)提高部分:1)多路速度測(cè)量數(shù)據(jù)模擬,將單路開關(guān)控制,改為通過4*4鍵盤輸入控制。通過TPCZK-II實(shí)驗(yàn)箱上的4*4鍵盤模擬不同路段的車輛測(cè)速功能。以鍵盤的每一行代表不同的路段,不同路段可以有不同的限速,每行中的第一列和最后一列鍵按下時(shí),代表測(cè)速開始和測(cè)速結(jié)束,例如按下"1"鍵表示進(jìn)入測(cè)速區(qū)間、按下"4"鍵表示離開測(cè)速區(qū)間。8254只有3個(gè)定時(shí)/計(jì)數(shù)器,試評(píng)估4路并發(fā)測(cè)速的可行性,如何擴(kuò)展實(shí)現(xiàn)多路并發(fā)測(cè)速。2)通過實(shí)驗(yàn)箱上12864LCD液晶滾動(dòng)顯示當(dāng)前測(cè)速路段的車輛速度和該路段的限速。eq\o\ac(○,3)擴(kuò)展部分:1)利用8254(8253)計(jì)數(shù)器產(chǎn)生。其中8254輸入時(shí)鐘頻率為1MHz。2)8255芯片在本次實(shí)驗(yàn)中用于控制輸入,顯示輸出,功能較為繁多。在使用該芯片時(shí),需要合理規(guī)劃,以充分利用該芯片的數(shù)據(jù)口。3)各芯片的端口地址需要根據(jù)硬件自行合理設(shè)計(jì)。4)掌握數(shù)碼管的連接方式以及相關(guān)程序的編寫。5)主機(jī)和從機(jī)之間的數(shù)據(jù)傳送和記錄,涉及DOS調(diào)用。3、硬件連接圖實(shí)驗(yàn)硬件連接圖具體的連接方式為,IO編碼地址中的Y0和Y1要分別接在8254與8255的CS端,在8254中的計(jì)數(shù)器0的CLK0接1MHz脈沖、GATE0接+5v高電平、OUT0接CLK1、GATE1接+5v高電平、OUT2接CLK2、GATE2接撥碼開關(guān)K7,8255的PA接數(shù)碼管段選、PB0與PB1接數(shù)碼管位選S0、S1。四、程序流程圖計(jì)數(shù)器工作流程圖第一個(gè)和第二個(gè)計(jì)數(shù)器用作時(shí)鐘分頻,均工作在方式3,最終得到1Hz的方波信號(hào),第三個(gè)計(jì)數(shù)器以此為時(shí)鐘工作在方式2作為輸入的閘門信號(hào),每經(jīng)過1秒計(jì)數(shù)值就減1,結(jié)束計(jì)數(shù)時(shí)用起點(diǎn)和終點(diǎn)的計(jì)數(shù)差值就可以計(jì)算出時(shí)間。撥碼開關(guān)輸入流程圖實(shí)驗(yàn)臺(tái)包含4個(gè)開關(guān)K0至K3,開關(guān)撥到“1”位置時(shí)開關(guān)斷開,輸出高電平。撥到“0”位置時(shí)開關(guān)接通輸出低電平。電路中串接了保護(hù)電阻,接口電路不直接同+5V、GND相連,有效的防止因誤操作損壞成電路現(xiàn)象。4*4鍵盤程序流程圖4*4矩陣鍵盤是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個(gè)交叉點(diǎn)上,設(shè)置一個(gè)按鍵。使用該鍵盤時(shí),采用對(duì)4*4矩陣鍵盤逐行逐列掃描的方式判斷是否有按鍵按下。五、方案設(shè)計(jì)及討論【方案設(shè)計(jì)】eq\o\ac(○,1)8254計(jì)數(shù)器初始化:計(jì)數(shù)器0和計(jì)數(shù)器1工作在方式3即方波發(fā)生器,各自分頻系數(shù)就是計(jì)數(shù)初值,選用1MHz的系統(tǒng)內(nèi)部時(shí)鐘,分頻系數(shù)設(shè)為1000,得到1Hz的方波。計(jì)數(shù)器2設(shè)置工作在方式2,為了記錄更長(zhǎng)的時(shí)間,計(jì)數(shù)初值越大越好故設(shè)為0FFFFH。eq\o\ac(○,2)8255初始化:A口的地址288H,采用PA0~7口的方式輸出,與數(shù)碼段段碼輸入相連,PB0與PB1與數(shù)碼管的片選信號(hào)相連,由于假設(shè)長(zhǎng)度為100m一般速度均為一位或兩位數(shù),所以用兩個(gè)數(shù)碼管可以顯示出速度。eq\o\ac(○,3)撥碼開關(guān)與脈沖發(fā)生:將撥碼開關(guān)與GATE2連接,用作閘門信號(hào),而CLK0為1MHz脈沖,作為時(shí)鐘信號(hào)。eq\o\ac(○,4)屏幕顯示與數(shù)碼管顯示:調(diào)用Dos2功能將速度顯示到屏幕上,并且不斷循環(huán)測(cè)速直到開關(guān)完成一次開閉(即車輛通過開始和結(jié)束測(cè)量路段),數(shù)碼管可以用PA口輸入,但要都要注意數(shù)字與ASCII碼的轉(zhuǎn)換。方法一: 將8255A和8254初始化,82255A口控制數(shù)碼管顯示,B口選通數(shù)碼管,這里為一種實(shí)現(xiàn)方式,但是最終通過驗(yàn)收的方式不是此方式,開關(guān)狀態(tài)采用PC0口讀取,并將開關(guān)和GATE2連接起來,此時(shí)OUT1輸出1Hz方波信號(hào),計(jì)數(shù)器二工作在工作方式二,產(chǎn)生N-1個(gè)脈沖計(jì)數(shù),計(jì)數(shù)值恰好為N秒。如果開關(guān)向上撥,則GATE2變成高電平,這里的計(jì)數(shù)器二開始計(jì)數(shù),當(dāng)開關(guān)向下?lián)軙r(shí),停止計(jì)數(shù)。若開關(guān)向下?lián)?,說明計(jì)數(shù)完畢,此時(shí)將計(jì)數(shù)器二計(jì)到的數(shù)鎖存到寄存器AX中,送給BX進(jìn)行查表工作,將相應(yīng)值送到A口輸出到數(shù)碼管,循環(huán)操作,使數(shù)碼管實(shí)時(shí)顯示。最后進(jìn)行DOS顯示輸出。調(diào)用DOS2號(hào)功能,先判斷讀取到的數(shù)是否大于9,若大于,則加37H后打印,若不大于,則加30H后打印,在屏幕上顯示出來。方法二: 8254計(jì)數(shù)器0和計(jì)數(shù)器1工作在方式3即方波發(fā)生器,各自分頻系數(shù)就是計(jì)數(shù)初值,選用1MHz的系統(tǒng)內(nèi)部時(shí)鐘,分頻系數(shù)設(shè)為1000,得到1Hz的方波。計(jì)數(shù)器2設(shè)置工作在方式2,計(jì)數(shù)初值設(shè)為0FFFFH。8255A口的地址288H,采用PA0~7口的方式輸出,與數(shù)碼段段碼輸入相連,PB0與PB1與數(shù)碼管的片選信號(hào)相連,由于假設(shè)長(zhǎng)度為100m一般速度均為一位或兩位數(shù),所以用兩個(gè)數(shù)碼管可以顯示出速度,撥碼開關(guān)與GATE2連接,用作閘門信號(hào),而CLK0為1MHz脈沖,作為時(shí)鐘信號(hào),調(diào)用Dos2功能將速度顯示到屏幕上,并且不斷循環(huán)測(cè)速直到開關(guān)完成一次開閉,數(shù)碼管可以用PA口輸入?!痉桨赣懻摗坑懻撘唬河?jì)數(shù)器如何鏈接? 由于本次實(shí)驗(yàn)是用計(jì)數(shù)器記錄時(shí)間來測(cè)量速度,但是在實(shí)驗(yàn)箱中的脈沖頻率為1MHz的高頻脈沖,這顯然是不能用來測(cè)速的,而計(jì)數(shù)器還可以作為分頻器使用,只用將0、1、2分別按著一定規(guī)則連接,本次實(shí)驗(yàn)類似于串聯(lián),就可以將本來的高頻信號(hào)進(jìn)行兩次的1000分頻,這樣一來我們就能得到低頻的1Hz信號(hào),用于測(cè)量時(shí)間剛剛好。討論二:速度的最終顯示問題?在本實(shí)驗(yàn)中是要測(cè)量速度,而計(jì)數(shù)器的測(cè)量時(shí)間可看成是的中間必須要得到的實(shí)驗(yàn)數(shù)據(jù),用于產(chǎn)生最后的測(cè)量速度,所以我們討論認(rèn)為可以在數(shù)碼管和屏幕上時(shí)間,當(dāng)最后完成測(cè)試后,得到的時(shí)間與路程運(yùn)算得到最后的速度,然后最終再顯示在屏幕和數(shù)碼管上。討論二:如果計(jì)數(shù)器使用中計(jì)數(shù)方式?計(jì)數(shù)器中的數(shù)字有兩種計(jì)數(shù)方式,一個(gè)是不斷地加1,另一種是不斷地減1,從小到大和從大到小都能實(shí)現(xiàn)計(jì)數(shù)功能,而且硬件連接沒有區(qū)別,但從大到小在實(shí)際的匯編操作中更加簡(jiǎn)單,且符合計(jì)數(shù)器的工作原理,如果對(duì)記錄時(shí)間要求不高的實(shí)驗(yàn)中可用這種方法,從小到大顯示測(cè)量時(shí)間,需要不斷地對(duì)計(jì)數(shù)值作到ASCⅡ碼的轉(zhuǎn)換,但它符合我們思考的習(xí)慣,但是我們學(xué)習(xí)匯編是為了學(xué)習(xí)計(jì)算機(jī)的原理,這里我們采用第二種,不斷減一的方式。六、實(shí)驗(yàn)結(jié)果分析撥碼開關(guān)向上撥動(dòng)開始計(jì)時(shí),當(dāng)計(jì)數(shù)器時(shí)間不斷增加到20時(shí)候,我們將撥碼開關(guān)向下?lián)芑?,結(jié)束計(jì)時(shí)。 結(jié)束計(jì)時(shí)后數(shù)碼管顯示速度為05,由于假設(shè)路程為100m,所以當(dāng)計(jì)時(shí)20s結(jié)束時(shí),車輛速度就是5m/s,這時(shí)在屏幕上顯示為currentspeed:05結(jié)果也是正確,本次實(shí)驗(yàn)順利完成。七、心得體會(huì)與分工 略【源代碼】一:DATASSEGMENT;此處輸入數(shù)據(jù)段代碼L8255_AEQU288H;A端口地址,數(shù)碼管數(shù)據(jù)L8255_BEQU289H;B端口地址,B0,B1段選L8255_CEQU28AH;C端口地址,C0讀撥碼開關(guān)L8255_KEQU28BH;寄存器端口地址L8254_0EQU280H;計(jì)數(shù)器0,工作方式3,1000分頻L8254_1EQU281H;計(jì)數(shù)器1,工作方式3,1000分頻,輸出1HzL8254_2EQU282H;計(jì)數(shù)器2,工作方式2,硬件控制,計(jì)數(shù)L8254_KEQU283H;寄存器端口地址FLAGDB0;撥碼開關(guān)狀態(tài)LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段碼ASCDB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;保存數(shù)字1-9的ASCII碼TIMEDB0;時(shí)間TIME_GEDB0;時(shí)間個(gè)位TIME_SHIDB0;時(shí)間十位BUFDB100NUMDW0;計(jì)數(shù)結(jié)束的值,16位DATASENDSSTACKSSEGMENTSTACK;此處輸入堆棧段代碼DW256DUP(?)STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;***********并行IO8255初始化MOVDX,L8255_KMOVAL,81HOUTDX,AL;A方式0輸出,B方式0輸出,C7-C4輸出,C0-C3輸入;***********定時(shí)器8254初始化MOVDX,L8254_K;向8254寫控制字MOVAL,36H;使計(jì)數(shù)器0為工作方式3OUTDX,ALMOVAX,1000;寫入循環(huán)計(jì)數(shù)初值1000MOVDX,L8254_0OUTDX,AL;先寫入低字節(jié)MOVAL,AHOUTDX,AL;后寫入高字節(jié)MOVDX,L8254_KMOVAL,76H;設(shè)計(jì)數(shù)器1工作方式3,輸出1Hz方波OUTDX,ALMOVAX,1000;寫入循環(huán)計(jì)數(shù)初值1000MOVDX,L8254_1OUTDX,AL;先寫低字節(jié)MOVAL,AHOUTDX,AL;后寫高字節(jié)MOVDX,L8254_KMOVAL,0B4H;設(shè)計(jì)數(shù)器2工作方式2,循環(huán)計(jì)數(shù),硬件控制OUTDX,ALMOVAX,0;寫入循環(huán)計(jì)數(shù)初值0MOVDX,L8254_2OUTDX,AL;先寫低字節(jié)MOVAL,AHOUTDX,AL;后寫高字節(jié)MOVFLAG,0MOVTIME,0;***********主循環(huán)START_MAIN:CALLSHOW_2;顯示時(shí)間CALLSHOW_DOSCALLKEY_SCAN;按鍵掃描CALLTIME_DATAUP;時(shí)間更新NEXT_MAIN:JMPSTART_MAIN;*********返回DOSMOVAH,4CHINT21H;*********兩位數(shù)碼管顯示子程序SHOW_2PROCPUSHAXPUSHBXPUSHDXMOVBL,10;將10放入寄存器BX,用來分離各位數(shù)MOVAL,TIMEMOVAH,0DIVBL;AL/BL,商放入AL,余數(shù)放入AHMOVTIME_GE,AHMOVAH,0DIVBLMOVTIME_SHI,AHMOVAH,0LEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIME_GEXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVTIME_GE,ALLEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIME_SHIXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVTIME_SHI,AL;個(gè)位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000001B;右側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,TIME_GEOUTDX,ALCALLDELAY1;延時(shí);十位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000010B;左側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,TIME_SHIOUTDX,ALCALLDELAY1;延時(shí)POPDXPOPBXPOPAXRETSHOW_2ENDP;*********一位數(shù)碼管顯示子程序SHOW_1PROCPUSHAXPUSHBXPUSHDXCMPTIME,0FHJASHOW_1_ENDMOVDX,L8255_BMOVAL,00000001B;右側(cè)數(shù)碼管亮OUTDX,ALLEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIMEXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中;輸出MOVDX,L8255_A;自8255A的口輸出OUTDX,ALSHOW_1_END:POPDXPOPBXPOPAXRETSHOW_1ENDP;*********DOS顯示子程序SHOW_DOSPROCPUSHAXPUSHBXPUSHDXCMPFLAG,0JZSHOW_DOS_ENDMOVAL,TIMECMPBUF,ALJZSHOW_DOS_ENDMOVAL,TIMEMOVBUF,ALMOVBL,10;將10放入寄存器BX,用來分離各位數(shù)MOVAL,TIMEMOVAH,0DIVBL;AL/BL,商放入AL,余數(shù)放入AHMOVTIME_GE,AHMOVAH,0DIVBLMOVTIME_SHI,AHMOVAH,0MOVAL,TIME_SHI;ADDAL,30HLEABX,ASC;將數(shù)碼管碼表的首地址放入BXXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVDL,AL;用DOS的2號(hào)功能,輸出字符MOVAH,02HINT21HMOVAL,TIME_GE;ADDAL,30HLEABX,ASC;將數(shù)碼管碼表的首地址放入BXXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVDL,AL;用DOS的2號(hào)功能,輸出字符MOVAH,02HINT21HMOVDL,',';用DOS的2號(hào)功能,輸出字符MOVAH,02HINT21HSHOW_DOS_END:POPDXPOPBXPOPAXRETSHOW_DOSENDP;*********按鍵查詢顯示子程序,C0讀撥碼開關(guān)KEY_SCANPROCPUSHAXPUSHBXPUSHDXMOVDX,L8255_CINAL,DXANDAL,00000001BCMPAL,1;高電平計(jì)數(shù)JZK1;否則為0MOVFLAG,0JMPKEY_SCAN_ENDK1:MOVFLAG,1KEY_SCAN_END:POPDXPOPBXPOPAXRETKEY_SCANENDP;*********時(shí)間更新子程序子程序TIME_DATAUPPROCPUSHAXPUSHBXPUSHDXCMPFLAG,1JZT1T0:JMPTIME_DATAUP_ENDT1:MOVAL,10000000B;鎖存計(jì)數(shù)器2的值MOVDX,L8254_KOUTDX,ALMOVDX,L8254_2INAL,DX;計(jì)數(shù)器2低字節(jié)MOVAH,AL;暫存AHINAL,DX;計(jì)數(shù)器2高字節(jié)XCHGAH,AL;放入AXMOVNUM,AX;放計(jì)數(shù)末值MOVBX,0SUBBX,AXMOVTIME,BLTIME_DATAUP_END:POPDXPOPBXPOPAXRETTIME_DATAUPENDP;*********延時(shí)子程序1DELAY1PROC;數(shù)碼管延時(shí)PUSHAXPUSHCXPUSHDXMOVCX,0FFFHX1:LOOPX1POPDXPOPCXPOPAXRETDELAY1ENDPCODESENDSENDSTART方案二:DATASEGMENTLISTDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDATAENDSMSTACKSEGMENTSTACKDB100DUP(?)MSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:MSTACKSTART:MOVAX,DATAMOVDS,AX;*******************************************************8254初始化;控制寄存器地址283H;計(jì)數(shù)器0地址280H;計(jì)數(shù)器1地址281H;計(jì)數(shù)器2地址282HMOVDX,283H;設(shè)定各計(jì)數(shù)器工作方式MOVAL,00110110B;計(jì)數(shù)器0工作方式3方波發(fā)生器,先高后低,二進(jìn)制計(jì)數(shù)OUTDX,AL;寫計(jì)數(shù)器0控制字MOVAL,01110110B;計(jì)數(shù)器1工作方式3方波發(fā)生器,先高后低,二進(jìn)制計(jì)數(shù)OUTDX,AL;寫計(jì)數(shù)器1控制字MOVAL,10110100B;計(jì)數(shù)器2工作方式2分頻器,先高后低,二進(jìn)制計(jì)數(shù)OUTDX,AL;寫計(jì)數(shù)器2控制字;設(shè)定各計(jì)數(shù)器計(jì)數(shù)初值(由輸入時(shí)鐘頻率確定)假定1MHzMOVDX,280HMOVAX,1000;計(jì)數(shù)初值/分頻系數(shù)1000OUTDX,AL;寫計(jì)數(shù)器0初值低八位MOVAL,AHOUTDX,AL;寫計(jì)數(shù)器0初值高八位MOVDX,281HMOVAX,1000;計(jì)數(shù)初值/分頻系數(shù)1000OUTDX,AL;寫計(jì)數(shù)器1初值低八位MOVAL,AHOUTDX,AL;寫計(jì)數(shù)器1初值高八位MOVDX,282HMOVAX,0FFFFH;計(jì)數(shù)器2計(jì)數(shù)初值OUTDX,ALMOVAL,AHOUTDX,AL;**********************************************************8255初始化;控制寄存器端口地址28BH;A口的地址288H;B口的地址289H;C口的地址28AHMOVDX,28BHMOVAL,10001001B;A口方式0輸出(接數(shù)碼管),B口方式0輸出(選通數(shù)碼管),PC7輸入(查詢開關(guān)撥斷)OUTDX,ALMOVDX,289HMOVAL,00000001B;PB0置1,只顯示數(shù)碼管最低位OUTDX,AL;************************************************************WAIT_:MOVDX,28AHINAL,DXANDAL,80HTESTAL,10000000BJZWAIT_WAIT1:MOVAL,3FHMOVDX,288HOUTDX,ALMOVDX,28AHINAL,DXANDAL,80HTESTAL,10000000BJZSTOP;測(cè)速完畢,GATE2無效,轉(zhuǎn)STOPJMPWAIT1;否則繼續(xù)檢測(cè)STOP:MOVAL,10000000B;計(jì)數(shù)器2鎖存命令MOVDX,283HOUTDX,AL;測(cè)速完畢發(fā)鎖存命令,寫入控制端口MOVDX,282HINAL,DX;讀計(jì)數(shù)器2的低字節(jié)MOVAH,ALINAL,DX;讀計(jì)數(shù)器2的高字節(jié)XCHGAH,AL;計(jì)數(shù)值存放在AX中MOVBX,0FFFFHSUBBX,AX;計(jì)算測(cè)速時(shí)間,取整處理MOVAL,[BX+LIST];取對(duì)應(yīng)的陰極數(shù)碼管段碼MOVDX,288HOUTDX,AL;8255的PA口輸出顯示結(jié)果CMPBL,9JLEPRINT;小于等于9直接打印ADDBL,7H;否則加7PRINT:MOVAL,BLADDAL,30H;測(cè)速時(shí)間轉(zhuǎn)化為對(duì)應(yīng)ASCⅡ碼MOVDL,AL;調(diào)用2號(hào)功能輸出結(jié)果MOVAH,02HINT21HJMPWAIT_;進(jìn)行下一次測(cè)速CODEENDSENDSTART二:DATASSEGMENTL8255_AEQU288H;A端口地址,數(shù)碼管數(shù)據(jù)L8255_BEQU289H;B端口地址,B0,B1位選數(shù)碼管L8255_CEQU28AH;C端口地址,C0讀撥碼開關(guān)L8255_KEQU28BH;寄存器端口地址L8254_0EQU280H;計(jì)數(shù)器0,工作方式3,1000分頻L8254_1EQU281H;計(jì)數(shù)器1,工作方式3,1000分頻,輸出1HzL8254_2EQU282H;計(jì)數(shù)器2,工作方式2,硬件控制,計(jì)數(shù)L8254_KEQU283H;寄存器端口地址FLAGDB0;撥碼開關(guān)狀懌LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;段碼ASCDB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;保存數(shù)字1-9的ASCII碼TIMEDB0;時(shí)間TIME_GEDB0;時(shí)間個(gè)位TIME_SHIDB0;時(shí)間十位SPEEDDB0;速度SPEED_GEDB0;速度個(gè)位SPEED_SHIDB0;速度十位DISTANCEDB100;路程bufdb100MSG1DB0DH,0AH,"THESPEEDIS:$"NUMDW0;計(jì)數(shù)結(jié)束的值,16位DATASENDSSTACKSSEGMENTSTACKDW256DUP(?)STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX;***********并行IO8255初始匿MOVDX,L8255_KMOVAL,81HOUTDX,AL;A方式0輸出,B方式0輸出,C7-C4輸出,C0-C3輸入;***********定時(shí)器8254初始化MOVDX,L8254_K;向8254寫控制字MOVAL,36H;使計(jì)數(shù)器0為工作方式3OUTDX,ALMOVAX,1000;寫入循環(huán)計(jì)數(shù)初值1000MOVDX,L8254_0OUTDX,AL;先寫入低字節(jié)MOVAL,AHOUTDX,AL;后寫入高字節(jié)MOVDX,L8254_KMOVAL,76H;設(shè)計(jì)數(shù)器1工作方式3,輸出1hz方波OUTDX,ALMOVAX,1000;寫入循環(huán)計(jì)數(shù)初值1000MOVDX,L8254_1OUTDX,AL;先寫低字節(jié)MOVAL,AHOUTDX,AL;后寫高字節(jié)MOVDX,L8254_KMOVAL,0B4H;設(shè)計(jì)數(shù)器2工作方式2,循環(huán)計(jì)數(shù),硬件控制OUTDX,ALMOVAX,0;寫入循環(huán)計(jì)數(shù)初值0MOVDX,L8254_2OUTDX,AL;先寫低字節(jié)MOVAL,AHOUTDX,AL;后寫高字節(jié)MOVFLAG,0MOVTIME,0;***********主循玿START_MAIN:CALLCLECALLSHOW_2;顯示時(shí)間CALLSHOW_DOSCALLKEY_SCAN;按件掃描CALLTIME_DATAUP;時(shí)間更新NEXT_MAIN:JMPSTART_MAIN;*********返回DOSMOVAH,4CHINT21HCLEPROCPUSHAXPUSHBXPUSHDXMOVAX,0POPDXPOPBXPOPAXRETCLEENDP;*********兩位數(shù)碼管顯示子程序SHOW_2PROCpushAXpushBXpushDXCMPFLAG,0JZSHOWSPEEDMOVBL,10;將10放入寄存器BX,用來分離個(gè)位數(shù)MOVAL,TIMEMOVAH,0DIVBL;AL/BL,商放入AL,余數(shù)放入AHMOVTIME_GE,AHMOVAH,0DIVBLMOVTIME_SHI,AHMOVAH,0LEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIME_GEXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVTIME_GE,ALLEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIME_SHIXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVTIME_SHI,AL;個(gè)位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000001B;右側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,TIME_GEOUTDX,ALCALLDELAY1;延時(shí);十位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000010B;左側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,TIME_SHIOUTDX,ALCALLDELAY1;延時(shí)JMPSHOW_2ENDSHOWSPEED:MOVBL,10;將10放入寄存器BX,用來分離個(gè)位數(shù)MOVAL,SPEEDMOVAH,0DIVBL;AL/BL,商放入AL,余數(shù)放入AHMOVSPEED_GE,AHMOVAH,0DIVBLMOVSPEED_SHI,AHMOVAH,0LEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,SPEED_GEXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVSPEED_GE,ALLEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,SPEED_SHIXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVSPEED_SHI,AL;個(gè)位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000001B;右側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,SPEED_GEOUTDX,ALCALLDELAY1;延時(shí);十位MOVDX,L8255_A;自8255A的口輸出MOVAL,00000000B;數(shù)碼管滅OUTDX,ALMOVDX,L8255_BMOVAL,00000010B;左側(cè)數(shù)碼管亮OUTDX,ALMOVDX,L8255_A;自8255A的口輸出MOVAL,SPEED_SHIOUTDX,ALCALLDELAY1;延時(shí)LEADX,MSG1MOVAH,9INT21HMOVAL,SPEEDMOVBUF,ALMOVBL,10;將10放入寄存器BX,用來分離個(gè)位數(shù)MOVAL,SPEEDMOVAH,0DIVBL;AL/BL,商放入AL,余數(shù)放入AHMOVSPEED_GE,AHMOVAH,0DIVBLMOVSPEED_SHI,AHMOVAH,0MOVAL,SPEED_SHI;ADDAL,30HLEABX,ASC;將數(shù)碼管碼表的首地址放入BXXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVDL,AL;用dos02號(hào)功能,輸出字符MOVAH,02HINT21HMOVAL,SPEED_GE;ADDAL,30HLEABX,ASC;將數(shù)碼管碼表的首地址放入BXXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中MOVDL,AL;用dos02號(hào)功能,輸出字符MOVAH,02HINT21HSHOW_2END:popDXpopBXpopAXRETSHOW_2ENDP;*********一位數(shù)碼管顯示子程序SHOW_1PROCpushAXpushBXpushDXCMPTIME,0FHJASHOW_1_ENDMOVDX,L8255_BMOVAL,00000001B;右側(cè)數(shù)碼管亮OUTDX,ALLEABX,LED;將數(shù)碼管碼表的首地址放入BXMOVAL,TIMEXLAT;查表指令,將DS:[BX+AL]的內(nèi)容送到AL中;輸出MOVDX,L8255_A;8255A的口輸出OUTDX,ALSHOW_1_END:popDXpopBXpopAXRETSHOW_1ENDP;*********DOS顯示子程序SHOW_DOSPROCpushAXpushBXpushDXCMPFLAG,0JZSHOW_DOS_ENDMOV
評(píng)論
0/150
提交評(píng)論