8051单片机数码管的电子钟C语言程序,单片机数码管电子钟(C语言)

原标题:单片机数码管电子钟(C语言)

//***********************************

// 软件名: 数码

//***********************************

//

// 软件版本:V1.0.3

//

//

//***********************************

#include

#include

#define uchar unsigned char

void delay (void);

start_time ();

key_adjust ();

voil(void);

time_end (void);

// k1调秒 k2调分 K3调时

sbit k0=P1^0; // 电子时钟 START/STOP 键

sbit k1=P1^1; //调时

sbit k2=P1^2; //调分

sbit k3=P1^3; //调秒

sbit beep=P2^1; //蜂鸣器

bit on_off;

uchar code LOAD[8]={0xff,0xff,0xc7,0xc0,0x88,0xa1,0xff,0xff};//显示LOAD字样数据

uchar code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据

uchar data DATA_TEMP[8]; //显示缓存区

uchar data digit; //移位变量(动态扫描时选通)

static uchar data t,k,i;

static char data sec,min,hour;

int f,h,j;

char d;

main ()

{

TMOD=0X01; //定时器0

ET0=1; //开定时器0中断

EA=1; //开总中断

TH0=0XFC; //定时器0 定时1ms

TL0=0X18;

TR0=1; //启动定时器

RCAP2H=0X3C; //定时50ms

RCAP2L=0XAD;

ET2=1;

digit=0xfe;

P3=0XFF; //关闭显示

d=0;

on_off=1;

//***************开机显示 LOAD *************

while (d<8)

{

DATA_TEMP[d]=LOAD[d];

d++;

}

for (h=600;h>0;h--) //开机后显示LOAD延时

{

for (j=500;j>0;j--);

}

TR2=1;//开始倒时时

//*****************************************

//******对时钟进行初始化赋值*******

hour=12;

min=0;

sec=0;

//********时间:00-00-00 *****************

start_time (); //调用调时间函数,使之对时钟进行初始化赋值

DATA_TEMP[2]=0XBF; //使之LED显示格式为xx-xx-xx

DATA_TEMP[5]=0XBF;

while (1) // 总循环

{

key_adjust ();

//*********************时钟走时部分******************

if (k0==0)

{

delay ();

while (k0==0);//等待按键释放

on_off=~on_off; //做标记,用于判断K0键状态(是继续还是暂停计数器)

if (on_off==0) TR2=0;

else TR2=1;

}

while (t==20) //到1 秒了吗?

{

t=0;

sec++;

if (sec>59) //到1 分钟了吗?

{

sec=0;

min++;

if (min>59) //到1 小时了吗?

{

min=0;

hour++;

if (hour>23) hour=0;

DATA_TEMP[1]=LED_DATA[hour%10];

if (LED_DATA[hour%10]==0) DATA_TEMP[1]=0xFF;

DATA_TEMP[0]=LED_DATA[hour/10];

}

DATA_TEMP[4]=LED_DATA[min%10];

if (LED_DATA[min%10]==0) DATA_TEMP[1]=0xFF;

DATA_TEMP[3]=LED_DATA[min/10];

}

DATA_TEMP[7]=LED_DATA[sec%10];

if (LED_DATA[sec%10]==0) DATA_TEMP[1]=0XFF;

DATA_TEMP[6]=LED_DATA[sec/10];

}

while ((hour==8)&&(min==0)&&(sec==0)) //设置闹钟

{

time_end();

}

}

//**************************************************

}

void displayscanf (void) 1 //定时器0中断服务程序,用于动态显示扫描

{

TH0=0XFC;

TL0=0X18;

P0=DATA_TEMP[i];

i++;

P3=digit;

digit=_crol_(digit,1); //动态显示时,依次选通数码管

if (i>7) //扫描完一圈后,回到第一位,准备下一次扫描

{

i=0;

digit=0xfe;

}

}

void timer_server (void) interrupt 5 //时钟走时定时

{

TF2=0;

t++;

}

start_time () //对时间初始化赋值,并更新DATA_TEMP数组里的数据

{

DATA_TEMP[1]=LED_DATA[hour%10];

DATA_TEMP[0]=LED_DATA[hour/10];

DATA_TEMP[4]=LED_DATA[min%10];

DATA_TEMP[3]=LED_DATA[min/10];

DATA_TEMP[7]=LED_DATA[sec%10];

DATA_TEMP[6]=LED_DATA[sec/10];

}

key_adjust() //调时函数

{

if (k1==0) //调时

{

ET2=0;

delay ();

if (k1==0)

{

hour++;

if (hour>23) hour=0;

while (k1!=1); //等待按键释放,使每按一次,小时自动+1

delay ();

ET2=1;

start_time ();

}

}

if (k2==0) //调分

{

ET2=0;

delay ();

if (k2==0)

{

min++;

if (min>59) min=0;

while (k2!=1); //等待按键释放,使每按一次,分钟自动+1

delay ();

ET2=1;

start_time ();

}

}

if (k3==0) //调秒

{

ET2=0;

delay ();

if (k3==0)

{

sec++;

if (sec>59) sec=0;

while (k3!=1); //等待按键释放,使每按一次,秒数自动+1

delay ();

ET2=1;

start_time ();

}

}

}

void delay (void) //延时,防止键

{

unsigned char data x,y;

for (x=0;x<=30;x++)

{

for (y=0;y<=130;y++)

{}

}

}

void alarm (void) //报警函数

{

for (f=0;f<=3000;f++);

beep=~beep;

}

time_end (void) //判断计时器是倒数是否数完(为0),如果是则停止计时,并报警

{

alarm();

}

责任编辑:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
8051单片机数字钟(完整)(包括原理图,c语言源代码) 键盘8为显示功能键: 按第一次——显示时间 按第二次——显示日期 按第三次——显示星期 键盘0为调节功能键: 按第一次-----1,2两位闪烁 按第二次-----4,5两位闪烁 按第三次-----7,8两位闪烁 键盘1为增加键: 1,2两位闪烁时,按一下加1 4,5两位闪烁时,按一下加1 7,8两位闪烁时,按一下加1 键盘2为减少键: 1,2两位闪烁时,按一下减1 4,5两位闪烁时,按一下减1 7,8两位闪烁时,按一下减1 上电初始时数码管显示为00-00-00 按第一次键盘8——显示时间 显示模式为:时-分-秒 在显示时间的时候按键盘0调节功能键: 按第一次-----秒的两位闪烁 按第二次-----分的两位闪烁 按第三次-----时的两位闪烁 按第四次-----秒,分,时均不闪烁,时间正常显示 当秒的两位闪烁时,按键盘1一下秒加1,按键盘2一下秒减1 当分的两位闪烁时,按键盘1一下分加1,按键盘2一下分减1 当时的两位闪烁时,按键盘1一下时加1,按键盘2一下时减1 按第二次键盘8——显示日期 显示模式为:年-月-日 在显示日期的时候按键盘0调节功能键: 按第一次-----日的两位闪烁 按第二次-----月的两位闪烁 按第三次-----年的两位闪烁 按第四次-----年,月,日均不闪烁,日期正常显示 当日的两位闪烁时,按键盘1一下日加1,按键盘2一下日减1 当月的两位闪烁时,按键盘1一下月加1,按键盘2一下月减1 当年的两位闪烁时,按键盘1一下年加1,按键盘2一下年减1 按第三次键盘8——显示星期 显示模式为:最后一位显示1—7 在显示日期的时候按键盘0调节功能键: 按第一次-----星期闪烁 按第二次-----星期正常显示 当星期闪烁时,按键盘1一下星期加1,按键盘2一下星期加减1 按第四次键盘8返回显示时间

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值