📄 main.c
字号:
/*********************************
**公司名称:esa.hicc **
**模 块 名:计时秒表 **
**创 建 者:esa **
**修 改 者:esa **
**功能描述:精确到1/100S计时 **
**其他说明: **
**版 本:v1.0 **
*********************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0 =P1^0;
sbit P1_1 =P1^1;
sbit P1_2 =P1^2;
sbit P1_3 =P1^3;
typedef struct
{ uchar minute;
uchar second;
uchar second_1;
}time;
time now={0,0,0};
time now_1[10];
uchar code num_tab1[]={0x80,0x40,0x20,0x10,0x08,0x04};
uchar code num_tab2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极显示
uchar a=0;
uchar state=0;
uchar fy=0; //开始0和暂停1的复用标志
void delay(uint time1) //延时子程序
{
int i;
int k;
for(i=0;i<time1;i++)
for(k=0;k<100;k++);
}
void display(time disnum) //显示子程序
{
int min_shi,min_ge,sec_shi,sec_ge,sec_1_shi,sec_1_ge,i;
int num[6]={0,0,0,0,0,0};
min_shi=disnum.minute/10;
min_ge=disnum.minute%10;
sec_shi=disnum.second/10;
sec_ge=disnum.second%10;
sec_1_shi=disnum.second_1/10;
sec_1_ge=disnum.second_1%10;
num[0]=min_shi;
num[1]=min_ge;
num[2]=sec_shi;
num[3]=sec_ge;
num[4]=sec_1_shi;
num[5]=sec_1_ge;
if(min_shi==0)
{
for(i=0;i<5;i++)
{
P2=num_tab1[i+1]; //先送位码
P0=num_tab2[num[i+1]]; //再送段码
delay(1);
}
}
else
{
for(i=0;i<6;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
}
void interrupt_init(void)
{
EA=0;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
IT0=1;
ET0=1;
EX0=1;
EA=1;
}
void interrup0(void) interrupt 0 using 3
{ uchar i;
delay(1);
if(P1_0==0)
{
if(fy==0) //开始计时
{
TR0=1;
state=0;
fy=1;
}
else //暂停
{
TR0=0;
fy=0;
}
}
if(P1_1==0) //记时
{
if(a<10)
{
now_1[a]=now;
a++;
}
}
if(P1_2==0) //显示记时
{
if(state<=a)
state++;
}
if(P1_3==0) //系统清零
{
TR0=0;
fy=0;
a=0;
now.minute=0;
now.second=0;
now.second_1=0;
for(i=0;i<10;i++)
{
now_1[i].minute=0;
now_1[i].second=0;
now_1[i].second_1=0;
}
}
}
void interrup1(void) interrupt 1 using 3
{
TR0=0;
TH0=0xd8;
TL0=0xf0;
TR0=1;
now.second_1++;
if(now.second_1==100)
{
now.second++;
now.second_1=0;
if(now.second==60)
{
now.minute++;
now.second=0;
if(now.minute==60)
{now.minute=0;}
}
}
}
void main(void)
{ uchar j;
for(j=0;j<10;j++)
{
now_1[j].minute=0;
now_1[j].second=0;
now_1[j].second_1=0;
}
interrupt_init(); //中断初始化
// TR0=1;
while(1)
{
switch(state)
{
case 0: display(now);break;
case 1: display(now_1[state-1]);break;
case 2: display(now_1[state-1]);break;
case 3: display(now_1[state-1]);break;
case 4: display(now_1[state-1]);break;
case 5: display(now_1[state-1]);break;
case 6: display(now_1[state-1]);break;
case 7: display(now_1[state-1]);break;
case 8: display(now_1[state-1]);break;
case 9: display(now_1[state-1]);break;
case 10:display(now_1[state-1]);break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -