51单片机控制数字时钟的显示及修改

简介: 51单片机控制数字时钟的显示及修改

数字时钟的显示及修改


实验目的


掌握定时器的使用、按键检测及数码管的动态显示。


实验内容


1、绘制如下proteus仿真图

image.png

功能,用6位数码管实现时、分、秒的显示及更新;

3、三个按键实现时间的修改。


代码


#include<reg52.h>
#define u8 unsigned char 
#define u16 unsigned int 
sbit SW1 =P3^0;
sbit SW2 =P3^1;
sbit SW3 =P3^2;
sbit LED    = P3^7;
u8 Data[]={ 0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 
      0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
      0x39 , 0x5e , 0x79 , 0x71 , 0x00 } ;
enum fun
{
  confirm=0,set_sec,set_min,set_hour
};       
enum fun SetTime;
//u8 SetTime;
bit SMG_SS_FLAG=0;
u8 key_hour=8;
u8 key_min =56;
u8 key_sec =0;
void delay_ms(u16 ms);
void Display(u8 Hour,u8 Min,u8 Sec);
void Key(void);
main()
{
  LED=1;
    TMOD=0x01;     //定时器0 方式1
    TH0=0xfc;    // 设置初始值1ms
    TL0=0x18;
  TR0=1;       //启动定时器
  ET0=1;       //允许中断
  EA=1;  
  while(1)
  {
    Key();
  //  display();
    }
}
void Key(void)
{
  if(SW1==0)
  {
    delay_ms(10); 
    if(SW1==0)    //
    {
      SetTime++;
      if(SetTime>set_hour)
      {
         SetTime=confirm;
      }
    //  SetTime=fun_f;
    }
    while(!SW1){;};    // 
  }
  else if(SW2==0)
  {
    delay_ms(10); 
    if(SW2==0)    //
    {
      switch(SetTime)
      {
       case confirm:            
          break;
       case set_sec:  key_sec++;   
            break;
       case set_min:  key_min++;    
            break;
       case set_hour: key_hour++;   
            break;
      }
    }
    while(!SW2){;};    // 
  }
  else if(SW3==0)
  {
    delay_ms(10); 
    if(SW3==0)    //
    {
      switch(SetTime)
      {
       case confirm:            
          break;
       case set_sec:  if(key_sec!=0)key_sec--;   
            break;
       case set_min:  if(key_min!=0)key_min--;    
            break;
       case set_hour: if(key_hour!=0)key_hour--;   
            break;
      }
    }
    while(!SW3){;};    // 
  }
} 
void delay_ms(u16 ms)
{
  u8 k;
  u16 i;
  for(i=ms*2;i>0;i--)
  {
    for(k=250;k>0;k--)
    {}
  }
}
void Display(u8 Hour,u8 Min,u8 Sec)
{
  static u8 DpyScan=0;
  P2=0xff;
  switch(DpyScan)
  {
     case 0:if(SMG_SS_FLAG==1||SetTime!=set_hour)
        {
          P1=Data[Hour/10];
        }
        else 
        {
          P1=0x00;
        } 
        break;
     case 1:if(SMG_SS_FLAG==1||SetTime!=set_hour)
        {
          P1=Data[Hour%10];
        }
        else
        {
          P1=0x00;
        } 
        break;
     case 2:if(SMG_SS_FLAG||SetTime!=set_min)
        {
          P1=Data[Min/10];
        }
        else 
        {
          P1=0x00;
        } 
        break;
     case 3:if(SMG_SS_FLAG||SetTime!=set_min)
        {
          P1=Data[Min%10];
        }
        else
        {
          P1=0x00;
        } 
        break;
     case 4:if(SMG_SS_FLAG||SetTime!=set_sec)
        {
          P1=Data[Sec/10];
        }
        else 
        {
          P1=0x00;
        } 
        break;
     case 5:if(SMG_SS_FLAG||SetTime!=set_sec)
        {
          P1=Data[Sec%10];
        }
        else 
        {
          P1=0x00;
        } 
        break;
  }
  P2=~(0x01<<DpyScan);
  if(DpyScan<6)
  {
    DpyScan++ ;
  }
  else
  {
    DpyScan=0;
  }
}
void timer0(void) interrupt 1   //定时器0中断函数
{
  static u16 SMG_twinkle;
  static u16 TIME=0;
    SMG_twinkle++;
  if(SMG_twinkle>20)   
  {
    SMG_twinkle=0;
    SMG_SS_FLAG=~SMG_SS_FLAG;
  } 
  TIME++ ;
  if(TIME>=200)
  {
    TIME=0;
    key_sec++;
  }
  if(key_sec>59)
  {
    key_sec=0;key_min++;
  } 
  if(key_min>59) 
  {
    key_min=0;
    key_hour++;
  }  
  if(key_hour>23) 
  {
    key_hour=0;
    key_min=0;
    key_sec=0;
  }
  Display(key_hour,key_min,key_sec);
    TH0=0xec;   //1ms
    TL0=0x77;
} 

效果


image.png

相关文章
|
1月前
|
监控
单片机的时钟系统
单片机的时钟系统
16 1
|
1月前
|
C语言
基于单片机的简易电子时钟
基于单片机的简易电子时钟
21 0
|
9月前
|
存储 芯片
51单片机--DS1302时钟
51单片机--DS1302时钟
|
4月前
|
芯片 开发者
单片机中时钟分析与快速读懂时序图的方法
单片机中时钟分析与快速读懂时序图的方法
95 0
|
7月前
|
监控 芯片
单片机如何才能不死机之内外部时钟
单片机如何才能不死机之内外部时钟
|
存储 编译器
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
|
11月前
|
测试技术 C语言 芯片
基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路
基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路
189 0
|
11月前
|
存储 C语言 芯片
51单片机&15单片机 时钟芯片DS1302
51单片机&15单片机 时钟芯片DS1302
175 0
|
数据格式
基于单片机的温度远程采集显示(RS485通信)
基于单片机的温度远程采集显示(RS485通信)
145 0
基于单片机的温度远程采集显示(RS485通信)
基于单片机的多功能数字时钟设计
基于单片机的多功能数字时钟设计
190 1
基于单片机的多功能数字时钟设计