新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机C编程(六、定时器时钟显示时分秒)

51单片机C编程(六、定时器时钟显示时分秒)

作者: 时间:2016-11-27 来源:网络 收藏
六位数码管显示时分秒,通过四个按键进行时间的控制。按下"调时"按键,时间显示停止;按下"选择时分秒"按键,数码管上方的发光二极管会点亮,对应着选中的要修改的时间是小时、分钟还是秒;按下"按下增加"按键,选中的时间将会增加;按下"完成"按键,时间继续显示。

已通过proteus仿真,电路图如下所示,希望大家多多指点,积极留言:

本文引用地址://m.amcfsurvey.com/article/201611/322159.htm

//编程: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};//共阳数码管数字码(带小数点)

#defineLEDP0//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;
}
}
}
}
}
}
}



评论


技术专区

关闭