單片機(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++;
}
}
}
審核編輯:劉清