一、功能简介
本项目使用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设计,视频分享,技术交流。