51单片机c语言制作数字电子时钟

用51单片机开发板实现电子数字时钟功能,整点报时蜂鸣器发出响声,显示效果如图,用按键调时,调整时间时秒表不跳

img


代码如下,想使调时间时秒表不走
#include <REGX51.H>
#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=P1^5;
uc min,hour,sec,num,set,x_min,x_hour,x_sec,n_min,n_hour,n_sec,xx,kk; //变量
bit bdata zhi,sz,nl;
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/0,1,2,3,4,5,6,7,8,9,./ //显示数码
void clock();
void delay(ui x) //延时
{
ui i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}

void delayn(unsigned int i) //延时
{
while(i--);
}

void display() //显示程序
{
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)
{
delay(5);;
while(key0==0);
set++;
if(set>5)
set=0;
}
if(key3==0)
{
delay(5);;
while(key3==0);
nl=1;
}
switch(set)
{
case 1:{
xx=1;
if(key1==0)
{
delay(5);;
while(key1==0);
hour++;
if(hour==24)
hour=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
hour--;
if(hour==0)
hour=24;
}
};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() //初始货程序
{
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() //蜂鸣器程序
{
unsigned int i;
for(i=20;i>0;i--)
{
beep=~beep;
delayn(80); //延时大约1ms 通过修改此延时时间达到不同的发声效果
}
}//蜂鸣器发声函数
void main() //主程序
{
init();
set=0;
nl=1;
while(1)
{
// display();
keyscan();
if((min==n_min)&&(hour==n_hour)&&sec==0)
{
nl=0;
}
if((nl==0)&&(sz==0))
clock();

}

}
void time0() interrupt 1 //中断计时程序
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
kk++;
display();
if(kk>20)
{
sz=~sz;
kk=0;
}
if(num==100)
{
num=0;

    sec++;           
    if(sec==60)       
    {
        sec=0;       
        min++;       
        if(min==60)
        {
            min=0; 
            hour++;
        }
    }
}

}

/*定时1s*/

void timer0()interrupt 1
{
    TH0=15536/256;
    TL0=15536%256;
    i--;
    if(i==0){
        i=20;
        rel_sec++;
        if(rel_sec==60){
            rel_sec=0;
            rel_min++;
            if(rel_min==60)
            {
                rel_min=0;
                rel_hour++;
                if(rel_hour==24){
                    rel_hour=0;
                }
            }
        }    
    Key();
  comp();        
  baoshi();
    dis();    
    }
    
}    
    
void dis(){
      rel_time[0]=rel_hour/10;
        rel_time[1]=rel_hour%10;
        rel_time[2]='-'-0x30;
        rel_time[3]=rel_min/10;
        rel_time[4]=rel_min%10;
        rel_time[5]='-'-0x30;
        rel_time[6]=rel_sec/10;
        rel_time[7]=rel_sec%10;
    
      set_time[0]=set_hour/10;
        set_time[1]=set_hour%10;
        set_time[2]='-'-0x30;
        set_time[3]=set_min/10;
        set_time[4]=set_min%10;
        set_time[5]='-'-0x30;
        set_time[6]=set_sec/10;
        set_time[7]=set_sec%10;
      write_com(0x80+6);
      for(j=0;j<8;j++){
        write_data(rel_time[j]+0x30);
          LCDdelay(5);
      }
      write_com(0x80+0x40+6);
      for(j=0;j<8;j++){
        write_data(set_time[j]+0x30);
          LCDdelay(5);
      }
}    

void Key(){
        if(keymode==0){
          mode++;
          if(mode==4)
            mode=1;
        }
        if(mode==1){
            ledsec=1;
            ledmin=0;
            ledhour=0;
        }
        if(mode==2){
            ledsec=0;
            ledmin=1;
            ledhour=0;
        }
        if(mode==3){
            ledsec=0;
            ledmin=0;
            ledhour=1;
        }
            
        if(cho==0){
        choose=0;
      }
      else{
        choose=1;
      }
    
    if(keyadd==0){
        if(mode==1){
            if(choose==0){
                rel_sec++;
            if(rel_sec==60){
            rel_sec=0;
          }
            }
            else{
                set_sec++;
            if(set_sec==60){
            set_sec=0;
          }
            }
        }
        else if(mode==2){
            if(choose==0){
                rel_min++;
            if(rel_min==60){
            rel_min=0;
          }
            }
            else{
                set_min++;
            if(set_min==60){
            set_min=0;
          }
            }
            
      }
        if(mode==3){
            if(choose==0){
                rel_hour++;
            if(rel_hour==24){
            rel_hour=0;
          }
            }
            else{
                set_hour++;
            if(set_hour==24){
            set_hour=0;
          }
            }
            
      }
  }
  if(keysub==0){
        if(mode==1){
            if(choose==0){
                if(rel_sec==0){
            rel_sec=59;
          }
            else
            rel_sec--;
            }
            else{
                if(set_sec==0){
            set_sec=59;
          }
            else
            set_sec--;
            }
            
        }
        else if(mode==2){
            if(choose==0){
                if(rel_min==0){
            rel_min=59;
          }
            else
            rel_min--;
          }
            else{
                if(set_min==0){
            set_min=59;
          }
            else
            set_min--;
            }
            
            
      }
        if(mode==3){
            if(choose==0){
              if(rel_hour==0){
            rel_hour=23;
          }
            else
            rel_hour--;
            
            }
            else{
                if(set_hour==0){
            set_hour=23;
          }
            else
            set_hour--;
            
            }
      }
  }
}


void delay(uint x)          //该延时大约100us 
{
  uchar j;
    while(x--)
        for(j=0;j<120;j++);
}

void baoshi(){
    if(rel_min==0&&rel_sec==1){
        bee=1;
        delay(500);
        bee=0;
    }
}

void comp(){
    if(rel_hour==set_hour&&rel_min==set_min&&rel_sec==set_sec+1)
    {bee=1;
    delay(1000);
    bee=0;}
}

用下面的代码


//该程序使用两个四位共阴数码管,10.0592Mhz晶振,STC89C52RC单片机,三个轻触开关 
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//单独控制某个引脚的电平不能直接写P3^0=1,必须先定义引脚
sbit key0 = P3^0 ;         
sbit key1 = P3^2 ;
sbit key2 = P3^3 ;

uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};       //共阴数码管0~9
uchar a = 0 ,hour = 0 , min = 0 , sec = 0 ;                       
uchar b = 0 , c = 0 , d = 0;

void time0_server_() interrupt 1      // interrupt  0表示外部中断01表示定时器中断02表示外部中断13表示定时器中断14表示串口中断
{
    TH0 = 0x4c ;
    TL0 = 0x00 ;
    a++;
    if(a == 20)                        //20 * 50 = 1000ms = 1s 即每隔1s“秒”加1
    {
        a = 0 ;
        sec = sec + 1 ;
    }
    if(sec == 60)                   //sec=60时清空,“分”加1
    {
        min = min + 1 ;
        sec = 0 ;
    } 
    if(min == 60)                  //min=60时清空,“时”加1
    {
        hour = hour + 1 ;
        min = 0 ;
    }
    if(hour == 24)                 //hour=24时清空
    {
        hour = 0 ;
    }
}

void init_t0()
{
    TMOD = 0x01 ;       //采用16位定时器
    TH0 = 0x4C ;       //50ms (65536-50000)/256
    TL0 = 0x00 ;       //       (65536-50000)%256   
    EA = 1 ;           //开启定时器0的中断
    ET0 = 1 ;          //开启总中断          
    TR0 = 1 ;           //启动定时器0          
}

void delay(uint n)               //延时函数(运行空项目以达到延迟时间的效果)
{
    uint i,j;
    for(i = 0 ; i < n ; i ++)
    {
        for(j = 0 ; j < 120 ; j ++);
    }    
}

void display1()                           //在数码管上显示
{
    uchar t0 = 0 ,t1 = 0 , t2 = 0 , t3 = 0 , t4 = 0 , t5 = 0 ;
    t0 = hour / 10 ;          //t0表示时针的十位
    t1 = hour % 10 ;          //t1表示时针的个位
    t2 = min / 10 ;              //t2表示分针的十位
    t3 = min % 10 ;              //t3表示分针的个位
    t4 = sec / 10 ;              //t4表示秒针的十位
    t5 = sec % 10 ;              //t5表示秒针的个位
    P2 = 0x7f ;                  //P2^7低电平     0111 1111     控制第一个数码管 
    P0 = s[t0] ;              //用来显示“时”的十位
    delay(1) ;                  //延时大约1ms
    P2 = 0xbf ;                  //P2^6低电平     1011 1111     控制第二个数码管 
    P0 = s[t1] ;              //用来显示“时”的个位
    delay(1) ;
    P2 = 0xdf ;                  //P2^5低电平     1101 1111     控制第三个数码管 
    P0 = 0x40 ;                  //显示“—”来分割“时”与“分”
    delay(1) ;
    P2 = 0xef ;                  //P2^4低电平     1110 1111     控制第四个数码管 
    P0 = s[t2] ;              //用来显示“分”的十位
    delay(1) ;
    P2 = 0xf7 ;                  //P2^3低电平     1111 0111     控制第五个数码管 
    P0 = s[t3] ;              //用来显示“分”的个位
    delay(1) ;
    P2 = 0xfb ;                  //P2^2低电平     1111 1011     控制第六个数码管 
    P0 = 0x40 ;                  //显示“—”来分割“分”与“秒”
    delay(1) ;
    P2 = 0xfd ;                  //P2^1低电平     1111 1101     控制第七个数码管 
    P0 = s[t4] ;              //用来显示“秒”的十位
    delay(1) ;
    P2 = 0xfe ;                  //P2^0低电平     1111 1110     控制第八个数码管 
    P0 = s[t5] ;              //用来显示“秒”的个位
    delay(1) ;    
}

void KEY0()                            //开关0控制“时”加1
{
    if(key0 == 0 && c == 0)
    {
        c = 1 ;
    }
    if(key0 == 1 && c == 1)
    {
        c = 0 ;
        hour = hour + 1 ;
    }
}

void KEY1()                         //开关1控制“分”加1
{
    if(key1 == 0 && d == 0)
    {
        d = 1 ;
    }
    if(key1 == 1 && d == 1)
    {
        d = 0 ;
        min = min + 1 ;
    }
}

void KEY2()                         //开关2控制“秒”加1
{
    if(key2 == 0 && b == 0)
    {
        b = 1 ;
    }
    if(key2 == 1 && b == 1)
    {
        b = 0 ;
        sec = sec + 1 ;
    }
}

void main()                      //主函数
{
    init_t0();
    while(1)
    {
        KEY0();
        KEY1();
        KEY2();
        display1();
    }    
}

把程序贴出来别人才好给你查毛病啊