實驗三 七段數碼顯示器

2022-04-09 23:48:23 字數 2807 閱讀 4687

1.實驗內容

使用mcs-51組合語言編寫程式,完成以下功能:

1. 使用三個數碼管顯示十進位制數值

2. 每隔0.1秒,該數值自動增一,到999後歸零繼續

3. 當開關s1按下時,暫停計數;s1鬆開時,恢復計數

2.顯示

本開發平台有3個數碼管,使用序列方式連線在一起,具體電路參見實驗原理。要想輸出乙個字形碼,就需要從高位到低位依次向移位暫存器輸出8個位元。移位暫存器的資料線和時鐘線分別接到微控制器的p4.5和p4.4管腳,可以使用mcs-51裡面的位操作指令進行輸出。連續輸出3個字形,24個bit之後,欲顯示的字形將穩定地顯示在數碼管上,程式可以轉而執行其他工作。 七段字形的編碼方式需要通過實驗獲得。這些編碼作為程式中的常數,使用db命令存放。在程式中,需要將數值轉換為相應的字形編碼,可以使用movc指令來完成。

3.時間

本實驗要求的按時間顯示數值,直接通過軟體延時來實現,也就是若干次空迴圈來完成,不需要使用微控制器內部的定時器等硬體資源。由於在後面的實驗中也要使用軟體的延時子程式,因此這裡預先做準備。 本微控制器使用12mhz主頻的晶振,結合mcs51的體系結構和指令時序,可以計算每條指令的執行時間,也可以通過keil環境的除錯功能來檢查程式片段的執行時間。當然,最後可以通過程式執行的總體執行結果來調整時間。希望同學能夠通過這個過程,得出一段能夠精確到1ms的子程式,重複呼叫100次,從而達到定時0.1s的效果。從而完成實驗要求2。

4.開關

在本實驗板上設定了兩個開關s1和s2,分布接入到8031的p3.6和p3.7,開關按下時,輸入0,鬆開時,輸入1。利用這個開關完成實驗要求3。

5.實驗原理

本實驗採用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

p4sw equ 0bbh ;

clk equ p4.4 ;時鐘線

dat equ p4.5 ;資料線

sw equ p3.6

mov dptr,#tab

mov p4sw,#70h

lp:mov r6,#0 ;計數

mov r5,#0

mov r4,#0

loop:

mov a,r6 ;加入累加器

mov dptr,#tab

movc a,@a+dptr ;查表指令

lcall show

mov a,r5 ;加入累加器

mov dptr,#tab

movc a,@a+dptr ;查表指令

lcall show

mov a,r4 ;加入累加器

mov dptr,#tab

movc a,@a+dptr ;查表指令

lcall show

lcall delay

pause:

nop

jnb sw,pause ;按下s1,暫停

inc r6 ;每次計數+1

cjne r6,#10,loop ;進製

inc r5

mov r6,#0

cjne r5,#10,loop ;比較兩個運算元是否相等,如果不相等則轉移

inc r4

mov r5,#0

cjne r4,#10,loop

mov r4,#0

ljmp loop; ;跳回迴圈計數

show:

mov r0,#8

slp:

clr clk ;時鐘線輸出低電平

rlc a ;累加器a,將a中欲顯示的字元碼右移一位,最低位存入c中

mov dat,c

setb clk ;時鐘線高電平

djnz r0,slp ;減一不為0轉到,繼續輸出字元碼

retdelay:

mov r2,#199 ;外迴圈 0.1s;[1 + 2 × 250] × 1us = 501us

loops:mov b, #250 ;內迴圈 [1 + (501 + 2)×199] = 1000.98ms

loopr:djnz b, loopr

djnz r2,loops

rettab:

db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h

end

七段數碼管顯示實驗

連線模組埠的中間變數使用wire型別,而不應該是reg型別 不能再always裡呼叫模組 在verilog中,所有的埠隱含地宣告wire型別 如果輸出型別的埠需要儲存數值,則必須將其顯式地宣告為reg資料型別。不能將input和inout型別的埠宣告為reg資料型別,因為reg型別的變數是用於儲存數...

BCD 七段數碼管顯示解碼器

目的 1.進一步掌握vhdl語言的基本結構及設計的輸入方法。2.掌握bcd 七段顯示解碼器的設計思路 內容 1.使用撥碼開關sw3 sw2 sw1 sw0作為四位二進位制資料 d c b a的輸入 2.在最右邊的數碼管hex0上顯示輸入的bcd碼編碼數值。原理 七段數碼管一般由8個發光二極體組成,其...

繪製七段數碼管

seven digits draw v1.0 第一,繪製線 第二,繪製七段數碼管組成的數字 第三,繪製優化數碼管間距 第四,繪製多組數字 第五,獲取系統時間 第六,主函式執行程式。如下 import turtle as t import time def drawline draw drawgap ...