天天看點

如何用51單片機數位管實作跑馬燈功能?

基于51單片機學習闆。用S1鍵作為控制跑馬燈的方向按鍵,S5鍵作為控制跑馬燈方向的加速度按鍵,S9鍵作為控制跑馬燈方向的減速度按鍵,S13鍵作為控制跑馬燈方向的啟動或者暫停按鍵。

51單片機數位管顯示跑馬燈程式源代碼講解

基于51單片機學習闆。用S1鍵作為控制跑馬燈的方向按鍵,S5鍵作為控制跑馬燈方向的加速度按鍵,S9鍵作為控制跑馬燈方向的減速度按鍵,S13鍵作為控制跑馬燈方向的啟動或者暫停按鍵。記得把輸出線P0.4一直輸出低電平,模拟獨立按鍵的觸發地GND。

(2)實作功能:

跑馬燈運作:第1個至第8個LED燈一直不亮。在第9個至第16個LED燈,依次逐個亮燈并且每次隻能亮一個燈。每按一次獨立按鍵S13鍵,原來運作的跑馬燈會暫停,原來暫停的跑馬燈會運作。用S1來改變方向。用S5和S9來改變速度,每按一次按鍵的遞增或者遞減以10為機關。

數位管顯示:本程式隻有1個視窗,這個視窗分成3個局部顯示。8,7,6位數位管顯示運作狀态,啟動時顯示“on”,停止時顯示“oFF”。5位數位管顯示數位管方向,正向顯示“n”,反向顯示“U”。4,3,2,1位數位管顯示速度。數值越大速度越慢,最慢的速度是550,最快的速度是50。

如何用51單片機數位管實作跑馬燈功能?

(3)源代碼講解如下:

#include "REG52.H"

#define const_voice_short 40 //蜂鳴器短叫的持續時間

#define const_key_time1 20 //按鍵去抖動延時的時間

#define const_key_time2 20 //按鍵去抖動延時的時間

#define const_key_time3 20 //按鍵去抖動延時的時間

#define const_key_time4 20 //按鍵去抖動延時的時間

void initial_myself();

void initial_peripheral();

void delay_short(unsigned int uiDelayShort);

void delay_long(unsigned int uiDelaylong);

//驅動數位管的74HC595

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);

void display_drive(); //顯示數位管字模的驅動函數

void display_service(); //顯示的視窗菜單服務程式

//驅動LED的74HC595

void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);

void led_flicker_09_16(); //第9個至第16個LED的跑馬燈程式,逐個亮并且每次隻能亮一個.

void led_update(); //LED更新函數

void T0_time(); //定時中斷函數

void key_service(); //按鍵服務的應用程式

void key_scan();//按鍵掃描函數 放在定時中斷裡

sbit beep_dr=P2^7; //蜂鳴器的驅動IO口

sbit key_sr1=P0^0; //對應學習闆的S1鍵

sbit key_sr2=P0^1; //對應學習闆的S5鍵

sbit key_sr3=P0^2; //對應學習闆的S9鍵

sbit key_sr4=P0^3; //對應學習闆的S13鍵

sbit key_gnd_dr=P0^4; //模拟獨立按鍵的地GND,是以必須一直輸出低電平

sbit led_dr=P3^5;

sbit dig_hc595_sh_dr=P2^0; //數位管的74HC595程式

sbit dig_hc595_st_dr=P2^1;

sbit dig_hc595_ds_dr=P2^2;

sbit hc595_sh_dr=P2^3; //LED燈的74HC595程式

sbit hc595_st_dr=P2^4;

sbit hc595_ds_dr=P2^5;

unsigned char ucKeySec=0; //被觸發的按鍵編号

unsigned int uiKeyTimeCnt1=0; //按鍵去抖動延時計數器

unsigned char ucKeyLock1=0; //按鍵觸發後自鎖的變量标志

unsigned int uiKeyTimeCnt2=0; //按鍵去抖動延時計數器

unsigned char ucKeyLock2=0; //按鍵觸發後自鎖的變量标志

unsigned int uiKeyTimeCnt3=0; //按鍵去抖動延時計數器

unsigned char ucKeyLock3=0; //按鍵觸發後自鎖的變量标志

unsigned int uiKeyTimeCnt4=0; //按鍵去抖動延時計數器

unsigned char ucKeyLock4=0; //按鍵觸發後自鎖的變量标志

unsigned int uiVoiceCnt=0; //蜂鳴器鳴叫的持續時間計數器

unsigned char ucLed_dr1=0; //代表16個燈的亮滅狀态,0代表滅,1代表亮

unsigned char ucLed_dr2=0;

unsigned char ucLed_dr3=0;

unsigned char ucLed_dr4=0;

unsigned char ucLed_dr5=0;

unsigned char ucLed_dr6=0;

unsigned char ucLed_dr7=0;

unsigned char ucLed_dr8=0;

unsigned char ucLed_dr9=0;

unsigned char ucLed_dr10=0;

unsigned char ucLed_dr11=0;

unsigned char ucLed_dr12=0;

unsigned char ucLed_dr13=0;

unsigned char ucLed_dr14=0;

unsigned char ucLed_dr15=0;

unsigned char ucLed_dr16=0;

unsigned char ucLed_update=0; //重新整理變量。每次更改LED燈的狀态都要更新一次。

unsigned char ucLedStep_09_16=0; //第9個至第16個LED跑馬燈的步驟變量

unsigned int uiTimeCnt_09_16=0; //第9個至第16個LED跑馬燈的統計定時中斷次數的延時計數器

unsigned char ucLedStatus16_09=0; //代表底層74HC595輸出狀态的中間變量

unsigned char ucLedStatus08_01=0; //代表底層74HC595輸出狀态的中間變量

unsigned char ucLedDirFlag=0; //方向變量,把按鍵與跑馬燈關聯起來的核心變量,0代表正方向,1代表反方向

unsigned int uiSetTimeLevel_09_16=300; //速度變量,此數值越大速度越慢,此數值越小速度越快。

unsigned char ucLedStartFlag=1; //啟動和暫停的變量,0代表暫停,1代表啟動

unsigned char ucDigShow8; //第8位數位管要顯示的内容

unsigned char ucDigShow7; //第7位數位管要顯示的内容

unsigned char ucDigShow6; //第6位數位管要顯示的内容

unsigned char ucDigShow5; //第5位數位管要顯示的内容

unsigned char ucDigShow4; //第4位數位管要顯示的内容

unsigned char ucDigShow3; //第3位數位管要顯示的内容

unsigned char ucDigShow2; //第2位數位管要顯示的内容

unsigned char ucDigShow1; //第1位數位管要顯示的内容

unsigned char ucDigDot8; //數位管8的小數點是否顯示的标志

unsigned char ucDigDot7; //數位管7的小數點是否顯示的标志

unsigned char ucDigDot6; //數位管6的小數點是否顯示的标志

unsigned char ucDigDot5; //數位管5的小數點是否顯示的标志

unsigned char ucDigDot4; //數位管4的小數點是否顯示的标志

unsigned char ucDigDot3; //數位管3的小數點是否顯示的标志

unsigned char ucDigDot2; //數位管2的小數點是否顯示的标志

unsigned char ucDigDot1; //數位管1的小數點是否顯示的标志

unsigned char ucDigShowTemp=0; //臨時中間變量

unsigned char ucDisplayDriveStep=1; //動态掃描數位管的步驟變量

unsigned char ucWd1Part1Update=1; //視窗1的局部1更新顯示變量

unsigned char ucWd1Part2Update=1; //視窗1的局部2更新顯示變量

unsigned char ucWd1Part3Update=1; //視窗1的局部3更新顯示變量

//根據原理圖得出的共陰數位管字模表

code unsigned char dig_table[]=

{

0x3f, //0 序号0

0x06, //1 序号1

0x5b, //2 序号2

0x4f, //3 序号3

0x66, //4 序号4

0x6d, //5 序号5

0x7d, //6 序号6

0x07, //7 序号7

0x7f, //8 序号8

0x6

上唯樣商城找電子元件 

繼續閱讀