51单片机实现10秒秒表功能

10秒秒表
首次按键计时开始,再次按键暂停,第三次按键清零。
电路如图:
51单片机实现10秒秒表功能_第1张图片
程序如下:

#include
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^7;
uchar i,Second_Counts,Key_Flag_Idx;
bit Key_State;
uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
void DelayMS(uint ms)
{
	uchar t;
	while(ms--) for(t=0;t<120;t++);
}
//处理按键事件
void Key_Event_Handle()
{
	if(Key_State==0)
	{
		Key_Flag_Idx=(Key_Flag_Idx+1)%3;
		switch(Key_Flag_Idx)
		{
			case 1:	EA=1;ET0=1;TR0=1;break;
			case 2:	EA=0;ET0=0;TR0=0;break;
			case 0:	P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
		}
	}
}
//主程序
void main()
{
	P0=0x3f;			 	//显示00
	P2=0x3f;
	i=0;
	Second_Counts=0;	 
	Key_Flag_Idx=0;		 	//按键次数(取值0,1,2,3)
	Key_State=1;		 	//按键状态
	TMOD=0x01;				//定时器0方式1
	TH0=(65536-50000)/256;		//定时器0:15ms
	TL0=(65536-50000)%256;
	while(1)
	{
		if(Key_State!=K1)
		{
			DelayMS(10);
			Key_State=K1;
			Key_Event_Handle();
		}
	}
}
//T0中断函数
void DSY_Refresh() interrupt 1
{
	TH0=(65536-50000)/256;		//恢复定时器0初值
	TL0=(65536-50000)%256;
	if(++i==2)				//50ms*2=0.1s转换状态
	{
		i=0;
		Second_Counts++;
		P0=DSY_CODE[Second_Counts/10];
		P2=DSY_CODE[Second_Counts%10];
		if(Second_Counts==100) Second_Counts=0;	//满100(10s)后显示00
	}
}

你可能感兴趣的:(51单片机,51单片机,单片机,嵌入式硬件)