单片机课设:时钟
扫描二维码
随时随地手机看文章
分别通过数码管显示时分秒,key0按下停止计数,进入调整时间状态,之后按下key1分钟加1,按下key2小时加1,再按下key0继续计数。
#include
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9共阴
#define dula P0//数码管段选
#define wela P2 //数码管位选
//定义按键
sbit Key0=P1^0;//时间停止等待调整,恢复计数
sbit Key1=P1^1;//调整分钟,加1
sbit Key2=P1^2;//调整小时,加1
//定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
uchar sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;
uchar byCounter;//中断次数,20次为1s(500ms定时)
/*****************************函数声明************************************/
void init();
void increase();
void disp();
void delay(uchar);
void time_modify();
/****************************主函数***************************/
void main()
{
init();//初始化
while(1)
{
TR0=1;//开定时器
disp();//显示
time_modify();//调整时间
}
}
/*******************************初始化****************************/
void init()
{
wela=0;
sec_ge=sec_shi=0;
min_ge=min_shi=0;
hour_ge=hour_shi=0;
sec=min=hour=0;
byCounter=0;
TMOD=0x01;//定义定时器0工作与方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开T0中断
}
/******************************延时**********************************/
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
/****************************中断***********************************/
void t0()interrupt 1
{
TH0=(65536-50000)/256;//重赋初值
TL0=(65536-50000)%256;
byCounter++;
if(byCounter==20)//到了1s
{
byCounter=0;
increase();//计数加1
}
}
/****************************计数加1***********************************/
void increase()
{
sec++; //秒加1
if(sec==60)//如果秒为60,则清零,分加1
{
sec=0;
min++;
}
if(min==60)//如果分为60,则清零,时加1
{
min=0;
hour++;
}
if(hour==24)//如果时为24,则清零
{
hour=0;
}
}
/****************************显示***********************************/
void disp()
{
sec_ge=sec%10;//秒的个位和十位
sec_shi=sec/10;
min_ge=min%10;//分的个位和十位
min_shi=min/10;
hour_ge=hour%10;//时的个位和十位
hour_shi=hour/10;
//循环扫描
wela=0xDF;
dula=table[hour_shi];//时的十位
delay(10);
wela=0xEF;
dula=table[hour_ge];//时的个位
delay(10);
wela=0xF7;
dula=table[min_shi];//分的十位
delay(10);
wela=0xFB;
dula=table[min_ge];//分的个位
delay(10);
wela=0xFD;
dula=table[sec_shi];//秒的十位
delay(10);
wela=0xFE;
dula=table[sec_ge];//秒的个位
delay(10);
}
/*****************************调整时间*********************************/
void time_modify()
{
uchar flag=0;
if(Key0==0)//如果Key0按下
{
while(Key0==0)//等待按键放开
{
disp();
}
flag=1;//标志位置1
while(flag)//当标志位为1时才能进行时间调整
{
TR0=0;//定时器停止
disp();//显示停止时的时间
if(Key0==0)//如果Key0按下
{
while(Key0==0)//等待按键放开
{
disp();
}
flag=0;//标志位清零
}
if(Key1==0)//如果Key1按下
{
while(Key1==0)//等待按键放开
{
disp();
}
min++;
if(min==60)
min=0;
}
if(Key2==0)//如果Key2按下
{
while(Key2==0)//等待按键放开
{
disp();
}
hour++;
if(hour==24)
hour=0;
}
}
}
}