1. 程式人生 > >微機原理課設 汽車速度控制

微機原理課設 汽車速度控制

熱身


 

  測介面實驗

    測試實驗臺的 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 ,以及大二自己看了一點王爽的彙編,所以這次實驗總體難度不大,但是周圍的同學普遍對硬體有排斥的心理,而幸運的是我的隊友們比較好,原意去學一下這次實驗的東西。發現軟工學生硬體真是一個硬傷,硬體課程少,沒焊過甚至沒見過電路板,感覺有點可惜