⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock_mian.c

📁 89S51单片机时钟源码
💻 C
字号:
#include<regx51.h>

/*--------------------函数申明------------------------*/
void init(void);	          //硬件初始化
void init_data(void);	      //数据初始化
void time(void);			  //时间计算函数
void stop_watch(void);		  //秒表函数
void alarm(void) ;			  //闹钟函数
void display(void);			  //显示函数
void delay(char n);			  //延时函数
void un_slop_over(void);	   //防溢出函数


/*--------------------变量和标志为声明------------------------*/

/*---------------data[][]数据结构如下: ---------------------------
	时间:  小时   分钟    秒
	日期:  年     月	  日
	闹钟:  小时   分钟	  闹钟开启标志位
	秒表:  分      秒    0.01s	 
/*---------------------------------------------------------------*/

unsigned char Data_stor[4][3];       //定义结构体数组分别存放时间,日期,秒表和闹钟数据
static unsigned char  mode;          //模式选择 0:时间  1:日期 2闹钟  3秒表
static  char adjustnum;              //选择待调整的项目,值为-1,0,1,2  -1表示不调整
static unsigned char flash;          //闪烁定时标志位
static unsigned char alarm_run;      //闹钟启动标志
static unsigned char  run; 			 //秒表启动标志
unsigned char count_base = 0 ;
             
sbit key1 = P1^0;				     //按键入口
sbit key2 = P1^1;
sbit key3 = P1^2;


sbit diode = P2^6;                   //发光二极管输出口
sbit alarm_ring = P2^7;              //蜂鸣器输出口


void main()
{
	init();
	init_data();

	display();
}

/***********************************/
/*nms定时*/
void delay(char n)
{
	unsigned char  i,j;
	
	for(i=0;i<n;i++)
  		for (j=0;j<254;j++); 
		 
}

/***********************************/
      /*显示函数*/
void display()
{   
	char i;
/*--------------------编码------------------------------*/
	int disp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*--------------------显示位选择------------------------*/
	int select[6] = {0x3e,0x3d,0x3b,0x37,0x2f,0x1f};
    
	int display_bit[6];               //储存显示数据

  
	while (1)
	{

/*--------------------将显示数据转换为位---------------*/  
	display_bit[0] = Data_stor[mode][0]/10;   
	display_bit[1] = Data_stor[mode][0]%10;
	display_bit[2] = Data_stor[mode][1]/10;
	display_bit[3] = Data_stor[mode][1]%10;
	display_bit[4] = Data_stor[mode][2]/10;
	display_bit[5] = Data_stor[mode][2]%10;

		for (i=0;i<6;i++){   
			if ((2*adjustnum==i||2*adjustnum==(i-1))&&flash){
				P2 = 0x3f;                  //调整时屏蔽相应两位
			}
			else{
				P0 = disp[display_bit[i]];
			    P2 = select[i];
			}  		       

			if(mode==0&&(adjustnum == -1)&&flash)  //发光二极管闪烁
			  diode = 1;		
      		else  diode = 0;

			delay(10);
		    P2 = 0x3f;                  //关数码管使能,消除重影	
		}

		
	}
}
/***************************************/
      /*硬件初始化函数*/
void init()
{
	EA =1;                       //CPU中断开
	ET0 = 1;                     //开启定时中断0 ,1
	ET1 = 1; 
	TMOD = 0x11;                 //工作方式1
	TH0 = (65536-10000)/256;     //定时器初始化,T0用于基准时钟产生,为10ms
	TL0 = (65536-10000)%256;      
	TH1 = (65536-50000)/256;	 //T1用于调整时的闪烁,为50ms
	TL1 = (65536-50000)%256;
	TR0 = 1;                     //计时开始
	TR1 = 1;                    
	EX1 = 1;                     //外部中断开
//	IT1 = 1;				   	 //边沿触发
    alarm_ring = 0;              //关闭闹钟
}

/***************************************/
      /*数据初始化函数*/
void init_data()
{
  	mode = 0;
	adjustnum = -1;
	flash = 0;  
	run = 0;
	alarm_run = 0;

	Data_stor[0][0] = 0;   //时间初始化:00:00:00
	Data_stor[0][1] = 0;
	Data_stor[0][2] = 0;

	Data_stor[1][0] = 0;   //日期初始化:00-01-01
	Data_stor[1][1] = 1;
	Data_stor[1][2] = 1;

	Data_stor[2][0] = 0;   //闹钟初始化:00:00:00
	Data_stor[2][1] = 0;
	Data_stor[2][2] = 0;

	Data_stor[3][0] = 0;   //秒表初始化:00:00:00   
	Data_stor[3][1] = 0;
	Data_stor[3][2] = 0;
}

/***************************************/
      /*闹钟函数*/
void alarm()
{    
	unsigned char  alarm_count = 120;  //闹钟2min  
	if(Data_stor[2][1]==Data_stor[0][1] && Data_stor[2][0]==Data_stor[0][0])  {
		while(alarm_count){
			if(flash){
				alarm_ring = 1;
				alarm_count--;
	 		}
			else alarm_ring = 0;
		 }
	            alarm_ring = 0;
	  }
}

/***************************************/
      /*基准时间中断函数*/
void time_base()interrupt 1	  
{
	TH0 = (65536-10000)/256;
	TL0 = (65536-10000)%256;

	if (mode==0&&adjustnum>=0)
		count_base = 0;
	else
		count_base++;

	if(count_base == 100)   //一秒
	{	
        time();
		count_base = 0;
	}

	if(run) stop_watch();

}       

/***************************************/
      /*按键响应中断函数*/
void key_block()interrupt 2
{  	
/*--------------------按键响应------------------------------*/
   	if(!key1){
		delay(2);
		if(!key1){
		 mode++;
		adjustnum =-1;
		if(mode == 4) mode = 0;
		while(!key1);
		} 
	   
	}

	if(!key2){
		delay(2);
		if(!key2){
		 adjustnum++;
			if (adjustnum == 3)
				adjustnum =-1;
			if(mode == 3){
				if(adjustnum == 0) {
				run = !run;
				adjustnum = -1;
				}    
				else run = 0; 
			}
		 while(!key2);
		}
		
	}

	if(!key3){
		delay(2);
		if(!key3){
			if (adjustnum>=0&&mode<3){
				Data_stor[mode][adjustnum] += 1;
				un_slop_over();

				alarm_run = Data_stor[2][2]; 
			}
/*--------------------秒表------------------------------*/
/*秒表模式下key2控制开始/继续和停止/暂停key3控制秒表复位*/
			if(mode == 3){
			    adjustnum  = -1;
				Data_stor[3][0] = 0;
				Data_stor[3][1] = 0;
				Data_stor[3][2] = 0;
			 }
			while(!key3);
		}
	}
}



/***************************************/
      /*0.5s延时中断函数*/
 void time_flash()interrupt 3
{
   TH1 = (65536-50000)/256;
   TL1 = (65536-50000)%256;

   flash = !flash;

}

/***************************************/
      /*防止数据溢出函数*/
void un_slop_over()
{
/*时间*/
    Data_stor[0][0] = Data_stor[0][0]%24;    //小时
	Data_stor[0][1] = Data_stor[0][1]%60;    //分钟
	Data_stor[0][2] = Data_stor[0][2]%60;    //秒
/*日期*/
    Data_stor[1][0] = Data_stor[1][0]%100;    //年
	if(Data_stor[1][1] ==13)  Data_stor[1][1] = 1;  //月
	switch(Data_stor[1][1]) //日
	{
		case 4: 
		case 6:
		case 9:
		case 11:
			if (Data_stor[1][2] == 31) Data_stor[1][2]= 1;
			break;
		case 2:{
			if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30) Data_stor[1][2] = 1;  
					
			if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29) Data_stor[1][2] = 1;
			break;
		}		
		default :
			if (Data_stor[1][2] == 32) Data_stor[1][2] = 1;
			break;
	 }
/*闹钟*/
	Data_stor[2][0] = Data_stor[2][0]%24;    //小时
	Data_stor[2][1] = Data_stor[2][1]%60;    //分钟
	Data_stor[2][2] = Data_stor[2][2]%2;    //闹钟状态 1开,0关

}

/***************************************/
      /*时间处理函数函数*/
void time()
{   
	Data_stor[0][2] ++;
	if(Data_stor[0][2] == 60){  //一分
		Data_stor[0][1]++;
		Data_stor[0][2] = 0;
		if(alarm_run) alarm();


		if(Data_stor[0][1] ==60){ //一小时
			Data_stor[0][0]++;
			Data_stor[0][1]= 0;
		

			if(Data_stor[0][0] ==24){ //一天
				Data_stor[1][2]++;
				Data_stor[0][0] = 0;

				if(Data_stor[1][2] == 29||Data_stor[1][2] == 30||Data_stor[1][2] == 31||Data_stor[1][2] == 32)
					switch(Data_stor[1][1]){ //一月
						case 4: 
						case 6:
						case 9:
						case 11:
							if (Data_stor[1][2] == 31){
								Data_stor[1][1]++;
								Data_stor[1][2]= 1;
							}
						break;
						case 2:
							if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30){  
								Data_stor[1][1]++;
								Data_stor[1][2] = 1;
							}
							if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29){
								Data_stor[1][1]++;
								Data_stor[1][2]= 1;
							}
						break;
						default :
							if (Data_stor[1][2] == 32){
								Data_stor[1][1]++;
								Data_stor[1][2] = 1;
							}
						   break;
	   				 } 
						if (Data_stor[1][1] ==13){
							Data_stor[1][0]++;
							Data_stor[1][1] = 1;
	
							if (Data_stor[1][0] == 100) Data_stor[1][0] = 0;
						 
						
					}
			}
		}	
	}
}	

 /***************************************/
      /*秒表函数*/
void stop_watch()
{    
	Data_stor[3][2]++;
	if (Data_stor[3][2] == 100){ 
		Data_stor[3][1]++;
		Data_stor[3][2] = 0;


		if (Data_stor[3][1] == 60){
			Data_stor[3][0]++;
			Data_stor[3][1] = 0;
	

			if (Data_stor[3][0]==100){
			  alarm_ring  = 1;     //报警
      		  delay(250); 
			  delay(250); 
	  	   	  delay(250); 
			  delay(250); 
			  alarm_ring = 0;

			  Data_stor[3][0] = 0;
			}
		}
	}
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -