快捷搜索:  汽车  科技

51单片机电子时钟教程(51单片机学习20-简易电子钟)

51单片机电子时钟教程(51单片机学习20-简易电子钟)程序:仿真图:2、实现四个按键操作控制;3、复位后内定数码管显示时间为00:00:00;4、具有闹钟和整点报时功能

前面几篇我们说到了 LED灯,数码管,按键和蜂鸣器等内容,根据以上内容可以设计一个简易电子钟。

硬件组成:单片机最小系统 数码管显示电路 4个按键 蜂鸣器电路 LED灯指示电路

功能:

1、数码管显示目前时间;

2、实现四个按键操作控制;

3、复位后内定数码管显示时间为00:00:00;

4、具有闹钟和整点报时功能

仿真图:

51单片机电子时钟教程(51单片机学习20-简易电子钟)(1)

程序:

51单片机电子时钟教程(51单片机学习20-简易电子钟)(2)

程序内容比较多,详细的参考源代码

源程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

/****共阳数码管0--9 全灭段码****/

uchar code led[]={

0xc0 0xf9 0xa4 0xb0

0x99 0x92 0x82 0xf8

0x80 0x90 0xff};

uchar a[6];//数码管显示

uchar b[6]={0xFB 0XF7 0XEF 0XDF 0XBF 0X7F};//数码管位码

/****子函数声明****/

void delay_ms(uint z);//带参数ms级延时子函数

void init();//初始化函数

void timechuli();//时间处理

void key();//按键函数

void display();//显示函数

/****变量定义****/

uint num; // 记录毫秒为秒的变量

uchar hour=23;

uchar minite=59;

uchar second=56;

uchar hour1=0;

uchar minite1=1;

uchar second1=0;

uchar k;

uchar flag; //更新时间的4种模式加上正常模式

uchar S_flag;//闪烁标志位

/****位定义****/

sbit beep=P3^6; //蜂鸣器

sbit led0=P1^0; //整点报时显示

sbit led1=P1^7; //闹钟报时显示

sbit key1=P3^2; //模式切换键 1正常模式 2时钟时调整 3时钟分调整 4闹钟时调整 5闹时钟分调整

sbit key2=P3^3; //加1

sbit key3=P3^4; //减1

sbit key4=P3^5; //复位键

void main()

{

init();

while(1)

{

key();

display();

}

}

void display()

{

switch(flag)

{

case 0: //时钟显示模式

{

a[5]=led[hour/10];

a[4]=led[hour];

a[3]=led[minite/10];

a[2]=led[minite];

a[1]=led[second/10];

a[0]=led[second];

}

break;

case 1: // 时钟 时调整模式

{

if(S_flag==1) //标志位为1

{

a[5]=led[hour/10]; //调整时钟的时

a[4]=led[hour];

}

else

{

a[5]=led[11]; //关闭显示

a[4]=led[11];

}

a[3]=led[minite/10];

a[2]=led[minite];

a[1]=led[second/10];

a[0]=led[second];

}

break;

case 2: // 时钟 分调整模式

{

a[5]=led[hour/10];

a[4]=led[hour];

if(S_flag==1)

{

a[3]=led[minite/10];

a[2]=led[minite];

}

else

{

a[3]=led[11];

a[2]=led[11];

}

a[1]=led[second/10];

a[0]=led[second];

}

break;

case 3: // 闹钟 时调整模式

{

if(S_flag==1)

{

a[5]=led[hour1/10];

a[4]=led[hour1];

}

else

{

a[5]=led[11];

a[4]=led[11];

}

a[3]=led[minite1/10];

a[2]=led[minite1];

a[1]=led[11];

a[0]=led[11];

}

break;

case 4:

{

a[5]=led[hour1/10];

a[4]=led[hour1];

if(S_flag==1) // 闹钟 分调整模式

{

a[3]=led[minite1/10];

a[2]=led[minite1];

}

else

{

a[3]=led[11];

a[2]=led[11];

}

a[1]=led[11];

a[0]=led[11]; //

}

break;

}

}

void init()

{

beep=0;//关闭蜂鸣器

flag=0;//正常时钟显示模式

S_flag=0;//闪烁标志位

TMOD=0X01;//定时器T0 方式1

TH0=(65536-50000)/256; //重装初值

TL0=(65536-50000)%6;

EA=1;//开总中断

ET0=1;//开启定时器T0

TR0=1;

}

void time0() interrupt 1

{

TH0=(65536-50000)/256; //重装初值

TL0=(65536-50000)%6;

num ;

if(num==20) //1S到

{

num=0;

timechuli(); //时间处理函数

}

if(hour1==hour&&minite1==minite&&second<5)//闹钟时间到

{

beep=!beep;

led1=!led1;

}

else //闹钟提醒时间到后 关闭蜂鸣器和指示灯

{

beep=0;

led1=1;

}

if((minite==0)&&(second==0)) //整点到

{

led0=!led0;

}

else //关闭LED指示

led0=1;

if(num ==0) //1S取反一次

S_flag=!S_flag; //闪烁标志位取反

for(k=0;k<6;k )

{

P2=b[k]; //送位码

P0=a[k]; //送段码

delay_ms(2);

P2=0xff;//消影

}

}

void key()

{

if(key1==0) //模式切换键按下

{

delay_ms(10);

if(key1==0)

{

flag ;

if(flag==5)

{

flag=0;

}

}

while(!key1) ; //等待按键释放

}

if(flag!=0)

{

switch(flag)

{

case 1: //时钟时调整

{

if(key2==0) //时钟时加1

{

delay_ms(10);

if(key2==0)

{

if(hour<23) hour ;

else hour=0;

}

while(!key2);

}

if(key3==0) //时钟时减1

{

delay_ms(10);

if(key3==0)

{

if(hour> 0) hour--;

else hour=23;

}

while(!key3) ;

}

}

break;

case 2: //时钟分调整

{

if(key2==0) //时钟分加1

{

delay_ms(10);

if(key2==0)

{

if(minite<59) minite ;

else minite=0;

}

while(!key2);

}

if(key3==0) //时钟分减1

{

delay_ms(10);

if(key3==0)

{

if(minite> 0)minite--;

else minite=59;

}

while(!key3);

}

}

break;

case 3: //闹钟时调整

{

if(key2==0) //闹钟时加1

{

delay_ms(10);

if(key2==0)

{

if(hour1<23) hour1 ;

else hour1=0;

}

while(!key2);

}

if(key3==0) //闹钟时减1

{

delay_ms(10);

if(key3==0)

{

if(hour1> 0) hour1--;

else hour1=23;

}

while(!key3);

}

}

break;

case 4: //闹钟分调整

{

if(key2==0) //闹钟分加1

{

delay_ms(10);

if(key2==0)

{

if(minite1<59) minite1 ;

else minite1=0;

}

while(!key2) ;

}

if(key3==0) //闹钟分减1

{

delay_ms(10);

if(key3==0)

{

if(minite1> 0)minite1--;

else minite1=59;

}

while(!key3);

}

}

break;

}

}

if(key4==0) //复位键

{

delay_ms(10);

if(key4==0)

{

flag=0;

hour=0;

minite=0;

second=0;

}

while(!key4);

}

}

void delay_ms(uint z)

{

uint x y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void timechuli()

{

second ;

if(second==60)

{

second=0;

minite ;

}

if( minite==60)

{

minite=0;

hour ;

}

if(hour==24)

hour=0;

}

仿真结果:

51单片机电子时钟教程(51单片机学习20-简易电子钟)(3)

猜您喜欢: