欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于51单片机的时钟设计

程序员文章站 2022-03-13 17:18:11
...

#基于51单片机的时钟设计

此文章为某年某月某次单片机作业,一点拙见

首先:再keil上写下代码,用protues调试(不懂得百度搜索“keil与protues联机调试”)
使用的芯片和器件图中自己找
这次没有使用38译码器,直接将数码管引脚全部放在单片机上
基于51单片机的时钟设计
不多说,上代码和图:
代码如下

/***********************************/

/*  时间2019.12.20,地点:dq218    转载请说明出处  */

/***********************************/


#include<reg51.h>
#define uChar unsigned char
#define uInt unsigned int
#define d 60
#define q 20
sbit Key1 = P3^0;  //规定四个按键‖第五个按键K5为常开触点,按下后不弹起
sbit Key2 = P3^1; 
sbit Key3 = P3^2; 
sbit Key4 = P3^3; 
sbit Buzzer=P1^1;
 
uChar a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; 
uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
uChar second=50,minute=30,hour=21,year=19,month=12,day=10,flag=0,flag1=0,count;


/***************延时函数***************/

void Delay(uInt t)
  {
   while(t)
    {
      t--;
    }
  }
/***************显示时间函数***************/
	
void Dispaly1(uChar second,uChar minute,uChar hour)
  {
    P2=b[0];
    P0=a[hour/10];
    Delay(d);
    
    P2=b[1];
    P0=a[hour%10];
    Delay(d);
    
    P2=b[2]; 
    P0=0x40; 
    Delay(d);
    
    P2=b[3]; 
    P0=a[minute/10]; 
    Delay(d);
    
    P2=b[4];
    P0=a[minute%10]; 
    Delay(d);
    
    P2=b[5]; 
    P0=0x40; 
    Delay(d);
    
    P2=b[6]; 
    P0=a[second/10]; 
    Delay(d);
    
    P2=b[7];; 
    P0=a[second%10]; 
    Delay(d);
  }
/***************显示日期函数***************/
void Dispaly2(uChar day,uChar month,uChar year)
 { 
   P2=b[0];             //第一位
   P0=a[2];        
   Delay(d);
   
   P2=b[1];             //第二位
   P0=a[0];
   Delay(d);
   
   P2=b[2];              //第三位
   P0=a[year/10]; 
   Delay(d);
   
   P2=b[3];             //第四位
   P0=a[year % 10]; 
   Delay(d);
   
   P2=b[4]; 
   P0=a[month/10];             //第五位
   Delay(d);
   
   P2=b[5]; 
   P0=a[month%10];             //第六位
   Delay(d);
   
   P2=b[6];              //第七位
   P0=a[day/10]; 
   Delay(d);
   
   P2=b[7];             //第八位
   P0=a[day%10]; 
   Delay(d);
 }
/****************按键函数1****************/
 /***************功能:修改时间**********/
void Keyscan1()
{
  static uChar i=0,j=0; 
  if(Key1==0) 
   {
    Delay(q); 
    if(Key1==0) 
    while(!Key1); 
    i++;
   }
  
  if(i%2==1)  //关闭定时器
   {
    TR0=0;
   }
  if(i%2==0)  //打开定时器
   {
    TR0=1;
   }
  
  if(Key2==0) 
   {
    Delay(q); 
    if(Key2==0)
    while(!Key2);
    j++; 
   }
  if(j%3==0&&i%2==1)  //修改时分秒
  {
    if(Key3==0)
     {
      Delay(q); 
      if(Key3==0)
      while(!Key3);
      second++;
      if(second==60)
      second=0;
     }
  }
	
  if(j%3==1&&i%2==1)         //当k1按下后才能修改时间
   {
    if(Key3==0)
    {
    Delay(q); 
    if(Key3==0)
    while(!Key3);
    minute++;
    if(minute==60)
    minute=0; 
   }
  }
	 
  if(j%3==2&&i%2==1)
   {
    if(Key3==0)
     { 
       Delay(q); 
       if(Key3==0)
       while(!Key3);
       hour++;
       if(hour==24)
       hour=0; 
     }
   }
}
/****************按键函数2****************/
/****************功能:修改日期***********/
void Keyscan2()
 {
  static uChar m=0,n=0; 
  if(Key1==0)           //K1按下后才能修改日期或时间
   {
    Delay(d); 
    if(Key1==0)
    while(!Key3);
    m++;
   }
	 
  if(m%2==1) 
   {
    TR0=0;                //定时器关
   }
  
  if(m%2==0)
   {
    TR0=1;                //定时器开
   }
	 
  if(Key2==0)       //K2功能:选择修改 “时分秒“ 或者 ”年月日”
   {
     Delay(10); 
     if(Key2==0)
     while(!Key2);
     n++; 
   }
  
  if(n%3==0)             //选择修改天数
   {
  if(Key3==0)       
  {
    Delay(d); 
    if(Key3==0)
    while(!Key3);
    day++;
    if(day==30)
    day=0;
  }
   }
	 
  if(n%3==1)            //选择修改月份
   {
  if(Key3==0)
    { 
      Delay(10); 
      if(Key3==0)
      while(!Key3);
      month++;
      if(month==12)
      month=0; 
    }
   }
	 
  if(n%3==2)                 //选择修改年份
   {
   if(Key3==0)
    { 
     Delay(d); 
     if(Key3==0)
     while(!Key3);
     year++;
     if(year==99)
     year=0; 
    }
   }
 }


/***************主函数***************/

void main()
{						
TMOD=0x01; 	 
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;  /*10ms*/
EA=1;
ET0=1;
TR0=1;
	
	
 while(1)
 {
    static uChar h=0;
    
    if(Key4==0)                 //K4功能:12小时/24小时/日期切换
      {
       Delay(10); 
       if(Key4==0)
		 	  {
           while(!Key4);
           h++;
			  }
      }
		if(h%3==0)
      {
       Dispaly1(second,minute,hour);      //显示24小时制
       Keyscan1(); 
      }  
    if(h%3==1)
      {
       Dispaly1(second,minute,hour-12);   //显示12小时制
       Keyscan1(); 
      }  
    if(h%3==2)
      {
       Dispaly2(year,month,day);          //显示日期
       Keyscan2();
      }
     if(Key3==0)
      { 
       Delay(d); 
       if(Key3==0)
       while(!Key3);
		   flag++;
      }			
    	
	   if(flag%2==0)  //记录K3按下后flag加一
		 {
			 flag1=0;     
	   }
	   if(flag%2==1)
	   {
	   	flag1=1;		
	   }
			
/***********闹钟设定时间21:31开始响,无人应答30s后关闭*/
		 
		if(minute==31&&(second>0&&second<30)&&hour==21&&flag1==0)
			Buzzer=0;//蜂鸣器响
		else
			Buzzer=1;//蜂鸣器关
  }
}


/**************中断函数***************/
void time0_int(void) interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 count++;
if(count==100) //10ms*100=1s
    {
     count=0;
     second++;
    if(second==60)      //秒归零
       {
        second=0;
        minute++;
       if(minute==60)   //分钟归零
         {
          minute=0;
          hour++;
         if(hour==24)   //小时归零
           {
            hour=0;
            day++;
           if(day==30)   //天数归零
             {
              day=0;
              month++;
             if(month==12)  //月份归零
               {
                month=0;
                year++;
               if(year==99)  //年份归零
                 {
                  year=0;
                 }
               }
             }
           }
         }
       }
    }
		


}



相关标签: 单片机