2021-03-25

2021-03-25 —— 08 基于单片机的电子钟程序设计与调试

  1. 初始化时钟更改,在ds1302程序初始化shijian{};每次上电都初始化:在主函数循环前DS_init();上电后显示时钟,并要在循环内写获取时钟函数DS_get(使时间计时),在主函数调用shijian——extern
    在这里插入图片描述

  2. 按键7:设置变量uchar Time_set=0;在键盘函数中切换S7功能的状态,在主函数中写按下后的功能,在各个Time_set的数值中显示数码管的状态,闪烁一秒开一秒关(判断秒的余数)
    在这里插入图片描述

  3. S6按键:闹钟设置功能,闹钟提醒时间0时0分0秒,定义闹钟初始时间uchar Alarm_clock[3]={0,0,0};定义闹钟的设置:uchar Alarm_set=0;按照上述S7同理在主函数修改S6的功能实现函数,依旧对时间进行判断,因为不停的获取时间:在这里插入图片描述
    避免S6、S7(要直接切换)冲突显示:在这里插入图片描述
    主函数的if判断也改成5123

  4. S5S4加减操作:只在时间设置或闹钟设置:每次该位设置(++)结束后,每次按下都进行初始化;闹钟不进行设置初始化,因为设置的变量在这里插入图片描述

  5. 温度显示:uchar S4=0; bit wendu=0;在主函数中,判断wendu,若= = 0,则正常显示,但按键被按下,== 1,显示数码管的温度显示格式,获取温度的值:在这里插入图片描述
    s4被按下,且处于显示状态Time_set==5,则wendu=1;P33=1时,手抬起,将S4,wendu清零,在这里插入图片描述
    最后一个数码管比较亮:显示完之后,将所有数码管关闭在这里插入图片描述

  6. 闹钟提示功能:定时器实现:5ms,5×40,声明,初始化!中断函数,uchar tt=0,bit 闪烁标志位fla=0, 持续5秒;到时关闭:int miao=0,5*1000=5000(5s)miao,led都清零;在这里插入图片描述
    开中断:在这里插入图片描述
    主函数中闹钟到的时候闪烁:判断时间是否到头(时间与闹钟时间每位都判断是否相等):建立变量uchar LED_shan=0; 问题:如果定时器一直工作,那么tt一直++,故:在这里插入图片描述
    按任意按键关闭闪烁功能:在每个按键函数下判断是否LED_shan== 1,则将灯关闭,且置零,若==0,则执行原操作

  7. 设定函数S5,S4的边界问题:判断shijian/Alarm_clock的值是否等于边界,如果到达边界,则置零




代码部分:

//新增声明定义部
extern unsigned char shijian[];
uchar Alarm_clock[3]={0,0,0};
uchar Time_set=5,Alarm_set=0;
uchar s4=0;
bit wendu=0;
uchar LED_shan=0;
uchar tt=0;
bit fla=0;
uint miao=0;
//主函数部分
void main(void)
{
	allinit();
	Timer0Init();
	DS_init();
	yi=0;er=8;san=10;si=3;wu=0;liu=10;qi=0;ba=0;
	while(1)
	{
		DS_get();
		if(wendu==0)
		{
			if(Time_set==5)
			{
				yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;
			}
			else if(Time_set==1)
			{
				if(shijian[0]%2==1){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;}
				else {yi=11;er=11;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;}
			}
			else if(Time_set==2)
			{
				if(shijian[0]%2==1){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;}
				else {yi=shijian[2]/10;er=shijian[2]%10;san=10;si=11;wu=11;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;}
			}
			else if(Time_set==3)
			{
				if(shijian[0]%2==1){yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=shijian[0]/10;ba=shijian[0]%10;}
				else {yi=shijian[2]/10;er=shijian[2]%10;san=10;si=shijian[1]/10;wu=shijian[1]%10;liu=10;qi=11;ba=11;}
			}	
			
			if(Alarm_set==5)
			{
				yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;
			}
			else if(Alarm_set==1)
			{
				if(shijian[0]%2==1){yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;}
				else {yi=11;er=11;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;}
			}
			else if(Alarm_set==2)
			{
				if(shijian[0]%2==1){yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;}
				else {yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=11;wu=11;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;}
			}
			else if(Alarm_set==3)
			{
				if(shijian[0]%2==1){yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=Alarm_clock[0]/10;ba=Alarm_clock[0]%10;}
				else {yi=Alarm_clock[2]/10;er=Alarm_clock[2]%10;san=10;si=Alarm_clock[1]/10;wu=Alarm_clock[1]%10;liu=10;qi=11;ba=11;}
			}
		}
		else if(wendu==1)
		{
			yi=11;er=11;san=11;si=11;wu=11;liu=Tempget()/10;qi=Tempget()%10;ba=12;
		}

		
		if((shijian[0]==Alarm_clock[0])&&(shijian[1]==Alarm_clock[1])&&(shijian[2]==Alarm_clock[2]))
		{
			LED_shan=1;tt=0;miao=0;
		}
		
		keyscan();
		
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}
}
//键盘函数
void keyscan(void)
{
	if(P30==0)
	{
		delayms(5);
		if(P30==0)
		{
			if(LED_shan==0)
			{
				if(Time_set==0){Time_set=5;Alarm_set=0;}
				else if(Time_set==5)Time_set=1;
				else if(Time_set==1)Time_set=2;
				else if(Time_set==2)Time_set=3;
				else if(Time_set==3)Time_set=5;
			}
			else if(LED_shan==1)
			{
				LED_shan=0;P2=0X80;P0=0XFF;
			}
		}
		while(!P30);
	}
	else if(P31==0)
	{
		delayms(5);
		if(P31==0)
		{
			if(LED_shan==0)
			{
				if(Alarm_set==0){Alarm_set=5;Time_set=0;}
				else if(Alarm_set==5)Alarm_set=1;
				else if(Alarm_set==1)Alarm_set=2;
				else if(Alarm_set==2)Alarm_set=3;
				else if(Alarm_set==3)Alarm_set=5;
			}
			else if(LED_shan==1)
			{
				LED_shan=0;P2=0X80;P0=0XFF;
			}
		}
		while(!P31);
	}
	else if(P32==0)
	{
		delayms(5);
		if(P32==0)
		{	
			if(LED_shan==0)
			{
				if(Time_set==1)
				{
					if(shijian[2]==23)shijian[2]=0;
				  else shijian[2]++;
					DS_init();
				}
				else if(Time_set==2)
				{
				  if(shijian[1]==59)shijian[1]=0;
					else shijian[1]++;DS_init();
				}
				else if(Time_set==3)
				{ 
					if(shijian[0]==59)shijian[0]=0;
					else shijian[0]++;DS_init();
				}
				else if(Alarm_set==1)
				{
					if(Alarm_clock[2]==23)Alarm_clock[2]=0;
					else Alarm_clock[2]++;
				}
				else if(Alarm_set==2)
				{
					if(Alarm_clock[1]==59)Alarm_clock[1]=0;
					else Alarm_clock[1]++;
				}
				else if(Alarm_set==3)
				{
					if(Alarm_clock[0]==59)Alarm_clock[0]=0;
					else Alarm_clock[0]++;
				}
			}
			else if(LED_shan==1)
			{
				LED_shan=0;P2=0X80;P0=0XFF;
			}
		}
		while(!P32);
	}
	else if(P33==0)
	{
		delayms(5);
		if(P33==0)
		{
			s4=1;
			if(Time_set==5)wendu=1;
		}
	}
	
	if((s4==1)&&(P33==1))
	{	
		s4=0;
		if(LED_shan==0)
		{
			wendu=0;
			if(Time_set==1)
			{
				if(shijian[2]==0)shijian[2]=23;
				else shijian[2]--;
				DS_init();
			}
			else if(Time_set==2)
			{
				if(shijian[1]==0)shijian[1]=59;
				else shijian[1]--;
				DS_init();
			}
			else if(Time_set==3)
			{
				if(shijian[0]==0)shijian[0]=59;
				else shijian[0]--;
				DS_init();
			}
			else if(Alarm_set==1)
			{
				if(Alarm_clock[2]==0)Alarm_clock[2]=23;
				else Alarm_clock[2]--;
			}
			else if(Alarm_set==2)
			{
				if(Alarm_clock[1]==0)Alarm_clock[1]=59;
				else Alarm_clock[1]--;
			}
			else if(Alarm_set==3)
			{
				if(Alarm_clock[0]==0)Alarm_clock[0]=59;
				else Alarm_clock[0]--;
			}
		}
		else if(LED_shan==1)
		{
			LED_shan=0;P2=0X80;P0=0XFF;
		}
	}
}
//定时器中断函数
void Timer0Init(void)		//5毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x28;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	ET0=1;
	EA=1;
}


void time0() interrupt 1
{
	tt++;miao++;
	if((tt==40)&&(LED_shan==1))
	{
		tt=0;
		if(fla==0){fla=1;P2=0X80;P0=0XFE;}
		else if(fla==1){fla=0;P2=0X80;P0=0XFF;}
	}
	
	if(miao==1000)
	{
		miao=0;LED_shan=0;P2=0X80;P0=0XFF;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值