📄 shifen.c
字号:
/*单片机上电复位后,等待按键4启动定时器0;
再次按键4,定时器0停止计数,进入时分初值设置状态,每按一次1键,时加一,每按一次2键,分加一;
第三次按键4退出设置状态,重新启动定时器0*/
#include <reg51.h>
sbit P1_3=P1^3;//键1
sbit P1_2=P1^2;//键2
sbit P2_7=P2^7;//小数点位,低电平有效
sbit P2_1=P2^1;
sbit P2_4=P2^4;
bit flag=0,sign=0,hourfirst=0;//flag=1为设置状态允许外部中断0,1;flag=0退出设置状态禁止外部中断0,1
//sign实现一秒小数点闪一次;hourfirst实现时再次为0时仍为时分显示
unsigned char setflag=5;
unsigned char daynumber[12]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char count,second=0,minute=0,hour=0,mouth=1,day=1;
unsigned char dsplow,dsphigh;
unsigned char sel0=0X10,sel1=0X20,sel2=0X40,sel3=0X80;
unsigned char hourset=0,minuteset=0;//闹铃时分设定
void timer0() interrupt 1 using 1//定时器0的中断
{
TH0=0X70;
TL0=0X00; //重置初值
count++;
if(count==13)sign=~sign;//一秒小数点闪一次
if(count>=25)
{count=0;
second++;
if(second>=60)
{second=0;
minute++;
if(minute>=60)
{minute=0;
hour++;
if(hour>=24)
{hour=0;
day++;
if(day>=daynumber[mouth-1])
{day=1;
mouth++;
if(mouth>=13)mouth=1;
}
}
}
}
}
}
void int0() interrupt 0 using 0//外部中断0
{
setflag++;
if(setflag==6)setflag=0;
switch(setflag)
{
case 0:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=hour;break;
case 1:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=minute;break;
case 2:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=mouth;break;
case 3:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=day;break;
case 4:sel0=0X10;sel1=0X20;sel2=0;sel3=0;dsphigh=hourset;break;
case 5:sel0=0;sel1=0;sel2=0X40;sel3=0X80;dsplow=minuteset;break;
default:break;
}
}
void int1() interrupt 2 using 2//外部中断1
{
switch(setflag)
{
case 0:hour++;if(hour>=24)hour=0;dsphigh=hour;break;
case 1:minute++;if(minute>=60)minute=0;dsplow=minute;break;
case 2:mouth++;if(mouth>=13)mouth=1;dsphigh=mouth;break;
case 3:day++;if(day>=daynumber[mouth-1])day=1;dsplow=day;break;
case 4:hourset++;if(hourset>=24)hourset=0;dsphigh=hourset;break;
case 5:minuteset++;if(minuteset>=60)minuteset=0;dsplow=minuteset;break;
default:break;
}
}
void delay(unsigned char t){//t ms延时
unsigned char j;
while(t--){
for(j=120;j>0;j--){;}
}
}
void initial()//中断初始化
{
TMOD=0x01;//设定计数模式
TH0=0X70;//设定计数初值
TL0=0X00;
ET0=1;//允许定时器0中断
EA=1;
IT0=1;//下降沿触发
IT1=1;
PX1=1;//外部中断1高优先级
}
void main()//主函数
{
initial();
P2=0X80;//灭灯
while(P1_3);
TR0=1;
for(;;)//闪烁显示时间
{
if(!flag)
{
if(!P1_2)
{dsplow=day;dsphigh=mouth;
}
else if((!hourfirst)&&(hour==0))//时不为0时,分秒显示跳为时分显示
{dsplow=second;dsphigh=minute;
}
else
{hourfirst=1;dsplow=minute;dsphigh=hour;
}
}
if(!P1_3)
{
flag=~flag;TR0=~TR0;EX0=~EX0;EX1=~EX1;
if(!flag){sel0=0X10;sel1=0X20;sel2=0X40;sel3=0X80;}//flag=1为设置状态允许外部中断0,1;flag=0退出设置状态禁止外部中断0,1
}
if(hourset==hour&&minuteset==minute){P2_1=1;P2_4=1;}//闹铃时间到红灯亮
else{P2_1=0;P2_4=0;}
P0=sel0|(dsphigh/10);//数码管循环选通输出
delay(1);
P0=sel1|(dsphigh%10);
P2_7=sign;
delay(1)
P0=sel2|(dsplow/10);
P2_7=1;
delay(1);
P0=sel3|(dsplow%10);
delay(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -