//编程:jumpmysoul
#include
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管数字码
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共阳数码管数字码(带小数点)
#define LED P0 //P0为数码管的段选
#define LIGHT P1 //P1为时分秒位的指示灯
#define WS P2 //P2为数码管的位选
sbit time_change=P3^0;//P3^0为“调时”按键
sbit time_choose=P3^1;//P3^1为“选择时分秒”按键
sbit time_inc=P3^2; //P3^2为“增加”按键
sbit time_ok=P3^3; //P3^3为“完成”按键
ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位
int choose_n;//按下“选择时分秒”按键的次数
int flag; //定义“调时”按键的标志位
//---------------------------------------------------------------------
void init();
void display();
void delay(int);
void time_modify();
//---------------------------------------------------------------------
void main()
{
init();
while(1)
{
TR0=1;
display();
time_modify();
}
}
//---------------------------------------------------------------------
void init()
{
WS=t=LIGHT=choose_n=0;
sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
TMOD=0x01; //定义定时器0工作与方式1
TH0=(65536-5536)/256; //定时器赋初值
TL0=(65536-5536)%256;
EA=1; //开总中断和T0中断
ET0=1;
}
//--------------------------------延时子函数------------------------------------
void delay(int x)
{
int i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
//-------------------------------显示子函数---------------------------------------
void display()
{
int i=0;
if(TF0==1) //如果定时器溢出
{
TF0=0; //清中断标志位
t++;
if(t==10)
{
t=0;
sec++; //秒加1
if(sec==60) //如果秒为60,则清零,分加1
{
sec=0;
min++;
}
if(min==60) //如果分为60,则清零,时加1
{
min=0;
hour++;
}
if(hour==24) //如果时为24,则清零
{
hour=0;
}
}
}
sec_ge=sec%10; //秒的个位和十位
sec_shi=sec/10;
min_ge=min%10; //分的个位和十位
min_shi=min/10;
hour_ge=hour%10; //时的个位和十位
hour_shi=hour/10;
WS=0x20; //循环扫描
LED=tab[sec_ge];
delay(1);
WS=0x10;
LED=tab[sec_shi];
delay(1);
WS=0x08;
LED=tab_dp[min_ge];
delay(1);
WS=0x04;
LED=tab[min_shi];
delay(1);
WS=0x02;
LED=tab_dp[hour_ge];
delay(1);
WS=0x01;
LED=tab[hour_shi];
delay(1);
}
//----------------------------调时子程序-------------------------------
void time_modify()
{
if(time_change==0) //如果“调时”按键按下
{
delay(5); //延时去抖
if(time_change==0)
{
flag=1; //标志位置1
while(flag) //当标志位为1时才能进行时间调整
{
TR0=0; //定时器停止
display(); //显示停止时的时间
if(time_ok==0) //如果“完成”按键按下
{
delay(15); //延时去抖
if(time_ok==0)
{
flag=0; //标志位清零
}
}
if(time_choose==0) //如果“时分秒选择”按键按下
{
delay(30); //延时去抖
if(time_choose==0)
{
++choose_n; //按下的次数增加
if(choose_n==4)//如果次数达到4次
{
choose_n=1;//次数清零
}
if(choose_n==1)//如果次数为1,秒指示灯亮
{
LIGHT=0x03;
}
else if(choose_n==2) //如果次数为2,分指示灯亮
{
LIGHT=0x0c;
}
else if(choose_n==3)//如果次数为3,时指示灯亮
{
LIGHT=0x30;
}
}
}
if(time_inc==0) //如果“增加”按键按下
{
delay(30); //延时去抖
if(time_inc==0)
{
switch(choose_n)//分支结构,根据choose_n的值来判断哪一位加1
{
case 1: //如果choose_n为1,秒加1,到60清零
{
sec++;
if(sec==60)
sec=0;
break;
}
case 2: //如果choose_n为2,分加1,到60清零
{
min++;
if(min==60)
min=0;
break;
}
case 3: //如果choose_n为3,时加1,到24清零
{
hour++;
if(hour==24)
hour=0;
break;
}
default:break;
}
}
}
}
}
}
}
如果觉得《c51单片机时钟c语言程序设计 51单片机C编程(六 定时器时钟显示时分秒)》对你有帮助,请点赞、收藏,并留下你的观点哦!