📄 定时.c
字号:
/*接口*/
/* P0接键盘*/
/* p1接数码管的位选端
P2接段码
p3.2接蜂鸣器
P2.0/P3.2/P3.7接发光二极管
*/
#include <reg52.h>
#define uchar unsigned char
uchar cout, k,i,n;
uchar miao = 0;
uchar fen = 0;
uchar hour =0;
uchar d_hour,d_fen,d_miao;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_7=P3^7;
bit baojing,flag_ma,t;
uchar duanma[11] =
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff
};
uchar weima[6] =
{
0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf
};
uchar huanchun[6];
void Delay(uchar i)
{
do{ if(flag_ma==0) //显示标志,为0显示设置定时时间,
{ huanchun[0] = miao % 10;
huanchun[1] = miao / 10;
huanchun[2] = fen % 10;
huanchun[3] = fen / 10;
huanchun[4] = hour % 10;
huanchun[5] = hour / 10;
}
else //显示标志,为1显示设置定时时长,
{ huanchun[0] = d_miao % 10;
huanchun[1] = d_miao / 10;
huanchun[2] = d_fen% 10;
huanchun[3] = d_fen / 10;
huanchun[4] = d_hour % 10;
huanchun[5] = d_hour / 10;
}
}while(i--);
}
fuwei() //复位操作
{ miao=0;fen=0;hour=0;
d_hour=0;d_fen=0;d_hour=0;
}
void dingshi()interrupt 1 //定时50ms //到计数
{
TH0 = 0x4c;
TL0 = 0x00;
cout++;
if (cout == 20)
{
miao--;
cout=0;
if (miao==0xff)
{
miao=59;
fen--;
if (fen==0xff)
{
fen=59;
hour--;
if (hour==0xff)
hour=23;
}
}
if(miao==0&&fen==0&&hour==0)
{ baojing=1;//声音报警标志
P3_2=0;//声音报警
P3_7=0; //控制信号产生控制为低电平
if(fen==58||t==1)t=0,P3_2=1;//报警1分钟,或到定时时间后停止报警
}
if(miao==(60-d_miao)&&fen==(59-d_fen)&&hour==(23-d_hour))
{ P3_7=1; //
t=1;
TR0=0;
fuwei(); //显示都为0
}
}
}
void xianshi()interrupt 3 //中断显示 2 MS
{
TH1=0Xf8; //显示定时两毫秒。
TL1=0Xcc;
P1 = weima[i];
P2 = duanma[huanchun[i]];
i++;
if(i==6)i=0;
if(fen==58||t==1)P3_2=1; //到1分钟或定时到后停止报警
}
unsigned char scankey() //键盘扫描
{
unsigned char k,down,up;
P0=0x00;
P0=0xF0;
k=P0;
if(k==0xF0)return 0xFF;
Delay(50); ////////////
down=3;
while(k&0x80)down--,k<<=1;
P0=0x00;
P0=0x0F;
k=P0;
if(k==0x0F)return 0xFF;
up=0;
while(k&0x01)up+=4,k>>=1;
return up+down;
}//scankey
songjian() //松键操作
{ uchar k;
while(1)
{ k=scankey();
if(k==scankey()&&k==0xff)break;
}
}
main()
{
TMOD = 0X01; //初始化定时器T0 T1
TH0 = 0XEE;
TL0 = 0X00;
TH1=0Xf8;
TL1=0Xcc;
EA = 1;
ET0 = 1;
TR0 = 0;
ET1 = 1;
TR1 = 1;
P3_7=1;//控制信号初始为高电平
while(1)
{
k=scankey();
Delay(100);
if(k==scankey()&&k!=0xff)
{
songjian();
if(k==15)
{ TR0=0;
P3_0=0;
flag_ma=0;
while(1)
{
k=scankey();
Delay(100);
if(k==scankey()&&k!=0xff)
{ songjian();
if(k==14){P3_0=1;break;}
if(k<6)
{ switch(k)
{ case 0: miao++;
if(miao==60)miao=0;
break;
case 1: miao--;
if(miao==0xff)miao=59;
break;
case 2: fen++;
if(fen==60)fen=0;
break;
case 3: fen--;
if(fen==0xff)fen=59;
break;
case 4: hour++;
if(hour==24)hour=0;
break;
case 5: hour--;
if(hour==0xff)hour=23;
break;
}
}
}
}
}
if(k==13)
{ TR0=0;
P3_0=0;
flag_ma=1;
while(1)
{
k=scankey();
Delay(100);
if(k==scankey()&&k!=0xff)
{ songjian();
if(k==12){P3_0=1;break;}
if(k<6)
{
switch(k)
{ case 0: d_miao++;
if(d_miao==60)d_miao=0;
break;
case 1: d_miao--;
if(d_miao==0xff)d_miao=59;
break;
case 2: d_fen++;
if(d_fen==60)d_fen=0;
break;
case 3: d_fen--;
if(d_fen==0xff)d_fen=59;
break;
case 4: d_hour++;
if(d_hour==24)d_hour=0;
break;
case 5: d_hour--;
if(d_hour==0xff)d_hour=23;
break;
}
}
}
}
}
if(k==11){flag_ma=0;;P3_1=0;TR0=1;}
}
}
} //15号键是对调整显示时钟的切入键
//13号键是对定时时刻的调整的切入键
//0/1对秒调整按下0键加一秒按下1键减一秒
//2/3对秒调整按下2键加一分按下3键减一分
//4/5对秒调整按下4键加一小时按下5键减一小时
//11号键是跳出调整状态键
//当时间到达所调定时的时刻时P3_7=0; //控制信号产生控制为低电平P3_2=0;//声音报警
//同时P3_2=1;//报警1分钟,或到定时时间后停止报警
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -