📄 fhy.c
字号:
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/*0~9的数码管段码*/
char DATA_P3[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/
uint deda=0; /*2.5mS计数单元清零*/
uchar t_hour=0,t_min=0,t_sec=0; /*闹时时、分、秒单元清零*/
uchar d_hour=0,d_min=0,d_sec=0; /*倒计时时、分、秒单元清零*/
bit o_f=0; /*闹时启/停标志*/
uchar set=0;
uint t=0; /*模式设定标志*/
uchar m=0,a=0;
uint time_counter1 = 0;
uint time_counter2 = 0;
uint time_counter3 = 0;
void delay(uint k); //延时子函数
void conv(); /*走时单元转换*/
void d_conv();
void p_out(); /*判别闹时到否子函数*/
void dirve(); /*走时时间输出驱动子函数*/
void t_dirve(); /*闹时时间输出驱动子函数*/
void d_dirve(); /*倒计时时间输出驱动子函数*/
uint almflag1=0; /*闹铃1提示标志*/
uint almflag2=0; /*闹铃2提示标志*/
uchar dflag=0;
unsigned char dis_buff1[6]; /* 走时显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char dis_buff2[4]; /* 闹钟显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char dis_buff3[6]; /* 倒计时显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char posit1=0;
unsigned char posit2=0;
unsigned char posit3=0;
/*闹时启/停子函数*/
void time1_of()
{ if(P2_1==0)
{ delay(1);
o_f=1;
}
if(P2_2==0)
{delay(1);
o_f=0;
}
if(o_f==1)
{
P1=0xc0;
P3=0xdf;
}
if(o_f==0)
{
P1=0x8e;
P3=0xdf;
}
}
/*走时函数*/
void time()
{dirve();
p_out();
if(almflag2==1)
{ if(time_counter3==1)
{P2_4=~P2_4;
time_counter3=0;
a++;
if(a==60)
{
a=0;
almflag2=0;
}
}
}
if(almflag2==0)
P2_4=1;
}
/*定时器T0 2.5mS初始化*/
void timer_init(void)
{
TMOD=0x01;//定时器1模式
TH0=0xf7;//计数初值
TL0=0x00;
TR0=1;//开始计数
ET0=1;//中断使能
}
/*2.5mS定时中断服务子函数*/
timer() interrupt 1
{
TH0=0xf7;
TL0=0x00;
if(++deda>=400)
{ deda=0;
time_counter1=1; //1秒到
time_counter2=1;
time_counter3=1;
}
}
/*延时子函数*/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++)
{;}
}
/*扫描按键子函数*/
void scan_key()
{ delay(1);
if(P2_3==0) set++;
if(set>=5) set=0;
F0:if(P2_3==0) goto F0;
}
/*时、分、秒单元及走时单元转换*/
void conv()
{
if(time_counter1==1)
{sec++;time_counter1=0;}
if(sec==60)
{min++;sec=0;}
if(min==60)
{hour++;min=0;}
if(hour==24)
{hour=0;}
}
/*倒计时单元及走时单元转换*/
void d_conv()
{ t=3600*d_hour+60*d_min+d_sec;
if(time_counter2==1)
{
t--;
time_counter2=0;
}
d_hour=t/3600;
d_min=t%3600/60;
d_sec=t%60;
if(d_hour==0&&d_min==15&&d_sec==0)
{almflag1=1;}
if(d_hour==0&&d_min==0&&d_sec==0)
{
almflag1=1;
dflag=0;
}
}
/*调整走时时间*/
void time_adj()
{ if(P2_2==0) delay(1); //按键消抖
if(P2_2==0) hour++;
if(hour==24) hour=0;
if(P2_1==0) delay(1);
if(P2_1==0) min++;
if(min==60) min=0;
if(P2_0==0) delay(1);
if(P2_0==0) sec=0;
for(m=0;m<30;m++)
{dirve();
}
}
/*调整闹时时间*/
void time1_adj()
{
if(P2_2==0) delay(1);
if(P2_2==0) t_hour++;
if(t_hour==24) t_hour=0;
for(m=0;m<30;m++)
{t_dirve();
}
if(P2_1==0) delay(1);
if(P2_1==0) t_min++;
if(t_min==60) t_min=0;
for(m=0;m<30;m++)
{t_dirve();
}
}
/*调整倒计时时间*/
void time2_adj()
{ if(P2_2==0) delay(1);
if(P2_2==0) d_hour++;
if(d_hour==12) d_hour=0;
if(P2_1==0) delay(1);
if(P2_1==0) d_min++;
if(d_min==60) d_min=0;
if(P2_0==0) delay(1);
if(P2_0==0) dflag=1;
for(m=0;m<30;m++)
d_dirve();
}
/*走时时间输出驱动子函数*/
void dirve()
{ for(posit1=0;posit1<6;posit1++)
{
P1=DATA_7SEG[dis_buff1[posit1]];
P3=DATA_P3[posit1];
delay(1);
P1=0xff;
}
}
/*闹时时间输出驱动子函数*/
void t_dirve()
{
for(posit2=0;posit2<6;posit2++)
{P1=DATA_7SEG[dis_buff2[posit2]];
P3=DATA_P3[posit2];
delay(1);
P1=0xff;
}
}
/*倒计时时间输出驱动子函数*/
void d_dirve()
{
for(posit3=0;posit3<6;posit3++)
{
P1=DATA_7SEG[dis_buff3[posit3]];
P3=DATA_P3[posit3];
delay(1);
P1=0xff;
}
}
/*判别闹钟是否到时子函数*/
void p_out()
{ if(o_f==1)
{if(hour==t_hour&&min==t_min&&sec==t_sec)
{almflag2=1;}
if(P2_0==0)
almflag2=0;
}
}
/*走时计数值送显示缓冲区函数*/
void data_to_disbuffer1(void)
{dis_buff1[0]=hour/10;
dis_buff1[1]=hour%10;
dis_buff1[2]= min/10;
dis_buff1[3]= min%10;
dis_buff1[4]= sec/10;
dis_buff1[5]= sec%10;
}
/*闹钟计数值送显示缓冲区函数*/
void data_to_disbuffer2(void)
{
dis_buff2[0]=t_hour/10;
dis_buff2[1]=t_hour%10;
dis_buff2[2]= t_min/10;
dis_buff2[3]= t_min%10;
dis_buff2[4]= t_sec/10;
dis_buff2[5]= t_sec/10;
}
/*倒计时计数值送显示缓冲区函数*/
void data_to_disbuffer3(void)
{
dis_buff3[0]=d_hour/10;
dis_buff3[1]=d_hour%10;
dis_buff3[2]= d_min/10;
dis_buff3[3]= d_min%10;
dis_buff3[4]= d_sec/10;
dis_buff3[5]= d_sec%10;
}
/*主函数*/
void main()
{ timer_init();
EA=1;
while(1)
{ conv();
if(dflag==1)
d_conv();
if(almflag1==1)
{ P2_4=0;
delay(100);
P2_4=1;
almflag1=0;
}
if(P2_3==0)
scan_key();
switch(set)
{
case 0 : time(); break;
case 1 : time1_adj(); break;
case 2 : time1_of(); break;
case 3 : time2_adj(); break;
case 4 : time_adj(); break;
default : break;
}
data_to_disbuffer1();
data_to_disbuffer2();
data_to_disbuffer3();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -