用51单片机普中开发板实现数字时钟

三个按键用来调时,准点蜂鸣器报时,调时的时候秒表不跳,显示效果如图

img


码如下
#include <REGX51.H> //编写的是51单片机

//宏定义 uc ui
#define uc unsigned char
#define ui unsigned int

// 全局变量
//定义按键
sbit key0=P3^0;
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^1;

//定义数码管位驱运位
sbit L1=P2^2;
sbit L2=P2^3;
sbit L3=P2^4;
sbit beep=P2^5;

//变量 char
uc min,hour,sec,num,set,x_min,x_hour,x_sec,n_min,n_hour,n_sec,xx,kk;

//位标量 bit
bit bdata zhi,sz,nl;

//显示数码 int
/0,1,2,3,4,5,6,7,8,9,./
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void clock(void);

//延时 传值 int类型
void delay(ui x)
{
//声明 int i, j;
ui i,j;

//延长
for(i=0;i<x;i++)
for(j=0;j<100;j++);     

}

//延时 传值 有符号 + int i
void delayn(unsigned int i)
{
while(i--);
}

//显示程序
void display(void)
{
//if..else 比较值 做相应调整
if(set==0)
{
//更改赋值
x_hour=hour;
x_min=min;
x_sec=sec;
xx=0;
}
else if((set>0)&&(set<4)){
//更改赋值
x_hour=hour;
x_min=min;
x_sec=sec;
}
else
{
//更改赋值
x_hour=n_hour;
x_min=n_min;
x_sec=0;
}

if((sz==0)&&(xx==1)){
    P0=0;
}
else 
    P0=tab[x_hour/10];

L1=1;
L2=1;
L3=1;

//调用--延时
delay(1);

//该值
P0=0;
L1=1;
L2=1;
L3=1;

if((sz==0)&&(xx==1))
    P0=0;
else 
    P0=(tab[x_hour%10]);
L1=0;
L2=1;
L3=1;

//调用--延时
delay(1);

P0=0;
L1=1;
L2=1;
L3=1;

P0= 0x40;
L1=1;
L2=0;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;


if((sz==0)&&(xx==2))
P0=0;
else P0=tab[x_min/10];
L1=0;
L2=0;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;

if((sz==0)&&(xx==2))
P0=0;
else P0=(tab[x_min%10]);
L1=1;
L2=1;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;

P0= 0x40;
L1=0;
L2=1;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;

if((sz==0)&&(xx==3))
P0=0;
else P0=tab[x_sec/10];
L1=1;
L2=0;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;

if((sz==0)&&(xx==3))
P0=0;
else P0=tab[x_sec%10];    
L1=0;
L2=0;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;

}
//按键处理程序
void keyscan()
{
if(key0==0)
{
//调用--延时 5
delay(5);;
while(key0==0);
set++;
if(set>5)
set=0;
}

//判断是否为3
if(key3==0)
{
////调用--延时 5
delay(5);;
while(key3==0);
nl=1;
}

//循环 set 常量
switch(set)
{
    //常量为1
    case 1:{
            //xx = 1 赋值
             xx=1;
            
            //判断key   做相应调成
            if(key1==0)    
            {
                delay(5);;
                while(key1==0);
                hour++;    
            
            //判断 hour == 24  做相应调成
            if(hour==24)             
                hour=0;                
            }
                
            //判断key == 2   做相应调成
            if(key2==0)                    
            {
                delay(5);;
                while(key2==0);
                hour--;    
    
                if(hour==0)             
                hour=23;                
            }                      
           };break;

    case 2:{    
                xx=2;     
                if(key1==0)    
                {
                    delay(5);;
                    while(key1==0);
                    min++;    
                    if(min==60)             
                    min=0;                
                }
                if(key2==0)                    
                {
                    delay(5);;
                    while(key2==0);
                    min--;    
                    if(min==0)             
                    min=59;                
                }                      
           };break;
    
    case 3:{    
                xx=3;     
                if(key1==0)    
                {
                    delay(5);;
                    while(key1==0);     
                    sec=0;                
                }
                if(key2==0)                    
                {
                    delay(5);;
                    while(key2==0);     
                    sec=0;                
                }                      
           };break;
    
    case 4:{     
                xx=1;    
                if(key1==0)    
                {
                    delay(5);;
                    while(key1==0);
                    n_hour++;    
                    if(n_hour==24)             
                    n_hour=0;                
                }
                if(key2==0)                    
                {
                    delay(5);;
                    while(key2==0);
                    n_hour--;    
                    if(n_hour==0)             
                    n_hour=24;                
                }                      
           };break;
    
    case 5:{         
                xx=2;
                if(key1==0)    
                {
                    delay(5);;
                    while(key1==0);
                    n_min++;    
                    if(n_min==60)             
                    n_min=0;                
                }
                if(key2==0)                    
                {
                    delay(5);;
                    while(key2==0);
                    n_min--;    
                    if(n_min==0)             
                    n_min=59;                
                }                      
           };break;
           case 0:
           break;
    }

}

//初始货程序
void init(void)
{
sec=50;
min=0;
hour=12;
n_min=1;
n_hour=12;

TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;    
EA=1;                   
ET0=1;                   
TR0=1;                   

}

//蜂鸣器程序 发声函数
void clock(void)
{
//定义 + int类型 i
unsigned int i;
for(i=85000;i>0;i--)
{
beep=~beep;

    //延时大约1ms   通过修改此延时时间达到不同的发声效果
    delayn(3); 
}

}

//主程序
void main(void)
{

//调用--货程序
init();    

//set nl 赋值
set=0;    
nl=1;    

while(1)         
{   
    //调用--主函数

// display();

    //调用--按键处理程序
    keyscan();
    
    //判断 min==n_min 并且    hour==n_hour)&&sec==0  执行
    if((min==n_min)&&(hour==n_hour)&&sec==0)
    {
                 nl=0;
    }
    
    //判断min==0 并且 sec==0 调用--蜂鸣器
    if((min==0)&&(sec==0))
        clock();        //调用--蜂鸣器

}

}
//中断计时程序
void time0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;

//num  kk 自增
num++;
kk++;

//调用主程序
display();
if(kk>20)
{
    sz=~sz;    
    kk=0;
}            

//判断 num == 100    
if(num==100)            
{
    num=0;    
   
    sec++;           
    if(sec==60)       
    {
        sec=0;       
        min++;       
        if(min==60)
        {
            min=0; 
            hour++;
            if(hour>=24)
            hour=0;
        }
    }
}

}

源码有吗,这样直接看不出来啥的,应该不是硬件问题。建议附件附上源码

51单片机数字钟的实现
如有帮助,望采纳
https://blog.csdn.net/qq_45767476/article/details/116567012