2021-03-25 —— 08 基于单片机的电子钟程序设计与调试
-
初始化时钟更改,在ds1302程序初始化shijian{};每次上电都初始化:在主函数循环前DS_init();上电后显示时钟,并要在循环内写获取时钟函数DS_get(使时间计时),在主函数调用shijian——extern
-
按键7:设置变量uchar Time_set=0;在键盘函数中切换S7功能的状态,在主函数中写按下后的功能,在各个Time_set的数值中显示数码管的状态,闪烁一秒开一秒关(判断秒的余数)
-
S6按键:闹钟设置功能,闹钟提醒时间0时0分0秒,定义闹钟初始时间uchar Alarm_clock[3]={0,0,0};定义闹钟的设置:uchar Alarm_set=0;按照上述S7同理在主函数修改S6的功能实现函数,依旧对时间进行判断,因为不停的获取时间:
避免S6、S7(要直接切换)冲突显示:
主函数的if判断也改成5123 -
S5S4加减操作:只在时间设置或闹钟设置:每次该位设置(++)结束后,每次按下都进行初始化;闹钟不进行设置初始化,因为设置的变量
-
温度显示:uchar S4=0; bit wendu=0;在主函数中,判断wendu,若= = 0,则正常显示,但按键被按下,== 1,显示数码管的温度显示格式,获取温度的值:
s4被按下,且处于显示状态Time_set==5,则wendu=1;P33=1时,手抬起,将S4,wendu清零,
最后一个数码管比较亮:显示完之后,将所有数码管关闭 -
闹钟提示功能:定时器实现: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,则执行原操作 -
设定函数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;
}
}