51单片机简单时钟
Posted 一心向月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机简单时钟相关的知识,希望对你有一定的参考价值。
仿真
仿真和程序请点这里
提取码:azxy
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit P20=P2^0; //时,分,秒切换
sbit P21=P2^1; //根据stan的值分别对时,分,秒加一
sbit P22=P2^2; //根据stan的值分别对时,分,秒减一
u8 code duan[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x00,0x40}; //数码管段选
u8 code wala[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位选
u8 smg_cout[8];
u8 i=0; //i=1为50ms i=20为1s
u8 hour=0,min=0,s=0; //时,分,秒
u8 stan=0; //时间设置
//stan=0 时间显示
//stan=1 小时设置
//stan=2 分钟设置
//stan=3 秒设置
/*****************************************************
*********************延迟函数*************************
*****************************************************/
void delay(u16 i)
{
while(i--);
}
/*****************************************************
*********************中断函数*************************
*****************************************************/
void Timer0Init()
{
TMOD=0x01;
TH0=(65536-50000)/255;
TL0=(65536-50000)%255;
TR0=1;
ET0=1;
EA=1;
}
/*****************************************************
*******************数码管显示函数*********************
*****************************************************/
void smg_display()
{
static u8 num=0;
while(num<8)
{
P1=wala[num];
P0=smg_cout[num];
num++;
delay(200);
}
if(num==8) num=0;
}
/*****************************************************
*********************时钟界面显示*********************
*****************************************************/
void clock_display()
{
if(stan==0)
{
smg_cout[7]=duan[hour/10];
smg_cout[0]=duan[hour%10];
smg_cout[1]=duan[11];
smg_cout[2]=duan[min/10];
smg_cout[3]=duan[min%10];
smg_cout[4]=duan[11];
smg_cout[5]=duan[s/10];
smg_cout[6]=duan[s%10];
smg_display();
}
if(stan==1)
{
if(s%2==1)
{
smg_cout[7]=duan[hour/10];
smg_cout[0]=duan[hour%10];
}
else
{
smg_cout[7]=duan[10];
smg_cout[0]=duan[10];
}
smg_cout[1]=duan[11];
smg_cout[2]=duan[min/10];
smg_cout[3]=duan[min%10];
smg_cout[4]=duan[11];
smg_cout[5]=duan[s/10];
smg_cout[6]=duan[s%10];
smg_display();
}
if(stan==2)
{
if(s%2==1)
{
smg_cout[2]=duan[min/10];
smg_cout[3]=duan[min%10];
}
else
{
smg_cout[2]=duan[10];
smg_cout[3]=duan[10];
}
smg_cout[7]=duan[hour/10];
smg_cout[0]=duan[hour%10];
smg_cout[1]=duan[11];
smg_cout[4]=duan[11];
smg_cout[5]=duan[s/10];
smg_cout[6]=duan[s%10];
smg_display();
}
if(stan==3)
{
if(s%2==1)
{
smg_cout[5]=duan[s/10];
smg_cout[6]=duan[s%10];
}
else
{
smg_cout[5]=duan[10];
smg_cout[6]=duan[10];
}
smg_cout[7]=duan[hour/10];
smg_cout[0]=duan[hour%10];
smg_cout[1]=duan[11];
smg_cout[2]=duan[min/10];
smg_cout[3]=duan[min%10];
smg_cout[4]=duan[11];
smg_display();
}
}
/*****************************************************
*********************按键设置时间*********************
*****************************************************/
void key_down()
{
if(P20==0)
{
delay(100);
if(P20==0)
{
stan++;
if(stan==4) stan=0;
}
while(P20==0) clock_display();
}
if(P21==0)
{
delay(100);
if(P21==0)
{
if(stan==1)
{
hour++;
if(hour==24) hour=0;
}
if(stan==2)
{
min++;
if(min==60) min=0;
}
if(stan==3)
{
s++;
if(s==60) s=0;
}
}
while(P21==0) clock_display();
}
if(P22==0)
{
delay(100);
if(P22==0)
{
if(stan==1)
{
hour--;
if(hour==-1) hour=23;
}
if(stan==2)
{
min--;
if(min==-1) min=59;
}
if(stan==3)
{
s--;
if(s==-1) s=59;
}
}
while(P22==0) clock_display();
}
}
/*****************************************************
**********************主函数**************************
*****************************************************/
void main()
{
Timer0Init();
while(1)
{
key_down();
clock_display();
}
}
/*****************************************************
********************中断服务函数**********************
*****************************************************/
void timer0() interrupt 1
{ i++;
TH0=(65536-50000)/255;
TL0=(65536-50000)%255;
if(i==20)
{
i=0;
s++;
}
if(s==60)
{
s=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24)
{
hour=0;
min=0;
s=0;
}
}
以上是关于51单片机简单时钟的主要内容,如果未能解决你的问题,请参考以下文章