蓝桥杯单片机第八届省赛-电子钟

九层妖塔 起于垒土

在这里插入图片描述


改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改


2021.3.20
做到三个半小时的时候,卡在了数码管闪烁的地方。晚上又参考例程补了上去。
总之……得……二刷……

Notes1:数码管闪烁

 1、在数码管数据处理函数void SEG_Proc(void)中实现。
 2、在sprintf(puc_SEG_Buf,……)"之后实现,
 3、在sprintf打印完字符串puc_SEG_Buf后,即得到完整数据后,再用下面语句将数组puc_SEG_Buf中的某一位单独置为空,对应数码管段码就是灭。

 puc_SEG_Buf[0] = ' ';

 4、再用

if( (ul_Sec%2) == 0)if( ul_Sec >= 2)

 来实现以1s为间隔闪亮。

case 6:  //闹钟设置
{
	sprintf(puc_SEG_Buf,"%02u-%02u-%02u",(uint)puc_Alarm[0],(uint)puc_Alarm[1],(uint)puc_Alarm[2]);
	
	if( (ul_Sec%2) == 0)
	{
		switch(close_wei)
		{
			case 1:
			{
			 puc_SEG_Buf[0] = ' ';
			 puc_SEG_Buf[1] = ' ';
			}break;
			
			case 2:
			{
			 puc_SEG_Buf[3] = ' ';
			 puc_SEG_Buf[4] = ' ';
			}break;
			
			case 3:
			{
			 puc_SEG_Buf[6] = ' ';
			 puc_SEG_Buf[7] = ' ';
			}break;
		}
	}
}break;

Notes2:通过按键设置DS1302

 1、加操作

if(++puc_RTC[0] == 24) puc_RTC[0] = 0;

 数组可以对其中的单个元素进行赋值操作,先++再判断,所以临界值写为24,注意时分秒的临界值分别为24,60,60。
 1、减操作

if(!puc_RTC[0]) puc_RTC[0]=23;
else puc_RTC[0]--;

if(!puc_RTC[1]) puc_RTC[1]=59;
else puc_RTC[1]--;

 先判断数组相应位是否为0,再对其进行操作。若在减操作前就已经为0,再减就是借位了。
 0→1→2……58→59→,0→1→2→3……58→59

Notes3:LED以一定频率闪烁一定时间

指示灯L1以0.2s为间隔闪烁,持续5s。
放在定时器1的中断服务函数中,1ms执行一次。

if(uc_Alarm_num)
{
	if(!(ul_ms%200))
	{
	 if(--uc_Alarm_num) uc_LED ^=1;
	 else LED_OFF(ALL);
	 LED_Disp(uc_LED);
	}
}

Notes4:程序分层思想

Notes5:状态机在逻辑结构里的应用

第一次接触状态机是在数电和FPGA的课本里,数电将时序电路称为状态机(State Machine,SM),指的是,电路时序电路在工作时是在电路的有限个状态间按照一定的规律转换的。

在这里插入图片描述
绝对严谨的状态机,构建了完整逻辑严谨的程序框架,再去写程序就不会出现逻辑错误,减少Bug。

  
  
  
  
彩 蛋

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#法外狂徒张三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值