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

📄 source1.c

📁 这是我在学校做电子钟留下的资料 希望能给你带来帮助
💻 C
字号:
#include <hearder.h>

/*************
  函数名称: void T2Init (void )
  创建如期: 2008。6。8
  功能描述: 定时器初始化
  入口参数: uT2Reg:  定时器初始化
  返回植: 无
   修改日志:
   ********************/
   void T2Init(uint uT2Reg)
   {
   		TMOD = 0X11; //计数器T1, T0定时方式1
		to_jishu_chuzhi = uT2Reg;
		TL1 = (uT2Reg&0X00FF);
		TH1 = (uT2Reg>>8);
		TR1 = 1;   //启动定时器
		ET1 = 1;    //T1开中断
		EA = 1;
   }
       



/****************************************************
* 入口参数:ucSL[],uint usST[]:音乐频率的数组
* 返回值: 无
* 修改日志:
*****************************************************/

void MusicPlay(uchar ucSL[],uint uST[])
{
  uchar i=0;
  while((ucSL[i]!=0)||(uST[i]!=0))
  {
    T2Init(0xffff-uST[i]*((float)11059/(float)12000));  //11。0592M的晶体
	g_ucSoundLongCNT=(( MODERAT0*ucSL[i]*1000)/8)/uST[i];
	while(g_ucSoundLongCNT!=0)//等待计数器为0
	{;}
	TR1=0;         //暂时善意定时器
	i++;
  }
}

/***********************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.7.11
* 功能描述:用于音乐的音调半周期定时
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/


void TOISR(void)interrupt 3
{
 //uchar i;
 TL1=to_jishu_chuzhi&0x00ff;
 TH1=to_jishu_chuzhi >> 8;
 sound = ~sound;
 if((g_ucSoundLongCNT)!=0)
  {
    g_ucSoundLongCNT--;
  }
}
/***********************************************
* 函数名称:void sysinit()
* 创建日期:2008.6
* 功能描述:定时器1初始化
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void sysinit()
{
 	TMOD = 0x01;//采用方式1
	TH0 = -5000 / 256;
	TL0 = -5000 % 256;
	TR0 = 1;
	ET0 = 1;
	PT0 = 1; //设置定时器优先级T0>T1
	PT1 = 0;
	EA = 1;
}

/***********************************************
* 函数名称: void nowsbuf()
* 创建日期:2005.5
* 功能描述:刷新显示缓冲区
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void nowsbuf()
{

		 	sbuf[0] = minute % 10;
			sbuf[1] = (minute / 10) % 6;
			sbuf[2] = hour % 10;
			sbuf[3] = (hour / 10) % 3;

	
}
/***********************************************
* 函数名称: void buttontest()
* 创建日期:2005.5
* 功能描述:按键检测
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void buttontest()
{
 	if (nowyouxiaostatue < lastyouxiaostatue)
	{
	 	 if (s1 == 0)
		 {
		  	now = 1;
			s1buttoncount  = (s1buttoncount + 1) % 5; 
			switch (s1buttoncount)
			{
				case 0:	
						bitshangshuocontrol = 0xff;
						if (timercontrolsbuf == 1)
						{
							timercontrolsbuf = 0;	//取消恢复标志
							timertime = hour*100 + minute; //设定定时
							seconds = backseconds;	//恢复正常时间			
							minute = backminute;
							hour = backhour;
							bellcontrol = 1;//设置定时
				
						}
						now = 0;
						break;
				case 1:
						bitshangshuocontrol = 0xee; //第一位闪烁
						break;
				case 2:
						bitshangshuocontrol = 0xde;	  //第二位闪烁
						break;
				case 3:
						bitshangshuocontrol = 0xbe;	  //第三位闪烁
						break;
				case 4:
						bitshangshuocontrol = 0x7e;	  //第四位闪烁
						break;
			 			 			 			 
			}

			while (s1 == 0)
			{
			 	if (timercontrol == 1)	 //进入定时
				{
					
					timercontrol = 0;
				 	timercontrolsbuf = 1; //设置恢复标志
					backhour = hour;	  //记录当前时间
					backminute = minute;
					backseconds = seconds;
					hour = timertime / 100;	  //显示当前定时
					minute = timertime % 100;
					bellcontrol = 0;	 //取消响铃
					s1buttoncount = 1;	 //从第一位改定时
		//			bitshangshuocontrol = 0xee;
					 			
				
				}
		
			}
			   			
		 }
		if (s1buttoncount == 1)	
		{
			bitshangshuocontrol = 0xee;		//从第一位改定时
		}
		if (now == 1 && s2 == 0)
		{
			switch (s1buttoncount)
			{

				case 1:
						minute = (minute + 1) % 60; //分加一
						break;
				case 2:
						minute = (minute + 10) % 60;  //分加十
						break;
				case 3:
						hour = (hour + 1) % 24;   //时加一
						break;
				case 4:							  //时加十的处理
						if (hour > 13)
						{
						   hour = hour - 10;
						}
						else
						{
							hour = (hour+ 10) % 24;
						}
						break;
			 			 			 			 
			}
			while (s2 == 0) ; 
		 		
		}
	if (now == 1 && s3 == 0)
		{
			switch (s1buttoncount)
			{

				case 1:
						
						sbuf[0] = sbuf[0]  == 0? 9 : sbuf[0] - 1 ;	 //第一位减1

						break;
				case 2:
						sbuf[1] = sbuf[1] == 0? 5 : sbuf[1] - 1;	//第二位减一
						break;
				case 3:
						if (sbuf[2] == 0 && sbuf[3] < 2)			//第三位减一
						{
						 	sbuf[2] = 9;
						}
						else
						{
						 	if (sbuf[2] == 0 && sbuf[3] == 2)
							{
							 	sbuf[2] = 3;
							}
							else
							{
							 	sbuf[2] = sbuf[2] - 1;
							}
						}
					//	sbuf[2] = sbuf[2]  == 0? 9 : sbuf[2] - 1 ;
						break;
				case 4:
						if (sbuf[3] == 0)						//第四位减一
						{
						 	if (sbuf[2]<4)
							{
						 		sbuf[3] = 2;
							}
							else
							{
							 	sbuf[3] = 1;	
							}

						}
						else
						{
							sbuf[3] = sbuf[3] - 1;
						}
						
				//		sbuf[3] = sbuf[3] == 0 && sbuf[2]<4? 2 : sbuf[3] - 1;
						break;
			 			 			 			 
			}
			minute = sbuf[0] + sbuf[1]*10;		//刷新时间
			hour = sbuf[2] + sbuf[3]*10;
		 	while (s3 == 0)	 ;
		}				 
		 
	}
}
/***********************************************
* 函数名称: void timer0() interrupt 1
* 创建日期:2005.5
* 功能描述: 定时器1处理
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/
void timer0() interrupt 1
{
	TH0 = -5000 / 256;	  //恢复定时
	TL0 = -5000 % 256;
	nowstatue = 0x0e & bit_control;	  //取得按键状态
	if (nowstatue == laststatue)	 //成立时为有效状态
	{
	 	nowyouxiaostatue = nowstatue;	
	}
	laststatue = nowstatue; 	  //状态记录前移
	count--;
	timercount--;
	if (timercount == 0)   //成立时取按键1的状态
	{
		timercount = 400;
		s1nowshow = s1;
		if (s1lastshow == 0 && s1nowshow == 0)	// 按键1两次状态为低
		{
			s1lastshow = 1;	  // 恢复初植
			s1nowshow  = 1;	  
		 	timercontrol = 1;	//允许进入定时
		}
		s1lastshow = s1nowshow;	 //状态前移
	}
	

	
	
	shangshuopinnv--;  
	if (shangshuopinnv == 0) //成立时修改shangshuocontrol实现闪烁
	{
		shangshuopinnv = 100;
		shangshuocontrol = ~shangshuocontrol;
	}
	if (count == 0)	 //成立时一秒到达
	{
	 	count = 200;
		if (now == 0)
		{
			seconds = (seconds + 1) % 60;
			if (seconds == 0)
			{
			 	minute = (minute + 1) % 60;	
				if (minute == 0)
				{
				 	hour = (hour + 1) % 24;
				}
			} 
			
	 	}
	} 
	seg_control = 0xff;	 //消除影印	
/*
	if (bitshangshuocontrol == bit_code[nowbitno]) //判断是否闪烁
	{
	 	bit_control	= ((bit_code[nowbitno] | shangshuocontrol) | 0x0e) & 0xfe;	//闪烁显示
	}
	else
	{
		bit_control	= bit_code[nowbitno];	//位显示
	}
 */					 
	if (bellcontrol == 1 && timertime == hour * 100 + minute) //响铃时保证正常显示
	{
	  nowsbuf();
	}
	bit_control	= ((bit_code[nowbitno] | (shangshuocontrol & (~bitshangshuocontrol)))| 0x0e) & 0xfe; //一步到位
	seg_control = seg_code[sbuf[nowbitno]];//段显示

  	nowbitno = (nowbitno + 1) % 4; 	//位移动
	
}
/***********************************************
* 函数名称: void belltest()
* 创建日期:2005.5
* 功能描述:定时判断
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/

void belltest()
{
 	if (bellcontrol == 1 && timertime == hour * 100 + minute)	//成立时响铃
	{	 

	 	MusicPlay(SOUNDLONG1, SOUNDTONE1);
		bellcontrol = 0; //保证只响一次
	}
}
/***********************************************
* 函数名称: void main()
* 创建日期:2005.5
* 功能描述:主程序
* 入口参数:无
* 返回值: 无
* 修改日志:
************************************************/

void main()
{
 	sysinit();
	while (1) 
	{
	 	nowsbuf();
		buttontest();
		belltest();
	}
}

⌨️ 快捷键说明

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