单片机AT89C51数码管数字时钟和秒表(二)

1.设计概述:

  本篇论文讨论了简单的数字秒表的设计与制作 ,采用LED液晶模块进行显示。其中单片机通过定时器中断的方式产生了10ms的最小计时单位,通过加一后判断的方式依次进行处理,将每个单位进行十进制处理后进行显示。
  采用6位LED数码管和单片机定时/计数器设计一个时钟+秒表显示电路。

2.设计思想

  本次设计的核心是单片机控制模块,所以此设计是单片机应用系统的一种应用。系统采用AT89C51单片机作为核心控制单元,开始运行23:56:55时间开始,模式按键切换,数码管开始从0.0计时,直到按下暂停按钮,数码管时间显示,如继续计时,继续按下开始按钮,如果此次计时结束重新计时,按下清零按钮从0.00开始。

3.硬件框架图

在这里插入图片描述

4.组成

按模块划分可分为单片机最小系统电路、按键电路、数码管显示三个子模块。

5.电路总体仿真图

开始仿真总图

在这里插入图片描述

模式切换到秒表模式,并开始计时中

在这里插入图片描述

秒表计时暂停中
在这里插入图片描述

秒表清零后
在这里插入图片描述

时钟模式下时间时分秒调整,如下图分钟数字调整 闪烁
在这里插入图片描述

6.部分代码

uchar Hours=23,Minutes=56,seconds=55;		//分别定义三个变量表示时、分、秒
uchar Time0_bit=0;			//用于定时器0的溢出标志
bit Set_Time=0;				//设置时 闪烁时长的标志位
bit Set0=0;					//设置时间标志,确定是设置‘分’还设置‘时’
uchar K1_bit=0;		  		//用于模式切换的标志
uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4;		//用于秒表的变量

void main()
{
	Init();										//中断初始化
	while(1)									//死循环
		{
			Mode_K1();							//模式扫描
			switch(K1_bit)		 				//模式选择
				{
					case 0:
						{
							Display0();			//显示时间								
							break;
						}
					case 1:
						{
							Display1();	 		//显示秒表
							KEY_MiaoBiao();		//扫描秒表操作
							break;
						}
					case 2:
							{
								Display2();		//设置时间时的显示程序,可闪烁定位
								KEY_Time_Set();	//扫描按键
								break;
							}
				}
		}
}

void KEY_Time_Set()	   							//设置时间时的按键扫描函数
{
	if(K1_bit==2)	  							//判断是否为时间设置模式
		{
			if(K2==0)		 					//K2有按下(下同)
				{
					Delay(10);	   				//延时消抖(下同)
					if(K2==0)				 	//再次检测是否为误按
						{
							if(Set0==0)			//检测是设置‘时’还是分,Set0为0时设置‘分’,Set0为1时设置‘时’
								{
									Minutes++; 	//‘分’加1
									if(Minutes==60)	//当'分'加到60时,重新赋值0
										Minutes=0;
								}
							else
								{
									Hours++;  	//‘时’加1
									if(Hours==24)	//当'时'加到24时,重新赋值0
										Hours=0;
								}
							while(!K2);			//按键松开检测,消除松开按键时的抖动干扰
						}
				}
			if(K3==0)
				{
					Delay(10);
					if(K3==0)
						{
							Set0=~Set0;			//K3每按一次Set0取反,以确定是设置‘时’还是设置‘分’,Set0为0时设置‘分’,Set0为1时设置‘时’
							while(!K3);
						}	
				}
		}
}

void KEY_MiaoBiao()								//检测秒表按键操作
{
	if(K1_bit==1)								//判断是否为秒表模式
		{
			if(K2==0)
				{
					Delay(10);
					if(K2==0)
						{
							TR1=~TR1;			//K2每按一次TR1取反,暂停或开始定时器1,达到暂停或开始秒表的目的
							while(!K2);
						}
				}
			if(K3==0)
				{
					Delay(10);
					if(K3==0)	 				//当K3按下时秒表所有数据清零,并停止定时器1
						{
							TR1=0;	 			//停止定时器1
							Miao_Biao0=0; 		//清零数据
							Miao_Biao1=0;
							Miao_Biao2=0;
							Miao_Biao3=0;
							Miao_Biao4=0;
							while(!K3);
						}
				}
		}
}

void Mode_K1()									//模式选择键,本程序三种模式,分别是时间显示、秒表、时间设置
{
	if(K1==0)
		{
			Delay(10);
			if(K1==0)
				{
					K1_bit++;
					if(K1_bit==3)
						{
							K1_bit=0;
						}
					while(!K1);

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值