微機原理課設 汽車速度控制
熱身
測介面實驗
測試實驗臺的 8255 介面是否完好,可以這麼測:按下一個鍵, LED 顯示對應開關的開啟與否。我們組運氣比較倒黴,第一天時碰到有壞的介面。
需要注意的地方:把埠號(我們的實驗臺 IOY0 是 0600H,狀態控制字埠是 0606H,控制字 82H 表示 B口輸入 其他口輸出),狀態控制字都檢驗一遍,檢視 8255 每個埠是否能正常輸入輸出。
;(1)按下任意一個鍵,LED顯示對應開關的開啟與否 IOY0 EQU 0600H AA EQU IOY0+0*2 BB EQU IOY0+1*2 CC EQU IOY0+2*2 MODE EQU IOY0+3*2 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START: MOV DX,MODE MOV AL,82H OUT DX,AL NEXT: MOV DX,BB IN AL,DX MOV DX,AA OUT DX,AL MOV AH,1 JMP NEXT MOV AH,4CH INT 21H CODE ENDS END START
流水燈實驗要求
能夠在自行設計的介面開發板上,利用不同開關控制 LED 燈的變化。例如:K1 從左往右,K2 從右往左,K3 從中間向兩邊,K4 從兩邊向中間依次亮滅變化
解法
這段程式碼當時做的時候沒儲存,不過程式碼的邏輯很簡單:設定好實驗臺上的埠輸出與狀態字相關操作後,利用一個十六位的暫存器負責將資料輸出到兩個八排 LED 燈,每次迴圈執行 ROR 或者 ROL(根據需求而定)。
當時的實驗臺:
下面這段程式碼只是一個 Demo,可以以此基礎上改:
;(2)流水燈實驗 IOY0 EQU 0600H AA EQU IOY0+0*2 BB EQU IOY0+1*2 CC EQU IOY0+2*2 MODE EQU IOY0+3*2 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START: MOV DX,MODE 這幾行是設定控制字 MOV AL,80H ;80H 輸出, 82H輸入 OUT DX,AL MOV BL,80H MOV BH,01H NEXT: MOV DX,AA 輸出步驟:1、設定值 2、設定地址 3、向埠輸出 MOV AL,BL OUT DX,AL MOV DX,BB MOV AL,BH OUT DX,AL CALL DELAY ROR BL,1 ROL BH,1 JMP NEXT MOV AH,4CH INT 21H DELAY PROC NEAR MOV CX,20H D1: MOV AX,0FFFFH D2: DEC AX JNZ D2 LOOP D1 RET DELAY ENDP CODE ENDS END START
汽車控制
我們的汽車控制邏輯是這樣:利用兩個數碼管顯示汽車速度,一個數碼管顯示檔位,4個開關控制速度的增加與減少,K1 為 1 擋(10 km/h),K2 為 2 擋(20 km/h),K3 為 4擋(40km/h),K4 為 6擋(60km/h),加速時只能依次加,而不能直接增加到 6擋,減速時可以直接從 60 減速到 0。
實現難點在於數碼管的動態顯示:由於四位一體數碼管同用一個串列埠進行輸入,這樣的話我們就不能分別送不同的值給四個數碼管,所以需要通過 8255 的 C 口輸出數碼管地址口而不是將數碼管地址口全部接 GND,使其中三個接地,一個接高電平(相當於這個口輸入為 1),使得某一個數碼管亮而其他幾個是熄滅的。然後再傳值,傳入的值是將速度除以 10 之後的十位數字或者是各位數字,採用 div 指令實現。然後我們通過改變延時時長與 call 子程式的次數,改變每個燈亮的間隔,讓肉眼感覺多個數碼管同時在改變數字。
程式碼部分
IOY0 EQU 0600H ;片選IOY0對應的埠始地址 MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制暫存器地址 SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS DATA SEGMENT NUMS DB 3FH,06H,5BH,4FH,66h,6dh,7dh,07h,7fh,6fh,79H ; ;SELECT_OUTSMG1 DB 0H, 0FEH, 0FDH, 0FBH, 0F7H DATA ENDS CODE SEGMENT ASSUME CS:CODE,SS:SSTACK START: MOV AX,DATA MOV DS,AX MOV AX,SSTACK MOV SS,AX MOV DX, MY8255_MODE MOV AL, 82H ;1000 0001 表示A口C口高四位低四位輸出,B口為輸入 OUT DX, AL ;控制字送控制暫存器 MOV BX, 0 ;清零 CTRL: MOV DX , MY8255_B IN AL, DX ;C口值送AL,進行輸入 MOV AH,0 ;AX的高8位清零 TEST AL,1H ;AL是否等於1,進行and操作,影響標誌位 JNZ T1 ;若AL為XXXX XXX1,跳T1 MOV CX ,00 ;CX送0 JMP A1 T1: TEST AL, 2H JNZ T2 ;若AL為XXXX XX1X,跳T2 MOV CX,10 ;CX送10 MOV DX , MY8255_B mov AL,00010000B ; out DX, AL ;將AL的值給C口 JMP A1 T2: TEST AL, 4H JNZ T3 ;若AL為XXXX X1XX,跳T3 MOV CX, 20 ;CX送20 MOV DX , MY8255_B mov AL, 00100000B out DX, AL JMP A1 T3: TEST AL,8H JNZ T4 ;若AL為XXXX 1XXX,跳T4 MOV CX,40 MOV DX , MY8255_B mov AL,01000000B out DX, AL JMP A1 T4: MOV CX,60 ;CX送60 MOV DX , MY8255_B mov AL,10000000B out DX, AL JMP A1 A1: CMP BX,CX JNZ AMD ;ZF=0,跳AMD CMP BX,0 JE CWT ;ZF=1,跳CWT AMD: CMP CX,BX JB ASD ;CX小於BX,跳ASD CALL PRINT1 ;執行子程式,會返回 JMP CTRL ASD: CALL PRINT2 JMP CTRL CWT: CALL PRI JMP CTRL PRINT1 PROC ;因為每次只能亮1個的原因,所以要call多次實現肉眼錯覺 CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI ;CALL PRI ;CALL PRI ;CALL PRI INC BX CMP BX,CX JB PRINT1 MOV BX,CX RET PRINT1 ENDP PRINT2 PROC CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI CALL PRI ;CALL PRI ;CALL PRI ;CALL PRI DEC BX CMP CX,BX JB PRINT2 MOV BX,CX RET PRINT2 ENDP PRI PROC PUSH CX PUSH DX PUSH AX PUSH BX ;速度高位 MOV AX,BX MOV CL,10 DIV CL ; AH 餘數 AL 商 36 / 10 = 3 ..... 6 MOV CX,0 MOV CX,14 ;0000 1110b,就是設定第一個數碼管亮 MOV BL,AL ; 3 CALL HUA CALL YANSHI ;速度低位 MOV BL,AH MOV CX,13 ;0000 1101b,就是設定第二數碼管亮 CALL HUA CALL YANSHI ;檔位 MOV BL, AL MOV CX,7 ;0000 0111b,就是設定第4個亮 CALL HUA CALL YANSHI POP BX POP AX POP DX POP CX RET PRI ENDP HUA PROC PUSH BX PUSH AX ;控制第XXX燈亮 MOV DX, MY8255_C MOV AX,CX OUT DX,AX ;B口輸出CX ;輸出值到數碼管 MOV BH,0 MOV DX,MY8255_A MOV SI,OFFSET NUMS MOV AX,[SI+BX] OUT DX,AX ;A口輸出BX,也就是NUMS[BX] POP AX POP BX RET HUA ENDP YANSHI PROC PUSH CX MOV CX,2000 YS: CALL YANSHI2 DEC CX JNZ YS POP CX RET YANSHI ENDP YANSHI2 PROC PUSH CX MOV CX,1 TYUY: DEC CX JNZ TYUY POP CX RET YANSHI2 ENDP CODE ENDS END START
實驗臺接法
注意實驗臺部分 B C 口對調,C 口低四位輸入控制開關 ,所以程式碼需要將狀態控制字改成 81 H 並且將下面的 MY8255_C 和 MY8255_B 對調
實驗臺效果展示
撥動 K1 K2,汽車速度為 20 km/h,檔位為 2 擋
電路佈線圖
四位一體數碼管的引腳可能會不一樣,另外推薦做一個映象圖,焊板子背面的時候方便
洞洞板實物圖
需要注意的是老師不讓用飛線,而我嫌背面太醜用了兩個飛線焊到了洞洞板的正面,所以得去掉這兩個飛線,換成背面的導線
感悟
因為自己大一是電路相關專業的,有學過 C51 和 STM32 ,以及大二自己看了一點王爽的彙編,所以這次實驗總體難度不大,但是周圍的同學普遍對硬體有排斥的心理,而幸運的是我的隊友們比較好,原意去學一下這次實驗的東西。發現軟工學生硬體真是一個硬傷,硬體課程少,沒焊過甚至沒見過電路板,感覺有點可惜