蓝桥杯单片机——Ds1302时间开始与暂停

蓝桥杯单片机——Ds1302时间开始与暂停,第1张

首先说明一下ds1302时间,开始与暂停的原理:

只要让“秒寄存器”的最高位为1,时钟就会暂停计时。


同理只要让“秒寄存器”的最高位为0,时钟就会开始计时


时间暂停:

这里我用的是按键去控制

    if(key_get==7)//时间暂停
	{
		uchar temp;
		Write_Ds1302_Byte(0x8e,0x00);
		temp=Read_Ds1302_Byte(0x81);
		Write_Ds1302_Byte(0x80,temp|0x80);//将最高位为1
		Write_Ds1302_Byte(0x8e,0x80);
		time_stat=1;
	}
时间开始:
	if(key_get==6)//时间开始
	{
		uchar temp;
		Write_Ds1302_Byte(0x8e,0x00);
		temp=Read_Ds1302_Byte(0x81);
		Write_Ds1302_Byte(0x80,temp&0x7f);//将最高位置位0
		Write_Ds1302_Byte(0x8e,0x80);
		time_stat=0;
	}

做完以上 *** 作可能很多小伙伴还有一个疑惑就是按下暂停键之后,你的数码管的秒位的十位数上会显示一个8,其实这个是正常的现象,因为通过读代码来看,我们写进去的就是8.所以毫无疑问显示的也是8。


那么怎么来解决这个问题呢,请继续往下看我的代码:

我在时间读取出来的数字上面动了一点手脚,emmmm,定义应该都能理解吧,时,分,秒,我在上面设置了一个标志位,就是我在按下暂停按键的时候,我的那个time_stat就被赋值为1,否则为0;下面的代码就为显示为8做了一个解决方法,就是在显示下面动手脚,但是实际上读出来的还是8,因为只有在最高位为1的时候,才能暂停,所以我们不能去改变它的内部,但是显示什么数是我们可以改变的。


而且因为这个是60秒之后就为0,所以不用担心会改变原来的数值,不可能秒能够到8的。


void Time_read()
{
	h1=Read_Ds1302_Byte(0x85);
	f1=Read_Ds1302_Byte(0x83);
	s1=Read_Ds1302_Byte(0x81);
	if(time_stat==1)//如果时间暂停则让数码管显示的值那个最高位去掉
	{
		s1=s1&0x7f;
	}
	h1=(h1/16)*10+h1%16;
	f1=(f1/16)*10+f1%16;
	s1=(s1/16)*10+s1%16;
}

经过以上修改,你的ds1302就能够实现暂停与启动啦!

如果你看完以上解析还没有解决你的问题,那么也可以私信我,关注我,后面还会有更多分享!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/567767.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-09
下一篇2022-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存