|
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;
}
|
|