單片機與控制實驗(1)——數碼管顯示


本文為大大維原創,最早於博客園發表,轉載請注明出處!!!

 

一、實驗目的和要求

  初步學習和掌握MCS-51的體系結構和匯編語言,了解Keil編程環境和程序下載工具的使用方法。了解數碼管輸出的原理及編程方式。

二、實驗設備

  單片機測控實驗系統

  STC-ISP程序下載工具

  Keil開發環境

三、實驗內容

  使用MCS-51匯編語言編寫程序,完成如下功能:

  1. 使用三個數碼管顯示十進制數值(001~999,可任意設置);

  2. 每隔1秒,該數值自動減一,直到歸零;

  3. 歸零后的下一秒,顯示一個新的十進制數值(001~999,可任意設置);

  4. 每隔1秒,新數值繼續自動減一,直到再次歸零;

  5. 重新執行步驟1,循環往復。

  6. 當開關S1按下時,暫停計數;S1松開時,恢復計數。

四、實驗步驟

  1. 預習

  參考輔助材料,學習8031匯編語言以及實驗原理。閱讀七段數碼顯示器的電路圖,重點理解右邊的LED顯示部分。

 

  2. 簡單程序錄入和調試

  MCS51單片機匯編語言的基本格式比較簡單,程序中可以使用通用寄存器或者內存單元進行計算。另外,單片機的程序沒有退出到操作系統的概念,一般都是死循環程序。

  一個簡單程序舉例如下:  

ORG 0000H ;復位起始地址
LJMP START ;中間地址保留給中斷向量表
ORG 0040H ;程序實際起始地址
START: ; 實際程序
MOV 40H, #0H

NEXT:

MOV A, 40H
INC A
MOV P0, A ;板上的P0口連接到8個LED,可以監視運行狀態
MOV 40H, A
MOV R6, #0FFH
L2:MOV R7, #0FFH
L1:DJNZ R7, L1
DJNZ R2, L2 ;延遲一段時間
LJMP NEXT
END

  參考Keil使用指南,創建工程,設置工程參數,添加ASM文件,並錄入上面的簡單程序。確保無編譯和鏈接錯誤。

  3. 程序調試 

  使用Keil環境可以進行仿真調試。進入“調試”菜單,開始調試,可以單步運行,或者先設置斷點然后連續運行;可以在調試過程中觀察各個寄存器的值。還可以在sys區域觀察到當前程序執行的時間。

  4. 編寫程序,完成功能

  A、顯示

  本開發平台有3個數碼管,使用串行方式連接在一起,具體電路參見實驗原理。要想輸出一個字形碼,就需要從高位到低位依次向移位寄存器輸出8個比特。移位寄存器的數據線和時鍾線分別接到單片機的P4.5和P4.4管腳,可以使用MCS-51里面的位操作指令進行輸出。連續輸出3個字形,24個bit之后,欲顯示的字形將穩定地顯示在數碼管上,程序可以轉而執行其他工作。

  七段字形的編碼方式需要通過實驗獲得。這些編碼作為程序中的常數,使用DB命令存放。在程序中,需要將數值轉換為相應的字形編碼,可以使用MOVC指令來完成。

  B、時間

  本實驗要求的按時間顯示數值,直接通過軟件延時來實現,也就是若干次空循環來完成,不需要使用單片機內部的定時器等硬件資源。由於在后面的實驗中也要使用軟件的延時子程序,因此這里預先做准備。
  本單片機使用12MHz主頻的晶振,結合MCS51的體系結構和指令時序,可以計算每條指令的運行時間,也可以通過Keil環境的調試功能來檢查程序片段的執行時間。當然,最后可以通過程序執行的總體運行結果來調整時間。希望同學能夠通過這個過程,得出一段能夠精確到1ms的子程序,重復調用1000次,從而達到定時1s的效果。從而完成實驗要求2。

  C、開關

  在本實驗板上設置了兩個開關S1和S2,分布接入到8031的P3.6和P3.7,開關按下時,輸入0,松開時,輸入1。利用這個開關完成實驗要求3。

  五、實驗原理

  本實驗采用3個74HC164級聯控制三個數碼管的顯示,具體實驗原理如下圖所示。其中使用單片機P4.5作為模擬串口數據,使用P4.4模擬串口時鍾,CLR端接高電平。使用上一個74HC164的Q7作為下一個74HC164的輸入端。

  P4 EQU 0C0H
  MOV P4.4, C
  SETB P4.4

  74HC164是高速CMOS 器件。74HC164是8位邊沿觸發式移位寄存器,串行輸入數據,然后並行輸出。數據通過兩個輸入端(A或B)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。

  時鍾 (CLK) 每次由低變高時,數據右移一位,輸入到Q0,Q0 是兩個數據輸入端(A和B)的邏輯與,它將上升時鍾沿之前保持一個建立時間的長度。

  主復位(CLR)輸入端上的一個低電平將使其它所有輸入端都無效,同時非同步地清除寄存器,強制所有的輸出為低電平。

 

  六、實驗代碼  

ORG 0000H
LJMP START
ORG 0050H

START:

 

;初始化
P4 EQU 0C0H ;申明P4地址
P4SW EQU 0BBH ;申明P4SW地址
CLK EQU P4.4
DAT EQU P4.5
KEY EQU P3.6
MOV DPTR,#TAB
MOV P4SW,#70H ;STC單片機P4.4、P4.5、P4.6有第二功能定義,
;通過P4SW寄存器設置這三口的工作方式,當為1時,是通用I/O
;此處設置P4.4、P4.5、P4.6為通用I/O

 

AGAIN: ;死循環

 

;顯示設置
MOV R6,#3 ;個位設置
MOV R5,#4 ;十位設置
MOV R4,#5 ;百位設置

 


LOOP:

 

;顯示各位
MOV A,R6
MOV DPTR,#TAB
MOVC A,@A+DPTR
LCALL DISPLAY ;調用顯示函數

 

MOV A,R5
MOV DPTR,#TAB
MOVC A,@A+DPTR
LCALL DISPLAY

 

MOV A,R4
MOV DPTR,#TAB
MOVC A,@A+DPTR
LCALL DISPALY

LCALL DELAY ;調用延遲函數

 

;按下key時的暫停操作
PAUSE:NOP
JNB KEY,PAUSE

 

;數字調整,減一操作
;個位調整
DEC R6 ;每次計數減一
CJNE R6,#0FFH,LOOP ;R6!=-1時跳轉到LOOP,否則,順序執行
MOV R6,#9

 

;十位調整
DEC R5
CJNE R5,#0FFH,LOOP
MOV R5,#9

 

;百位調整
DEC R4
CJNE R4,#0FFH,LOOP
;MOV R4,#9

 

LJMP AGAIN

 


;顯示子程序
DISPLAY:
MOV R0,#8
COUNT:
CLR CLK ;P1.0輸出低電平
RLC A ;將存放在A中欲顯示的字符碼右移一位(最低位存入C)
MOV DAT,C
SETB CLK ;P1.0輸出高電平
DJNZ R0,COUNT ;R0減1不為0轉到SLP 繼續輸出字形碼
RET

 


;延時子程序
DELAY:
MOV R1,#0FFH
STOP:
MOV R2,#1FH
DEL:
MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DEL
DJNZ R1,STOP

 

RET

 

TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END

七、附錄

 

實驗電路原理圖:點擊查看

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM