設(shè)計(jì)數(shù)碼管電子表_第1頁
設(shè)計(jì)數(shù)碼管電子表_第2頁
設(shè)計(jì)數(shù)碼管電子表_第3頁
設(shè)計(jì)數(shù)碼管電子表_第4頁
設(shè)計(jì)數(shù)碼管電子表_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 僅 供 參 考1實(shí)驗(yàn)一設(shè)計(jì)數(shù)碼管電子表一一實(shí)驗(yàn)要求:實(shí)驗(yàn)要求:使用使用 82538253 的兩個(gè)計(jì)數(shù)器串連,作為微機(jī)系統(tǒng)的外擴(kuò)定時(shí)源,以的兩個(gè)計(jì)數(shù)器串連,作為微機(jī)系統(tǒng)的外擴(kuò)定時(shí)源,以數(shù)碼管電路作為外擴(kuò)輸出設(shè)備,采用中斷方式編程,實(shí)現(xiàn)數(shù)碼數(shù)碼管電路作為外擴(kuò)輸出設(shè)備,采用中斷方式編程,實(shí)現(xiàn)數(shù)碼管電子表管電子表“具體要求如下:具體要求如下:1 1六位數(shù)碼管分別顯示時(shí),分,秒。六位數(shù)碼管分別顯示時(shí),分,秒。2 2初始時(shí)間由主機(jī)鍵盤輸入。初始時(shí)間由主機(jī)鍵盤輸入。3 3主機(jī)按任意鍵停止計(jì)時(shí)返回主機(jī)按任意鍵停止計(jì)時(shí)返回 DOSDOS。二:實(shí)驗(yàn)電路二:實(shí)驗(yàn)電路 +5V 與計(jì)算機(jī)數(shù)據(jù)線相連 208H20FH

2、接 B4 端子 A(+5V) A1 Q2 B(8MHZ) A0 IOR IOW 8253GATE0 D7-D0GATE1 OUT0 OUT1CS OUT2A1 CLK0A0 CLK1RD CLK2 WR 2*393 僅 供 參 考2 CS 200H207H(*注意:A1,A0 用來選擇 8253 內(nèi)部三個(gè)計(jì)數(shù)器中的一個(gè),它們分別與計(jì)算機(jī)地址線的低兩位相連。RD,WR 用來控制 8253 的讀寫,它們分別與計(jì)算機(jī)的 IOR,IOW 相連)電路分析:電路分析:從 Q2 出來的時(shí)鐘頻率為 1MHZ,為實(shí)現(xiàn)一秒鐘調(diào)用一次中斷,必須要每 1000000 次時(shí)鐘調(diào)用一次中斷。我們同時(shí)將計(jì)數(shù)器 0 和計(jì)數(shù)器

3、1 的初值都設(shè)為 1000,并將計(jì)數(shù)器 0 的輸出 OUT0 作為計(jì)數(shù)器 1 的時(shí)鐘,并將計(jì)數(shù)器 1 的輸出 OUT1 連到 B4 端子上,這樣就實(shí)現(xiàn)了每100010001000000 次時(shí)鐘調(diào)用一次中斷。三三82538253 控制字格式控制字格式 D7D7 D6D6 D5D5 D4D4 D3D3 D2D2 D1D1 D0D0 SC1SC1 SC2SC2 RL1RL1 RL0RL0 M2M2 M1M1 M0M0 BCDBCD IO 地址譯碼器數(shù)碼管電路通道選擇:00=計(jì)數(shù)器 001=計(jì)數(shù)器 110=計(jì)數(shù)器 211=非法操作類型:00=計(jì)數(shù)器鎖存01讀/寫低字節(jié)10讀/寫高字節(jié)11讀/寫 16

4、位字,先低字節(jié),后高字節(jié)方式選擇:000方式 0001方式 1X10方式 2X11方式 3100方式 4101方式 5計(jì)數(shù)方式:0=二進(jìn)制計(jì)數(shù)1BCD 碼計(jì)數(shù) 僅 供 參 考3四程序清單:四程序清單:TITLE DISPTIMEDSEG SEGMENT INPUT_TIM DB Please input the current t ime.,13,10,$ SHOW_TIM DB Time is as the follow.Press Ctr-C to exit.,13,10,$ BAD_DATA DB Digits mush be between 0 and 9,13,10,$ BAD_HR

5、S DB Hour must be between 0 and 23,13,10,$ BAD_MINS DB Minutes mush be between 0 and 59,13,10,$ BAD_SECS DB Seconds mush be between 0 and 59,13,10,$ CRLF DB 13,10,$ ASK_HRS DB Hour(0-23):$ ASK_MINS DB Minute(0-59):$ ASK_SECS DB Second(0-59):$ USER DB 3,3 DUP(?) TIME DB 3 DUP(?) COUNT DW 1 OLD0A DD ?

6、 TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDSEG ENDS 僅 供 參 考4SSEG SEGMENT STACK STACK DB 256 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEGSTART PROC FAR MOV AX,DSEG MOV DS,AX CALL GET_TIME CLI CALL I8253 (初始化8253) CALL I8259 (初始化 8259) CALL RD0A (讀入原

7、 0A 中斷向量) CALL WR0A(寫入新中斷向量)ROTATE: CALL DISPLAY(只要不按鍵,就不斷調(diào)用 DISPLAY 顯示 TIME 變量中的時(shí)間) MOV AH,1 INT 16H JZ ROTATE (按鍵輸入后退出。 ) CALL RESET MOV AH,4CH INT 21H RETSTART ENDP;*(SERVICE 為新的中斷程序)SERVICE PROC NEAR PUSH AX PUSH DS MOV AX,DSEG MOV DS,AX CALL CHANGE_TIME(函數(shù) CHANGE_TIME 用以將時(shí)間增加一秒) 僅 供 參 考5MOV AL,

8、20H OUT 20H,AL(送應(yīng)答信號) POP DS POP AX IRETSERVICE ENDP;*(此函數(shù)將保存在 TIME 變量中的時(shí)間顯示在數(shù)碼管上。)DISPLAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV SI,OFFSET TIME MOV BX,OFFSET TABLE MOV CL,4 MOV AL,SI MOV AH,AL SAR AL,CL AND AH,00001111B XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,01H OUT DX,AL MOV

9、AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,02H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,SI+1 MOV AH,AL 僅 供 參 考6 SAR AL,CL AND AH,00001111B XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,04H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,08H

10、 OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,SI+2 MOV AH,AL SAR AL,CL AND AH,00001111B XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,10H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,20H OUT DX,AL MOV AL,0 OUT DX,AL POP SI POP DX 僅 供 參 考7 POP CX POP BX POP AX RETDISPLA

11、Y ENDP;* I8253 PROC NEAR MOV AL,00110100B MOV DX,20BH OUT DX,AL(設(shè)定 8253 的計(jì)算器 0,寫入時(shí)先低字節(jié)后高字節(jié),方式 2,二進(jìn)制計(jì)數(shù)) MOV AX,1000 MOV DX,208H OUT DX,ALMOV AL,AH OUT DX,AL(計(jì)數(shù)器 0 的初值設(shè)為 1000。 ) MOV AL,01110100B MOV DX,20BH OUT DX,AL(設(shè)定 8253 的計(jì)算器 1,入時(shí)先低字節(jié)后高字節(jié),方式 2,二進(jìn)制計(jì)數(shù)) MOV AX,1000 MOV DX,209H OUT DX,AL MOV AL,AH OUT

12、 DX,AL (計(jì)數(shù)器 1 初值設(shè)為1000。 ) RETI8253 ENDP;*I8259 PROC NEAR IN AL,21H AND AL,11111011B OUT 21H,AL IN AL,0A1H AND AL,11111101B OUT 0A1H,AL 僅 供 參 考8 RETI8259 ENDP;*RD0A PROC NEAR MOV AX,350AH INT 21H MOV WORD PTR OLD0A,BX MOV WORD PTR OLD0A+2,ES RETRD0A ENDPWR0A PROC NEAR PUSH DS MOV AX,CSEG MOV DS,AX MO

13、V DX,OFFSET SERVICE MOV AX,250AH INT 21H POP DS RETWR0A ENDP;*RESET PROC NEAR MOV DX,WORD PTR OLD0A MOV DS,WORD PTR OLD0A+2 MOV AX,250AH INT 21H (恢復(fù)原來的中斷向量) IN AL,0A1H OR AL,00000010B OUT 0A1H,AL (屏蔽用戶中斷) RETRESET ENDP;*(函數(shù) GET_TIME 的作用是接受 僅 供 參 考9用戶輸入的時(shí)間,并把它保存在6 字節(jié)變量 TIME 中。為了保證程序的嚴(yán)謹(jǐn),如果輸入的時(shí)間非法,則顯示出

14、錯(cuò)信息并要求重輸。 )GET_TIME PROC NEAR LEA DX,INPUT_TIM MOV AH,9 INT 21H (提示輸入時(shí)間)HOUR: LEA DX,ASK_HRS MOV AH,9 INT 21H (提示輸入小時(shí)) CALL INPUT_TIME (函數(shù) INPUT_TIME 的功能是把用戶輸入的字符轉(zhuǎn)化為時(shí)間值并存放在 BL 中如果輸入的不是數(shù)字,那么讓標(biāo)志寄存器 CF1) JC HOUR (輸入不是數(shù)字,重輸) CMP BL,23H JNA HRS2 (如果輸入的數(shù)字比 24 小,那么跳到 HRS2 去執(zhí)行下面的內(nèi)容;如果輸入的數(shù)字大于等于 24,那么要求重輸。對于分

15、,秒的輸入也按照此法處理。 ) LEA DX,BAD_HRS MOV AH,9 INT 21H JMP HOURHRS2: PUSH BXMIN: LEA DX,ASK_MINS MOV AH,9 INT 21H CALL INPUT_TIME JC MIN CMP BL,59H JNA MIN2 LEA DX,BAD_MINS MOV AH,9 INT 21H JMP MIN 僅 供 參 考10MIN2: PUSH BXSEC: LEA DX,ASK_SECS MOV AH,9 INT 21H CALL INPUT_TIME JC SEC CMP BL,59H JNA SEC2 LEA DX

16、,BAD_SECS MOV AH,9 INT 21H JMP SEC(以下程序段將輸入的的時(shí)間保存在 TIME 變量中)SEC2: MOV SI,OFFSET TIME MOV SI+2,BL POP BX MOV SI+1,BL POP BX MOV SI,BL RETGET_TIME ENDP;*(函數(shù) INPUT_TIME 的功能是把用戶輸入的字符轉(zhuǎn)化為時(shí)間值并存放在 BL 中;如果輸入的不是數(shù)字,那么讓標(biāo)志寄存器CF1)INPUT_TIME PROC NEAR LEA DX,USER MOV AH,0AH INT 21H LEA DX,CRLF MOV AH,9 INT 21H CMP

17、 USER+1,1 JAE CONVERT MOV BL,0 RETCONVERT: MOV CL,4 MOV AL,USER+2 CALL CHECK JC LEAVE 僅 供 參 考11 AND AL,0FH MOV BL,AL CMP USER+1,2 JB CLR_CF SHL BL,CL MOV AL,USER+3 CALL CHECK JC LEAVE AND AL,0FH OR BL,ALCLR_CF: CLCLEAVE: RETINPUT_TIME ENDP;*CHECK PROC NEAR CMP AL,0 JB ERROR CMP AL,9 JA ERROR CLC RET

18、ERROR: LEA DX,BAD_DATA MOV AH,9 INT 21H STC RETCHECK ENDP;*(此函數(shù)將保存在 TIME 變量中的時(shí)間增加一秒)CHANGE_TIME PROC NEAR PUSH AX PUSH CX PUSH DX PUSH SI MOV SI,OFFSET TIME MOV AL,SI MOV CH,AL MOV AL,SI+1 MOV CL,AL MOV AL,SI+2 MOV DH,AL 僅 供 參 考12(CH:CL:DH時(shí):分:秒) MOV AL,DH ADD AL,1 DAA MOV DH,AL CMP DH,60H JNE EXITCH

19、G MOV DH,0 MOV AL,CL ADD AL,1 DAA MOV CL,AL CMP CL,60H JNE EXITCHG MOV CL,0 MOV AL,CH ADD AL,1 DAA MOV CH,AL CMP CH,24H JNE EXITCHG MOV CH,0EXITCHG: MOV SI,OFFSET TIME MOV SI,CH MOV SI+1,CL MOV SI+2,DH POP SI POP DX POP CX POP AX RETCHANGE_TIME ENDPCSEG ENDS END START 五五. .實(shí)驗(yàn)總結(jié)實(shí)驗(yàn)總結(jié): :1. 由于與本實(shí)驗(yàn)相關(guān)的程序上

20、學(xué)期編過(在屏幕上顯示時(shí)間) ,所以這次實(shí)驗(yàn)我的程序中的主要部分是用的以前的,添加了將時(shí)間顯示在數(shù)碼管上的程序。上學(xué)期編的那個(gè)程序中,我用三個(gè)字節(jié)來存儲時(shí)分秒,這次仍然沿用這個(gè)習(xí)慣。但這個(gè) 僅 供 參 考13習(xí)慣使我在編將時(shí)間顯示在數(shù)碼管上的子程序(DISPLAY)的時(shí)候遇到了困難,因?yàn)橐粋€(gè)字節(jié)代表的是數(shù)碼管上的兩個(gè)位置,所以編查表程序時(shí)必須把那個(gè)字節(jié)的信息拆分為兩個(gè)字節(jié)再進(jìn)行查表,這使程序繁瑣,可讀性降低。如果用六個(gè)字節(jié)分別存儲時(shí)的十位,時(shí)的個(gè)位,分的十位,分的個(gè)位,秒的十位,秒的個(gè)位,那么在編顯示程序時(shí)確實(shí)方便了許多,但是在編改變時(shí)間的程序時(shí)卻會更復(fù)雜一些。因此這兩種方法各有利弊。2. 在

21、程序的結(jié)束 RESET 函數(shù)中一定要屏蔽用戶中斷,否則下一次調(diào)用程序時(shí)就不會響應(yīng)中斷,這個(gè)問題讓我耗費(fèi)了很多時(shí)間。實(shí)驗(yàn)二:小鍵盤按鍵識別一實(shí)驗(yàn)要求一實(shí)驗(yàn)要求: :本次實(shí)驗(yàn)的要求與前一實(shí)驗(yàn)類似,但僅要求識別小鍵盤 09 數(shù)字鍵,將小鍵盤鍵入的任意長的 09 數(shù)字串,采用左移位動(dòng)態(tài)顯示的方法顯示在數(shù)碼管電路上,當(dāng)小鍵盤按下”R”時(shí)停止演示.二程序框圖二程序框圖: : 預(yù)置:A 口為方式 0 輸出 B 口為方式 0 輸入 僅 供 參 考14 Y 無鍵閉合 N:AH 為閉合鍵“列值” Y Y0PA7-PA0PB2-PB0 AHAH=7?延時(shí) 20ms預(yù)置:B 口為方式 0 輸出A 口為方式 0 輸入列

22、值 PB2-PB0PA7-PA0 AL根據(jù) AX 內(nèi)容,查找鍵值表,顯示相應(yīng)的鍵值。是 R?結(jié)束演示 僅 供 參 考15三實(shí)驗(yàn)電路圖:三實(shí)驗(yàn)電路圖:四四82558255 方式選擇控制字方式選擇控制字 1 D6 D5 D4 D3 D2 D1 D0方式選擇控制字標(biāo)志A 組方式:00方式 001方式 11X方式 2A 口 IO1輸入0輸出C 上半口 IO:1輸入0輸出B 組方式:0方式 01方式 1B 口IO:1輸入0輸出C 下半口 IO:1=輸入0輸出 僅 供 參 考16五源程序:五源程序:TITLE LITTLEKEYBOARDSSEG SEGMENT PARA STACK STACK DB 2

23、56 DUP (0)SSEG ENDSDSEG SEGMENT A_8255 EQU 210H B_8255 EQU 211H CON_8255 EQU 213H BUFFER DB 6 DUP(0) HANG DB ? LIE DB ? NEWHANG DB ? NEWLIE DB ? TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG, DS:DSEG,SS:SSEG START PROC NEAR MOV AX,DSEG MOV DS,AXCALL CLOSEALL(關(guān)

24、掉數(shù)碼管,防止因?yàn)樽畛鯏?shù)碼管有顯示而使程序執(zhí)行不正常。)CMPAGAIN: CALL DISPLAY(DISPLAY 函數(shù)用來將 BUFFER 中的鍵值顯示在數(shù)碼管上。)MOV DX,CON_8255MOV AL,10000010BOUT DX,AL (設(shè)定 A 口方式 0 輸出,B 口 僅 供 參 考17方式 0 輸入)AGAIN: CALL DISPLAY MOV DX,A_8255 MOV AL,0 OUT DX,AL (0PA7-PA0) MOV DX,B_8255 IN AL,DXAND AL,00000111B (取出PB0PB2CMP AL,00000111B JE AGAIN

25、MOV LIE,AL(將列值保存) CALL DELAY1(延時(shí)20ms) MOV DX,CON_8255MOV AL,10010000BOUT DX,AL(預(yù)置 A 口方式 0 輸入,B 口方式 0 輸入) MOV DX,A_8255 IN AL,DX MOV HANG,AL(將行值保存)CALL GETINPUT(GETINPUT 函數(shù)通過行值和列值查出輸入的鍵值,并將它保存在 AL 中,如果輸入是 R,則 AL賦值為 FFH;如果輸入非法字符,則 AL 賦值為 0AH。 ) CMP AL,0AHJE CMPAGAIN(如果是非法字符則跳回) CMP AL,0FFHJNE CONTINUE

26、(如果是 R 則退出程序.) CALL CLOSEALL MOV AH,4CH INT 21HCONTINUE:CALL CHANGE(CHANGE 函數(shù)用來改變 BUFFER 僅 供 參 考18中保存的鍵值) MOV DX,CON_8255MOV AL,10000010BOUT DX,AL (設(shè)定 A 口方式 0 輸出,B 口方式 0 輸入)LLL:CALL DISPLAYMOV DX,B_8255IN AL,DXAND AL,00000111B (取出 PB0PB2)CMP AL,00000111BJNE LLLJMP CMPAGAIN(不斷掃描,如果不松開按鍵,那么就循環(huán)等待;直到按鍵松

27、開就跳回。) RETSTART ENDP;*(此函數(shù)用以延時(shí) 20MS)DELAY1 PROC NEAR PUSH AX PUSH CX PUSH DX MOV AH,86H MOV CX,0 MOV DX,20000 INT 15H POP DX POP CX POP AX RETDELAY1 ENDP;*(GETINPUT 函數(shù)通過行值和列值查出輸入的鍵值,并將它保存在 AL 中,如果輸入是 R,則 AL賦值為 FFH;如果輸入非法字符,則 AL 賦值為 0AH。 )GETINPUT PROC NEAR 僅 供 參 考19 CMP LIE,00000110B JE LIE0 CMP LIE

28、,00000101B JE LIE1 CMP LIE,00000011B JE LIE2 MOV AL,0AH RETLIE2:CMP HANG,00010000B JE NEXT MOV AL,0AH RETNEXT:MOV AL,0FFH RETLIE0:CMP HANG,01111111B JE KEY8 CMP HANG,10111111B JE KEY9 MOV AL,0AH RETKEY8:MOV AL,8 RETKEY9:MOV AL,9 RETLIE1:CMP HANG,01111111B JE KEY0 CMP HANG,10111111B JE KEY1 CMP HANG,

29、11011111B JE KEY2 CMP HANG,11101111B JE KEY3 CMP HANG,11110111B JE KEY4 CMP HANG,11111011B JE KEY5 CMP HANG,11111101B JE KEY6 CMP HANG,11111110B JE KEY7 MOV AL,0AH RETKEY0:MOV AL,0 RET 僅 供 參 考20KEY1:MOV AL,1 RETKEY2:MOV AL,2 RETKEY3:MOV AL,3 RETKEY4:MOV AL,4 RETKEY5:MOV AL,5 RETKEY6:MOV AL,6 RETKEY7

30、:MOV AL,7 RETGETINPUT ENDP;*(CHANGE 函數(shù)用來改變 BUFFER中保存的鍵值,將 BUFFER 中的鍵值移位,最后一位加入 AL 中的新鍵值。)CHANGE PROC NEAR PUSH AX PUSH SI MOV SI,OFFSET BUFFER MOV AH,SI+1 MOV SI,AH MOV AH,SI+2 MOV SI+1,AH MOV AH,SI+3 MOV SI+2,AH MOV AH,SI+4 MOV SI+3,AH MOV AH,SI+5 MOV SI+4,AH MOV SI+5,AL POP SI POP AX RETCHANGE END

31、P;*(DISPLAY 函數(shù)用來將 BUFFER 中的鍵值顯示在數(shù)碼管上。) 僅 供 參 考21DISPLAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV BX,OFFSET TABLE MOV SI,OFFSET BUFFER MOV CL,1XUNHUAN: MOV AL,SI XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,CL OUT DX,AL MOV DX,200H MOV AL,0 OUT DX,AL INC SI SHL CL,1 CMP CL,40H JNE XUNHU

32、AN POP SI POP DX POP CX POP BX POP AX RETDISPLAY ENDP;*(此函數(shù)用在退出程序時(shí)將數(shù)碼管關(guān)閉.)CLOSEALL PROC NEAR PUSH AX PUSH CX PUSH DX MOV CL,1XUNHUAN1: MOV DX,200H MOV AL,CL OUT DX,AL 僅 供 參 考22 MOV AL,0 OUT DX,AL SHL CL,1 CMP CL,20H JNE XUNHUAN1 POP DX POP CX POP AX RETCLOSEALL ENDPCSEG ENDS END START六實(shí)驗(yàn)總結(jié):六實(shí)驗(yàn)總結(jié): 1實(shí)

33、驗(yàn)電路板上 8255 的端口地址位 210H213H,這與書上給的不一樣,開始時(shí)在這方面花費(fèi)了較多時(shí)間。2通過此次程序設(shè)計(jì),我對計(jì)算機(jī)讀取鍵盤值的過程有了一定的認(rèn)識。最開始編程序時(shí)并沒有想到如果始終按同一個(gè)鍵不放,數(shù)碼管上就會一下子出來很多字符。調(diào)試時(shí)發(fā)現(xiàn)了這個(gè)問題,想到的解決方法有兩種,一種是每一次按鍵后檢測鍵是否松開,直到松開后再繼續(xù)執(zhí)行下一次判斷;另一種是按鍵后延緩一個(gè)固定的時(shí)間(大約 0.2 秒)再判斷(計(jì)算機(jī)的鍵盤就是采取這樣的方法) 。 本程序采用的是第一種方法。3編程序要養(yǎng)成好的習(xí)慣,我最初的程序結(jié)束時(shí)并沒有關(guān)掉數(shù)碼管,以致下次用時(shí)數(shù)碼管顯示不正確。好的程序應(yīng)該各方面想得周到一些

34、,例如我后來在開始和結(jié)束時(shí)都加了關(guān)閉數(shù)碼管程序(CLOSEALL) ,這就避免了上述問題。4我并沒有采用查表得方法來獲得鍵值,我覺得用跳轉(zhuǎn)的方法 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)23能使程序的可讀性強(qiáng)一些。當(dāng)然,程序代碼會長許多,但此法由于思路清楚,比較容易查錯(cuò)?!緦?shí)驗(yàn)三】數(shù)/模、模/數(shù)轉(zhuǎn)換實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)?zāi)康模毫私鈹?shù)/模、模/數(shù)轉(zhuǎn)換的基本原理,掌握 ADC0809 和 DAC0832 芯片的使用方法。二、實(shí)驗(yàn)任務(wù):二、實(shí)驗(yàn)任務(wù):在實(shí)驗(yàn)箱上設(shè)計(jì)并連接 ADC0809 芯片的接線,按中斷方式(利用 EOC 發(fā)中斷申請)對單通道模擬量進(jìn)行 A/D 轉(zhuǎn)換。A/D 轉(zhuǎn)換結(jié)果

35、送入 PC 機(jī)后,再由 PC 機(jī)送至 DAC0832 進(jìn)行 D/A 轉(zhuǎn)換,結(jié)果送至雙蹤示波器,與原信號進(jìn)行對比觀察。模擬信號源:由電位器中心抽頭可以得到一個(gè)可調(diào)節(jié)的直流電壓。電位器一端接地,另一端接+5V。三、實(shí)驗(yàn)電路:三、實(shí)驗(yàn)電路: 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)24四:源程序四:源程序TITLE ADDASSEG SEGMENT STACK STACK DB 256 DUP(?)SSEG ENDSDSEG SEGMENT OLD0A DD ?DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART PROC

36、NEARMOV AX,DSE MOV DS,AX CLI CALL I8259(初始化8259) CALL RD0A(保存原 0A 中斷向量) CALL WR0A(寫入新的中斷向量。 ) STI MOV DX,230H MOV AL,0OUT DX,AL (230H 為模擬量輸入口,進(jìn)行一次虛擬寫操作,啟動(dòng) A/D 轉(zhuǎn)換.) 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)25WAIT_IN: MOV AH,1 INT 16H JZ WAIT_IN CALL RESET MOV AH,4CH INT 21H RETSTART ENDP;*SERVICE PROC NEAR PUSH AX

37、 PUSH DS MOV AX,DSEG MOV DS,AX CLI IN AL,230H(讀入 A/D 轉(zhuǎn)換后的值到 AL 中。)MOV DX,228H OUT DX,AL(啟動(dòng) D/A 轉(zhuǎn)換) MOV DX,229H OUT DX,AL(將 AL 的值寫入 D/A 轉(zhuǎn)換器) MOV DX,230H MOV AL,0 OUT DX,AL(再次啟動(dòng) A/D 轉(zhuǎn)換器,為下一次轉(zhuǎn)換做準(zhǔn)備。)STI POP DS POP AX IRETSERVICE ENDP;*I8259 PROC NEAR IN AL,21H AND AL,11111011B OUT 21H,AL IN AL,0A1H AND

38、AL,11111101B 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)26 OUT 0A1H,AL RETI8259 ENDP;*RD0A PROC NEAR MOV AX,350AH INT 21H MOV WORD PTR OLD0A,BX MOV WORD PTR OLD0A+2,ES RETRD0A ENDP;*WR0A PROC NEAR PUSH AX PUSH DS MOV AX,CSEG MOV DS,AX MOV DX,OFFSET SERVICE MOV AX,250AH INT 21H POP DS POP AX RETWR0A ENDP;*RESET PROC

39、 NEAR MOV DX,WORD PTR OLD0A MOV DS,WORD PTR OLD0A+2 MOV AX,250AH INT 21H IN AL,0A1H OR AL,00000010B OUT 0A1H,AL RETRESET ENDPCSEG ENDS END START 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)27五實(shí)驗(yàn)總結(jié):五實(shí)驗(yàn)總結(jié):1編寫程序時(shí)要注意每次中斷服務(wù)程序執(zhí)行完成后都要給 AD 端口(230H)執(zhí)行一次虛擬寫操作,從而啟動(dòng) AD 轉(zhuǎn)換器進(jìn)行下一個(gè)數(shù)據(jù)的轉(zhuǎn)換。我開始時(shí)忽略了這個(gè)問題,結(jié)果使 DA 輸出恒定不遍,無法跟蹤輸入的變化。2連線時(shí)一定要搞清

40、原理,本實(shí)驗(yàn)是 AD 轉(zhuǎn)換完成后用 EOC 端子傳輸中斷請求的方式編程,所以要注意 I/O 口地址譯碼器的輸出端 228H22FH 接 DAC 的片選信號,230H237H 接 ADC 的片選信號,EOC 接總線的 B4 段,另外,要接 500的時(shí)鐘信號,利用 8MHZ 的信號源經(jīng) 16 分頻從 Q3 接出。實(shí)驗(yàn)四 DMA 傳送實(shí)驗(yàn)一實(shí)驗(yàn)?zāi)康模阂粚?shí)驗(yàn)?zāi)康模赫莆?DMA 方式的工作原理和 8237 的編程使用方法。二實(shí)驗(yàn)要求:二實(shí)驗(yàn)要求:1. 按照實(shí)驗(yàn)指導(dǎo)第 61 頁的實(shí)驗(yàn)接線圖連接硬件線路2. 對照【例 3.6.1】的程序清單鍵入源程序,經(jīng)匯編和連接后運(yùn)行程序三實(shí)驗(yàn)電路三實(shí)驗(yàn)電路 微機(jī)原理實(shí)驗(yàn)

41、報(bào)告 無 82 班 胡浩基(981084)28三電路分析三電路分析1DMA 讀入數(shù)據(jù)按下 DMA 按鍵,通過端子向 DMA 通道 1 發(fā)硬件 DMA 請求,系統(tǒng) DMA 控制器向 CPU 發(fā)總線請求信號,CPU 在執(zhí)行完當(dāng)前總線周期后向系統(tǒng) DMA 控制器發(fā)總線響應(yīng)信號,隨即把總線控制權(quán)交給 DMA 控制器,此時(shí) DACK1 有效。然后 DMA 控制器將通道 1的頁面地址寄存器及當(dāng)前地址寄存器中的內(nèi)容放到地址總線上去,并發(fā)出存儲器讀命令,讀出內(nèi)存單元中的內(nèi)容送往數(shù)據(jù)總線。由于 DACK1 有效,通過 J4 短路線選中 6116 和雙向總線驅(qū)動(dòng)器 74LS245,IOW 有效,通過 J3 短路線

42、,使 6116 的 WE 有效,從而把數(shù)據(jù)總線上的數(shù)據(jù)通過 74LS245 寫入到 6116 的 0 號單元,完成一次 DMA 讀傳送。此時(shí)通道 1 當(dāng)前地址寄存器自動(dòng)加1,當(dāng)前字節(jié)寄存器自動(dòng)減 1。另外通過 U38 和 JS 引線向分頻 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)29器輸入一個(gè)進(jìn)位脈沖,使分頻器計(jì)數(shù)一次,Q10Q0 輸出選擇6116 的下一個(gè)單元。再反復(fù)上述讀過程直到當(dāng)前字節(jié)寄存器為 FFFFH 為止,讀過程結(jié)束。 2將 DMA 數(shù)據(jù)寫到存儲器上按下 DMA 按鍵,通過端子向 DMA 通道 1 發(fā)硬件 DMA 請求,系統(tǒng) DMA 控制器向 CPU 發(fā)總線請求信號,

43、CPU 在執(zhí)行完當(dāng)前總線周期后向系統(tǒng) DMA 控制器發(fā)總線響應(yīng)信號,隨即把總線控制權(quán)交給 DMA 控制器,此時(shí) DACK1 有效。然后 DMA 控制器將通道 1的頁面地址寄存器及當(dāng)前地址寄存器中的內(nèi)容放到地址總線上去,并發(fā)出存儲器讀命令,讀出內(nèi)存單元中的內(nèi)容送往數(shù)據(jù)總線。由于 DACK1 有效,通過 J4 短路線選中 6116 和雙向總線驅(qū)動(dòng)器 74LS245,IOR 有效,通過 J2 短路線,使 6116 的 RD 有效,從而讀出 6116 當(dāng)前單元的內(nèi)容,通過 74LS245 寫入到系統(tǒng)數(shù)據(jù)總線,完成一次 DMA 寫傳送。此時(shí)通道 1 當(dāng)前地址寄存器自動(dòng)加 1,當(dāng)前字節(jié)寄存器自動(dòng)減 1。另

44、外通過 U38 和 JS 引線向分頻器輸入一個(gè)進(jìn)位脈沖,使分頻器計(jì)數(shù)一次,Q10Q0 輸出選擇 6116 的下一個(gè)單元。再反復(fù)上述讀過程直到當(dāng)前字節(jié)寄存器為 FFFFH 為止,寫過程結(jié)束。4 LS393 在本實(shí)驗(yàn)中的作用作為一個(gè)分頻器,在本實(shí)驗(yàn)中起到了選定存儲器 6116 地址的作用。這是通過輸入譯碼后的進(jìn)位時(shí)鐘實(shí)現(xiàn)的。 微機(jī)原理實(shí)驗(yàn)報(bào)告 無 82 班 胡浩基(981084)30四實(shí)驗(yàn)程序:四實(shí)驗(yàn)程序:DISP MACRO VAR MOV AH,09H MOV DX,OFFSET VAR INT 21HENDM (此宏的功能是將以形參VAR為地址的一個(gè)字符串打印在屏幕上)SCANKEY MAC

45、RO LOCAL LLLLLL: MOV AH,01H INT 16H JZ LLL(等待直到有鍵按下) MOV AH,0 INT 16H (將鍵值保存到AL中)ENDMDATA SEGMENTTEXT DB THE QUICK BROWN FOX JUMPS OVER LAZY DOG DB 0DH,0AH DB THE QUICK BROWN FOX JUMPS OVER LAZY DOG DB 0DH,0AH DB THE QUICK BROWN FOX JUMPS OVER LAZY DOG DB 0DH,0AH,$COUNT EQU $-TEXTBUF DB COUNT DUP(?)MESG DB TO MAKE A DMA REQUEST! DB THEN STRIKE ANY KEY!,0DH,0AH,$DATA ENDSSTACK SEGMENT STACK STACK DB 256 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKBEG: MOV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論