c语言编辑电子实时时钟,可以调整时间的电子时钟-C语言

使用stc89c52单片机,电路很简单,采用八位共阳数码管,p0口为数码管的段选,p2口为位选. 通过key1-key3来调整时间

重点:

1、函数的模块化

2、中断#include#define uchar unsigned char

#define uint unsigned int

sbit p2_0=P2^0;

sbit p2_1=P2^1;

sbit p2_2=P2^2;

sbit p2_3=P2^3;

sbit p2_4=P2^4;

sbit p2_5=P2^5;

sbit p2_6=P2^6;

sbit p2_7=P2^7;

sbit key0=P3^2;

sbit key1=P3^3;

sbit key2=P3^4;

sbit key3=P3^5;

sbit p17=P1^7;

uint t=0;

uint key=0;

uchar set=0;

uchar second=00,minter=55,hour=11;

uchar second_1,second_2,minter_1,minter_2,hour_1,hour_2;

const uchar tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf} ; //0~~9数码表

void delay() //延时延时子程序

{ uint i;

for(i=0;i<240;i++);

}

void time_0(void) interrupt 1 using 0 //内部定时器0内部定时50ms

{

TH0=0x3c;

TL0=0xb0;

t++; // t是记定时次数

}

void display(uchar secondd,uchar minterr,uchar hourr) //显示始终时间的子程序

{

second_1=secondd/10;

second_2=secondd%10;

minter_1=minterr/10;

minter_2=minterr%10;

hour_1=hourr/10;

hour_2=hourr%10;

P0=tab[second_2];

p2_0=0;

delay();

p2_0=1;

P0=tab[second_1];

p2_1=0;

delay();

p2_1=1;

p2_2=0;

P0=0xbf;

delay();

p2_2=1;

P0=tab[minter_2];

p2_3=0;

delay();

p2_3=1;

P0=tab[minter_1];

p2_4=0;

delay();

p2_4=1;

p2_5=0;

P0=0xbf;

delay(); //延时 是为了使— “——”显示出来,否则时间太快,—

p2_5=1;

P0=tab[hour_2];

p2_6=0;

delay();

p2_6=1;

P0=tab[hour_1];

p2_7=0;

delay();

p2_7=1;

}

void time()

{

//定时1s的时间是否到?

if(t==19) //1s到,则加一秒

{ t=0;

second++;

if(second==60) // 是否为60秒 ,是秒清零,分加一秒,不到则跳出

{

second=0;

minter++;

if(minter==60) // 分是否为60分,是 ,分清零,时加一;不是则跳出

{ minter=0;

hour++;

if(hour==24)

{

hour=0;

}

}

}

}

display(second,minter,hour); //调用显示函数 来显示时间时间

}

uint scan_key() //调整时间 按键 扫描 函数

{ //延时

delay(); //判断 如果按键 按key3下则返回1 来调用 调整时间函数,不为零则返回0 不变不调整

if(key0==0)

set=1;

if(key0==1)

set=0;

return set;

}

void set_time() //调整时间函数

{ uchar m;

if(key1==0) delay(); //调整小时,确定key1健按下

if(key1==0) hour++; // x小时数递增

if(hour==24) hour=0; //小时数到24,从零开始

for(m=0;m<20;m++) //循环20次

{ time(); //调用显示函数 来显示时间时间

}

if(key2==0) delay(); //调整分钟

if(key2==0) minter++;

if(minter==60) minter=0;

delay();

time(); //调用时间函数 来显示时间时间

if(key0==0)

time();

}

void main() //主函数 设定 内部时间定时

{

TMOD=0X01;

TH0=0X10;

TL0=0X00;

EA=1;

ET0=1;

TR0=1;

P2=0xff;

while(1)

{

if(key0==0) // p判断 调整时间的按键是否按下 即 是否需要 调整时间

{

p17=0;

delay();

delay();

delay();

p17=1;

delay();

delay();

key=scan_key();

}

switch(key)

{ //定时1s的时间是否到?

case 0: time(); break;

case 1: set_time();break;

default :break;

}

}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值