求单片机秒表程序(用DP-51PROC调试)记录多个运动员的成绩。本设计用于记录多次时间。

2025-04-06 22:03:05
推荐回答(2个)
回答1:

DP-51PROC MCU貌似用的是51单片机吧???

这个是以前写的程序了,貌似可以满足你的要求。 引脚你看你的怎么改吧。。。。。
源代码: (MCU:AT89S52 编译环境:Keil uVision4)
#include

#define W P2 //数码管位选
#define D P1 //数码管段选
#define uchar unsigned char

#define TH (65363-10000)/256 //定时器中断初始值
#define TL (65363-10000)%256

uchar display[] = { 0xfc , 0x60 ,0xda , 0xf2 ,0x66 ,0xb6 , 0xbe , 0xe0 , 0xfe , 0xf6 }; //数码管0~9数字的代码

int s[3],count=0,k=0;

void xian(); //数码管显示
void delay(int); //延迟

void main()
{
IE=0x83; //中断设定
TCON=0x01;
TMOD=0x01;
//中断开了两个,一个是定时器的,还有一个是外部中断,用于暂停,方式是负边缘扫描

TH0=TH; //定时器载入初始值
TL0=TL;
TR0=1; //定时器中断开
while(1)
xian();
}

void xian()
{
W=0xfe; //显示第一位
D=display[s[0]];
delay(1);
D=0x00;

W=0xfd; //显示第二位
D=(display[s[1]])|0x01; //后面的0x01是那个小数点
delay(1);
D=0x00;

W=0xfb; //显示第三位
D=display[s[2]];
delay(1);
D=0x00;
}

void delay(int x) //延迟函数
{
int i,j;

for(i=0;i for(j=0;j<120;j++);
}

void my_T0(void) interrupt 1 //定时器中断函数
{
TH0=TH; //载入初值
TL0=TL;

if(!k)
if(++count==10) //每10次记一次数
{
count=0;
s[0]+=1;
if(s[0]==10)
{
s[1]++;
s[0]=0;
}
if(s[1]==10)
{
s[2]++;
s[1]=0;
}
if(s[2]==10)
{
s[0]=0;
s[1]=0;
s[2]=0;
}
}
}

void my_TH0(void) interrupt 0 //外部中断0
{
k=1-k;
}

这个就是秒表了。。。。。
另外说明一下:其中暂停是用的外部中断0,清零其实可以直接用复位键。
另外这个秒表实际上并不太精确,根据每人晶振的不同,定时器的初值还要进行改动。。。。

我不清楚DP-51PROC 里面的引脚是怎么分布的,你就研究一下改改这个程序吧。

回答2:

建议单片机不能用了
不好解决,两个单片机可以解决,一个计时,一个负责记录按狃时间和显示,否则不准。