單片機作業:利用單片機的定時器設計一個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++;
}
}
}
審核編輯:劉清