📄 c51-timer.txt
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^3;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
bit run,set,nlg,clg; // 运行状态;设置状态;闹钟状态;秒表状态
bit bplg,dlg,slg=0,startlg=0; //蜂鸣器;整点标志;设置状态0.1s闪烁控制标志
bit klg1=0; //按键1状态
bit klg2=0; //按键2状态
bit klg3=0; //按键3状态
uchar d,e,f,g,h,i,j; // 设置状态;闹钟状态;秒表状态对应传递数据变量
uchar m,bpnum; //闹钟时间;整点响铃次数
uchar count=0; //定时器中断次数
uchar code seg[11]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar disdata[3]={14,59,55}; //时,分,秒;初值14:59:55
uchar disbuf[6]={0,0,0,0,0,0}; //数码管显示数据
void delayus0(uint r)
{ while(r)
{r--;}
}
void delayus(uchar t)
{ do
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--t);
}
void delayms(uint tt)
{ do delayus(131);
while(--tt);
}
void timetobuf(uchar a,uchar b,uchar c)
{ disbuf[0]=a/10;
disbuf[1]=a%10;
disbuf[2]=b/10;
disbuf[3]=b%10;
disbuf[4]=c/10;
disbuf[5]=c%10;
}
void timedisplay()
{ uchar i,sel;
sel=0x01;
for(i=0;i<6;i++)
{ P0=seg[disbuf[i]];
P2=sel;
sel<<=1;
delayus0(80);
}
}
void timedisplay2()
{ uchar i,sel;
sel=0x01;
for(i=0;i<6;i++)
{ P0=seg[10];
P2=sel;
sel<<=1;
delayus0(80);
}
}
void timeinc()
{ disdata[2]++;
if(disdata[2]==60)
{ disdata[2]=0;
disdata[1]++;
if(disdata[1]==60)
{ disdata[1]=0;
disdata[0]++;
dlg=1;
bpnum=disdata[0]%12*2;
if(disdata[0]==24)
{ disdata[0]=0;
}
}
}
}
void timer0(void) interrupt 1
{ TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
if(count%10==0)
{ slg=~slg;
}
if(count==100)
{ count=0;
if(bplg==1)
{ m++;
beep=~beep;
if(m==15)
{ beep=1;
bplg=0;
}
}
if(dlg==1)
{ beep=~beep;
bpnum--;
if(bpnum==0)
{ beep=1;
dlg=0;
}
}
if(clg==1&&startlg==1)
{
j++;
if(j==60)
{ j=0;
i++;
if(i==30)
{ i=0;
}
}
}
timeinc();
}
}
void checkkey(void)
{
if(k1==0)
{ delayms(5);
if(k1==0)
delayms(8);
if(k1==1)
klg1=1;
}
if(k2==0)
{ delayms(5);
if(k2==0)
delayms(8);
if(k2==1)
klg2=1;
}
if(k3==0)
{ delayms(5);
if(k3==0)
delayms(8);
if(k3==1)
klg3=1;
}
}
void main()
{ TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x82;
TR0=1;
run=1;
set=0;
clg=0;
klg1=0;
klg2=0;
klg3=0;
while(1)
{ if(run==1)
{ checkkey();
do{ checkkey();
timetobuf(disdata[0],disdata[1],disdata[2]);
timedisplay();
if (disdata[0]==f&&disdata[1]==g&&disdata[2]==3)
{ beep=0;
bplg=1;
}
}while(klg1==0 && klg2==0 && klg3==0);
if(klg1==1)
{ run=0;
set=1;
klg1=0;
}
if(klg2==1)
{ run=0;
nlg=1;
klg2=0;
}
if(klg3==1)
{ run=0;
clg=1;
klg3=0;
}
}
if(set==1)
{ d=disdata[0];
e=disdata[1];
checkkey();
do
{ checkkey();
if(klg2==1)
{ d=d+1;
if(d==24) d=0;
klg2=0;
}
if(klg3==1)
{ e=e+1;
if(e==60) e=0;
klg3=0;
}
timetobuf(d,e,disdata[2]);
if(slg==1)
{ timedisplay();
}
else timedisplay2();
}while(klg1==0);
run=1;
disdata[0]=d;
disdata[1]=e;
set=0;
klg1=0;
}
if(nlg==1)
{ f=12;
g=0;
checkkey();
do
{ checkkey();
if(klg2==1)
{ f=f+1;
if(f==24) d=0;
klg2=0;
}
if(klg3==1)
{ g=g+1;
if(g==60) g=0;
klg3=0;
}
timetobuf(f,g,0);
timedisplay();
}while(klg1==0);
nlg=0;
run=1;
klg1=0;
}
if(clg==1)
{ h=0;
i=0;
j=0;
checkkey();
path: do
{ checkkey();
if(klg2==1)
{ startlg=1;
}
if(klg3==1)
{ h=0;i=0;j=0;
klg2=0;
klg3=0;
}
timetobuf(h,i,j);
timedisplay();
}while(klg1==0);
klg1=0;
klg2=0;
startlg=0;
do
{ checkkey();
if(klg3==1){goto path;}
timetobuf(h,i,j);
timedisplay();
}while(klg1==0);
klg1=0;
clg=0;
run=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -