您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>數(shù)碼管>

利用單片機(jī)的定時(shí)器設(shè)計(jì)一個(gè)0-99的數(shù)碼管秒表

2022年08月17日 18:14 MCU學(xué)習(xí)筆記 作者:MCU學(xué)習(xí)筆記 用戶評(píng)論(0

單片機(jī)作業(yè):利用單片機(jī)的定時(shí)器設(shè)計(jì)一個(gè)0-99的秒表,按下按鍵S1秒表開(kāi)始從零計(jì)時(shí),按下按鍵S2秒表停止,并顯示最終秒計(jì)時(shí)值。

接口信息

數(shù)碼管斷碼端接單片機(jī)的P0口,位選端接單片機(jī)的P2.4、P2.5、P2.6、P2.7。數(shù)碼管的千位和百位顯示秒計(jì)數(shù),十位個(gè)位顯示的定時(shí)器中斷計(jì)數(shù)。

2.程序代碼

定時(shí)器初始化為工作模式1,定時(shí)器定時(shí)時(shí)間為20ms,也就是定時(shí)器每溢出一次的時(shí)間為20ms,則溢出50次即為1秒鐘。通過(guò)查詢溢出標(biāo)志位的值即可。
?

void timer_inial()

{

TMOD = 0X01;//

TH0=0XB8;//定時(shí)0.02s

TL0=0X00;

}

定時(shí)器溢出處理函數(shù):每次溢出之后,要手動(dòng)清除溢出標(biāo)志位,然后重裝初始值。同時(shí)秒計(jì)數(shù)值加1,累加50次即為一秒中。
?

void second_cal_show()

{

? if(TF0==1)

{

TF0=0;

? ? ? ?TH0=0XB8;

TL0=0X00;

time_count++;

if(time_count>=50)//50次一秒

{

? time_count=0;

?time_S++;

}

}

}

主函數(shù):主要是定時(shí)器初始化,然后循環(huán)執(zhí)行按鍵啟動(dòng)、按鍵停止、定時(shí)器溢出處理和刷新數(shù)碼管顯示函數(shù)。

void main()

{

timer_inial();

while(1)

{

start();

stop();

second_cal_show();

LEDdisplay(time_S*100+time_count);

}

}

以下為作業(yè)全部代碼:

#include

#include

//定義二個(gè)位變量,分別對(duì)應(yīng)按鍵開(kāi)始按鍵和停止復(fù)位按鍵

sbit key_set=P3^2;

sbit key_reset=P3^3;

unsigned char time_count=0;

unsigned int time_S=0;

#define LED_PORT P0

sbit wela_1 = P2^4;

sbit wela_2 = P2^5;

sbit wela_3 = P2^6;

sbit wela_4 = P2^7;

sbit dp=P0^7;

//LED顯示字模 0-F 共陽(yáng)模式

unsigned code table[]= {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void timer_inial();//定時(shí)器初始化

void delay(unsigned int i);//延時(shí)函數(shù)

void start();

void stop();

void second_cal_show();

/*******************************************************************************

* 函 數(shù) 名 :Delayms

* 函數(shù)功能 :實(shí)現(xiàn) ms級(jí)的延時(shí)

* 輸? ? 入 :ms

* 輸? ? 出 :無(wú)

*******************************************************************************/

void Delay_ms(unsigned int ms)

{

unsigned int i,j;

for(i=0;i

#if FOSC == 11059200L

for(j=0;j<114;j++);

#elif FOSC == 12000000L

? for(j=0;j<123;j++);

#elif FOSC == 24000000L

for(j=0;j<249;j++);

#else

for(j=0;j<114;j++);

#endif

}

/*******************************************************************************

* 函 數(shù) 名 :LEDdisplay

* 函數(shù)功能 :循環(huán)顯示各個(gè)位上的數(shù)據(jù)

* 輸? ? 入 :num要顯示的數(shù)據(jù)

* 輸? ? 出 :無(wú)

*******************************************************************************/

void LEDdisplay(unsigned int num)

{

unsigned char qian,bai,shi,ge;

qian=num/1000;

bai=num%1000/100;

shi=num%100/10;

ge=num%10;

wela_1 = 1; ? //關(guān)閉所有數(shù)碼管

wela_2 = 1;

wela_3 = 1;

wela_4 = 1;

wela_4=0;? //顯示千位

LED_PORT=table[qian];

Delay_ms(1);

LED_PORT = 0xff;

wela_4=1;

wela_3=0;? //顯示百位

LED_PORT=table[bai];

Delay_ms(1);

LED_PORT = 0xff;

//dp=0;

wela_3=1;

wela_3=0;? //顯示百位

dp=0;

Delay_ms(1);

LED_PORT = 0xff;

wela_3=1;

wela_2=0;? //顯示十位

LED_PORT=table[shi];

Delay_ms(1);

LED_PORT = 0xff;

wela_2=1;

wela_1=0;? //顯示個(gè)位

LED_PORT=table[ge];

Delay_ms(1);

LED_PORT = 0xff;

}

void main()

{

timer_inial();

while(1)

{

start();

stop();

second_cal_show();

LEDdisplay(time_S*100+time_count);

}

}

void timer_inial()

{

TMOD = 0X01;//

TH0=0XB8;//定時(shí)0.02s

TL0=0X00;

}

//延時(shí)函數(shù)

void delay(unsigned int i)

{

unsigned int k;

? for(k=0;k

}

void start()

{

if(0==key_set)

{

delay(1200);//10ms消抖

if(0==key_set)//再次檢測(cè)按鍵是否按下

{

while(!key_set);//等待按鍵釋放

? TR0=1;

? time_S=0;

? time_count=0;

}

}

}

void stop()

{

? if(0==key_reset)

{

delay(1200);//10ms消抖

if(0==key_reset)//再次檢測(cè)按鍵是否按下

{

while(!key_reset);//等待按鍵釋放

? TR0=0;

}

}

}

void second_cal_show()

{

? if(TF0==1)

{

TF0=0;

? TH0=0XB8;

TL0=0X00;

time_count++;

if(time_count>=50)//50次一秒

{

? time_count=0;

time_S++;

}

}

}



審核編輯:劉清

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

( 發(fā)表人:劉芹 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?