|
51單片機秒表程序算作一個中等難度的程序,主要是定時器的了解和定時中斷。我使用的硬件配置是8.000MHz晶振,共陽極數碼管和STC89s52RC國產宏鑫單片機。測試的定時器0的兩種算法:模式0,模式1。
另外有一點體會如果可能還是盡量采用模式1等計數較多的模式,這樣對MCU的中斷較少節省資源和電力對于電池供電的是非常重要的。

#include<AT89X51.H>
#include<stdio.h>
sfr p0=0x80;
sfr p2=0xA0;
unsigned char code a[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
//我的數碼管對應的P0。0~7為a,b,c,d,e,f,g,Dp
unsigned char minute,second,msecond;
void ds(void) //延時使得數碼管保持亮度,注意不要時長大于定時時長
{
unsigned char i;
for(i=10;i>0;i--);
}
void main(void)
{
TMOD=0x00; //定時器0,工作方式0 或者 TMOD=0x01 TH0=0xe5 TH0=0xf5
TH0=0x2f;//
TL0=0xf5;//
ET0=1; //開定時中斷允許
EA=1; //開總中斷
TR0=1; //定時器開始定時
msecond=0;
second=0;
minute=0;
while(1)
{ //這就是為什么要用到stdio.h函數
P0=a[minute/10]; //分離出分鐘十位
P3=0xfe;
ds();
P3=0xff;
ds();
P0=a[minute%10];//分離出分鐘個位
P3=0xfd;
ds();
P3=0xff;
ds();
P0=a[second/10]; //分離出秒十位
P3=0xfb;
ds();
P3=0xff;
ds();
P0=a[second%10];
P3=0xf7;
ds();
P3=0xff;
ds();
P0=a[msecond/10];
P3=0xef;
ds();
P3=0xff;
ds();
P0=a[msecond%10];
P3=0xdf;
ds();
P3=0xff;
ds();
}
}
void t0(void) interrupt 1 using 0 //定時器0,第0組寄存器 中斷
{
msecond++;
if(msecond==100)
{
msecond=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
minute=0;
}
}
TH0=0x2f;//必須重新賦值才可以讓定時器循環工作 同樣可改寫TH0=0xe5 TH0=0xf5
TL0=0xf5;
}
|
|