精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>電子元器件>數碼管>

利用單片機的定時器設計一個0-99的數碼管秒表

2022年08月17日 18:14 MCU學習筆記 作者:MCU學習筆記 用戶評論(0

單片機作業:利用單片機的定時器設計一個0-99的秒表,按下按鍵S1秒表開始從零計時,按下按鍵S2秒表停止,并顯示最終秒計時值。

接口信息

數碼管斷碼端接單片機的P0口,位選端接單片機的P2.4、P2.5、P2.6、P2.7。數碼管的千位和百位顯示秒計數,十位個位顯示的定時器中斷計數。

2.程序代碼

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

void timer_inial()

{

TMOD = 0X01;//

TH0=0XB8;//定時0.02s

TL0=0X00;

}

定時器溢出處理函數:每次溢出之后,要手動清除溢出標志位,然后重裝初始值。同時秒計數值加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++;

}

}

}

主函數:主要是定時器初始化,然后循環執行按鍵啟動、按鍵停止、定時器溢出處理和刷新數碼管顯示函數。

void main()

{

timer_inial();

while(1)

{

start();

stop();

second_cal_show();

LEDdisplay(time_S*100+time_count);

}

}

以下為作業全部代碼:

#include

#include

//定義二個位變量,分別對應按鍵開始按鍵和停止復位按鍵

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 共陽模式

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

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

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

void start();

void stop();

void second_cal_show();

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

* 函 數 名 :Delayms

* 函數功能 :實現 ms級的延時

* 輸? ? 入 :ms

* 輸? ? 出 :無

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

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

}

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

* 函 數 名 :LEDdisplay

* 函數功能 :循環顯示各個位上的數據

* 輸? ? 入 :num要顯示的數據

* 輸? ? 出 :無

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

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; ? //關閉所有數碼管

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;? //顯示個位

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;//定時0.02s

TL0=0X00;

}

//延時函數

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)//再次檢測按鍵是否按下

{

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

? TR0=1;

? time_S=0;

? time_count=0;

}

}

}

void stop()

{

? if(0==key_reset)

{

delay(1200);//10ms消抖

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

{

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%

不好我反對

(0) 0%

( 發表人:劉芹 )

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?