【Proteus仿真】【51单片机】数字秒表设计


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用数码管显示模块、蜂鸣器、按键模块等。

主要功能:
系统运行后,数码管显示初始时间00-00-00,可通过K1键启动,
默认以正向计时,再次按下K1键则记录第1次时间,再次按下
K1键则记录第2次时间,再次按下K1键则记录第3次时间且停止
在第3次时间显示,可通过K3键查阅3次记录时间。可通过按键K2
清零数据。当系统启动时,可按下K2键暂停,再次按下K1键继续
运行。可通过K4键切换为倒计时显示。在系统还未开启时,可通过
K3键进入时间设置模式,K1和K2键用于调节秒和分。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/



//系统数据设置
void sys_data_set(void)
{
	u8 key=0;

	key=key_scan(0);
	//开始/记录
	if(key==KEY1_PRESS)
	{
		beep_alarm(100,10);//蜂鸣器报警提示
		//还未开始设置时间
		if(sys_ctrl.set==0)
		{
			if(sys_ctrl.start==0)//第1次启动
			{
				//还未开始记录时间
				if(sys_ctrl.cnt==0)
				{
					TR0=1;//开启定时器
					sys_ctrl.start=1;
					sys_ctrl.find=0;	
				}		
			}
			else//记录次数
			{
				sys_ctrl.cnt++;
				if(sys_ctrl.dir==0)//如果为正向计时
				{
					//记录每次时间
					sys_ctrl.time[sys_ctrl.cnt-1][0]=sys_ctrl.min;
					sys_ctrl.time[sys_ctrl.cnt-1][1]=sys_ctrl.sec;
					sys_ctrl.time[sys_ctrl.cnt-1][2]=sys_ctrl.msec;	
				}
				else//如果为倒计时
				{ 	
					//记录每次时间
					sys_ctrl.time[sys_ctrl.cnt-1][0]=sys_ctrl.init_time[0]-sys_ctrl.min;
					if(sys_ctrl.init_time[1]<sys_ctrl.sec)
					{
						sys_ctrl.time[sys_ctrl.cnt-1][0]-=1;
						sys_ctrl.time[sys_ctrl.cnt-1][1]=60-sys_ctrl.sec+sys_ctrl.init_time[1];
					}
					else sys_ctrl.time[sys_ctrl.cnt-1][1]=sys_ctrl.init_time[1]-sys_ctrl.sec;			
					//如果初始m秒小于记录m秒,借用S来减
					if(sys_ctrl.init_time[2]<sys_ctrl.msec)
					{
						sys_ctrl.time[sys_ctrl.cnt-1][1]-=1;
						sys_ctrl.time[sys_ctrl.cnt-1][2]=100-sys_ctrl.msec+sys_ctrl.init_time[2];	
					}
					else sys_ctrl.time[sys_ctrl.cnt-1][2]=sys_ctrl.init_time[2]-sys_ctrl.msec;
				}
				if(sys_ctrl.cnt>=3)//记录第3次
				{
					TR0=0;//关闭定时器
					sys_ctrl.find=1;
					sys_ctrl.start=0;
				}
			}	
		}
		//时间设置--加
		else
		{
			//秒加
			if(sys_ctrl.set==1)
			{
				sys_ctrl.sec++;
				if(sys_ctrl.sec>59)sys_ctrl.sec=0;		
			}
			//分加
			else
			{
				sys_ctrl.min++;
				if(sys_ctrl.min>59)sys_ctrl.min=0;	
			}
		}	
	}
	//暂停/清零
	else if(key==KEY2_PRESS)
	{
		beep_alarm(100,10);//蜂鸣器报警提示
		//还未开始设置时间
		if(sys_ctrl.set==0)
		{
			//如果系统已开启,暂停
			if(sys_ctrl.start==1)
			{
				TR0=0;//关闭定时器
				sys_ctrl.start=0;
			}
			//系统暂停中,清零
			else
			{
				//如果查阅
				sys_parm_init();//清零	
			}	
		}
		//时间设置--减
		else
		{
			//秒减
			if(sys_ctrl.set==1)
			{
				sys_ctrl.sec--;
				if(sys_ctrl.sec<0)sys_ctrl.sec=59;		
			}
			//分减
			else
			{
				sys_ctrl.min--;
				if(sys_ctrl.min<0)sys_ctrl.min=59;	
			}	
		}
	}
	//查阅/设置
	else if(key==KEY3_PRESS)
	{
		beep_alarm(100,10);//蜂鸣器报警提示
		//查阅
		if(sys_ctrl.find==1)
		{
			beep_alarm(100,10);//蜂鸣器报警提示
			sys_ctrl.cnt--;	
			if(sys_ctrl.cnt<1)sys_ctrl.cnt=3;	
		}
		//设置
		else
		{
			sys_ctrl.set++;	
			if(sys_ctrl.set>=3)sys_ctrl.set=0;
		}	
	} 	
	//计时方向切换
	else if(key==KEY4_PRESS)
	{
		beep_alarm(100,10);//蜂鸣器报警提示
		if(sys_ctrl.start==0)//还未开始
		{
			sys_ctrl.dir=!sys_ctrl.dir;
			if(sys_ctrl.dir==1)//如果倒计时,初始时间设置
			{
				sys_ctrl.msec=0;sys_ctrl.sec=50;sys_ctrl.min=0;
				sys_ctrl.init_time[0]=sys_ctrl.min;
				sys_ctrl.init_time[1]=sys_ctrl.sec;
				sys_ctrl.init_time[2]=sys_ctrl.msec;			
			}
			else//正计时
			{
				sys_ctrl.msec=0;sys_ctrl.sec=0;sys_ctrl.min=0;	
			}	
		}	
	} 
}


//应用控制系统
void app_ctrl_sys(void)
{
	sys_parm_init();//系统参数初始化
	time0_init();//定时器0初始化	

	while(1)
	{
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置	
	}		
}






三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值