您的位置 首页 FPGA

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

六位数码管显示时分秒,通过四个按键进行时间的控制。按下调时按键,时间显示停止;按下选择时分秒按键,数码管上方的发光二极管会点亮

六位数码管显现时分秒,经过四个按键进行时刻的操控。按下”调时”按键,时刻显现中止;按下”挑选时分秒”按键,数码管上方的发光二极管会点亮,对应着选中的要修正的时刻是小时、分钟仍是秒;按下”按下添加”按键,选中的时刻将会添加;按下”完结”按键,时刻持续显现。

已经过proteus仿真,电路图如下所示,期望我们多多点拨,活跃留言:

//编程: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;
}
}
}
}
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/256906.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部