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

📄 timer.c

📁 一个流量控制仪器的源码
💻 C
字号:
/************************************************************************************/
/* G7000 V3 定时器													*/
/* MCU 型号: Philips P89C668														*/
/* 时钟频率: 11.0592 MHz	6 CLOCK														    */
/* 开发环境: Keil C51 V7.06a															*/
/* 开发日期: 2003.08.23													        	*/
/* 程序编写: BaoFang  鲍方															*/
/* 系统版本: V3.00																	*/
/************************************************************************************/

#include <REG668.H>
#include <Timer.H>
#include <P89C668.H>
#include <G7000.H>
#include <Display.H>
#include <BitOp.H>


#define uchar unsigned char

//内部参数!
//定义计时器参数0.01秒   11.0592MHz  12周期
	
//#define TIME_SET1 	0xDC   
//#define TIME_SET2 	0x00

//内部参数!
//定义计时器参数0.01秒   11.0592MHz  6周期
	
#define TIME_SET1 	0xB8   
#define TIME_SET2 	0x00


//外部变量设置
extern idata uchar	ucSystemTurnNum;   //TurnControl.C  系统时段

//显示刷新计时
bit	bDisplayFlashTimeEnd;
bit	bDisplayFlashEnable;
idata uchar	uc2_DisplayFlashTime[2] = {0,25};

//时段计时
bit	bTurnTimeSortState;
bit	bTurnTimeEnd;
bit	bTurnTimeEnable;
idata uchar	uc5_TurnTime [5]={0,0,0,0,0};

//内部毫秒定时器
idata uchar ucMsec = 0;

//时段秒计数器标志
idata uchar ucTurnSecT = 0;

//LED显示刷新
bit	bDisplayLEDEnable;  //LED刷新允许标志
bit	bDisplayGlint;      //内部闪烁显示标志
idata uchar ucDisplayLED01_08Buf;     //LED01显示缓冲区
idata uchar ucDisplayLED01_08Glint;  //LED01闪烁缓冲区

//其它显示
idata uchar ucCON03_Buf;	//CON03输出缓冲区



/*******************************************************************
		设置某位LED的显示、闪烁属性
函数原型: void fnSet_DisplayLED(uchar ucDisplayLEDTempNum,uchar ucDisplayLEDTempBuf, 
		uchar ucDisplayLEDTempGlint);
功能: 	设置某位LED的显示、闪烁属性
参数:		uchar ucDisplayLEDTempNum		LED序号  1-8
		uchar ucDisplayLEDTempBuf		LED显示属性
		uchar ucDisplayLEDTempGlint		LED闪烁属性

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

void fnSet_DisplayLED(uchar ucDisplayLEDTempNum,uchar ucDisplayLEDTempBuf, 
		uchar ucDisplayLEDTempGlint)
{
	
	if(ucDisplayLEDTempBuf == 1)
		ucDisplayLED01_08Buf = fnBitSet(ucDisplayLED01_08Buf , ucDisplayLEDTempNum-1);
	else
		ucDisplayLED01_08Buf = fnBitClr(ucDisplayLED01_08Buf , ucDisplayLEDTempNum-1);
		
	if(ucDisplayLEDTempGlint == 1)
		ucDisplayLED01_08Glint = fnBitSet(ucDisplayLED01_08Glint , ucDisplayLEDTempNum-1);
	else
		ucDisplayLED01_08Glint = fnBitClr(ucDisplayLED01_08Glint , ucDisplayLEDTempNum-1);
}


/*******************************************************************
		设置全LED设置
函数原型: Void fnSet_DiskplayLEDALL(uchar ucDisplayLEDTempBuf, uchar ucDisplayLEDTempGlint);
功能: 	设置全LED设置
参数:
		uchar ucDisplayLEDTempBuf		LED显示属性
		uchar ucDisplayLEDTempGlint		LED闪烁属性

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

void fnSet_DisplayLEDALL(uchar ucDisplayLEDTempBuf, uchar ucDisplayLEDTempGlint)
{
	if(ucDisplayLEDTempBuf == 1)
		ucDisplayLED01_08Buf = 0xFF;
	else
		ucDisplayLED01_08Buf = 0;
		
	if(ucDisplayLEDTempGlint == 1)
		ucDisplayLED01_08Glint = 0xFF;
	else
		ucDisplayLED01_08Glint = 0;

}


/*******************************************************************
		初始化定时器0
函数原型: void  fnInit_Time0()
功能: 	初始化定时器0,并且初始化所有定时器相关的变量,所有内部定时器停止运行。
********************************************************************/

void  fnInit_Time0()
{
        timer0_16bit;
        
        TH0=TIME_SET1;
	TL0=TIME_SET2;


        //显示刷新计时初始化
        bDisplayFlashTimeEnd = 1;
        bDisplayFlashEnable = 0;
       
        //时段计时初始化
	bTurnTimeSortState = 0;        //倒计时
        bTurnTimeEnd = 1;
        bTurnTimeEnable = 0;

        //内部秒定时器初始化
        ucMsec = 0;

        //LED显示刷新
        DisplayLED_Enable;
        bDisplayGlint = 0;                      //显示1
        //ucDisplayLED01_08Buf = 0;               //LED1-8设置为暗
        //ucDisplayLED01_08Glint = 0xFF;          //LED1-8设置为不闪烁
        fnSet_DisplayLEDALL(0,1);
        
        //其它显示初始化
	ucCON03_Buf = B0011_0000;

        //开Time0中断
        timer0_int_enable;      //time0中断使能
        enable();               //总中断使能

}


/*******************************************************************
		定时器0的中断函数
函数原型: void INT_Timer0(void)  interrupt 1 using 1
功能: 	定时器0的中断函数,包含系统内部定时相关
********************************************************************/

void INT_Timer0(void)  interrupt 1 using 1
{
	TH0=TIME_SET1;
	TL0=TIME_SET2;
	
	//内部毫秒定时器

	ucMsec--;
	
	if(ucMsec == 0xff)
	{
		ucMsec = 19;

                //LED显示刷新
                if(bDisplayLEDEnable)
                {
                        if(bDisplayGlint)
                        {
                        	//显示2
                        	LED01 = ucDisplayLED01_08Buf & ucDisplayLED01_08Glint;

                                bDisplayGlint = 0;
                        	
                        }
                        else
                        {
                         	//显示1
                        	LED01 = ucDisplayLED01_08Buf;
                         	
                                bDisplayGlint = 1;
                        }
                }
	}
	

	
	//显示刷新计时器
	//当 bDisplayFlashEnable=1 允许刷新
	//且 bDisplayFlashTimeEnd=0 计时还未结束时 
	//可以计时 
	
	if(bDisplayFlashEnable && (!bDisplayFlashTimeEnd))
	{
		uc2_DisplayFlashTime[1]--;
		
		if(uc2_DisplayFlashTime[1] == 0xff)
		{
			//秒
			uc2_DisplayFlashTime[1] = 99;
			uc2_DisplayFlashTime[0]--;
			
			if(uc2_DisplayFlashTime[0] == 0xff)
			{
				bDisplayFlashTimeEnd = 1;	//显示刷新计时结束,停止计时
			}
		}
	}
	
	//时段计时器
        //当 bTurnTimeSortState=0 倒计时
	//当 bTurnTimeEnable=1 时段计时允许
	//且 bTurnTimeEnd=0 时段计时没有结束 
	//可以计时 
	
	if(bTurnTimeEnable && (!bTurnTimeEnd))
	{
        	if( bTurnTimeSortState == 0 )
		{
        	        //倒计时
			uc5_TurnTime[4]--;
			
			if(uc5_TurnTime[4] == 0xff)
			{
				//秒
				uc5_TurnTime[4] = 99;
				uc5_TurnTime[3]--;
				
				//时段秒计数器标志 刷新
				ucTurnSecT = 0xFF;
				
				if(uc5_TurnTime[3] == 0xff)
				{
					//分钟
					uc5_TurnTime[3] = 59;
					uc5_TurnTime[2]--;
					
					if(uc5_TurnTime[2] == 0xff)
					{
						//小时
						uc5_TurnTime[2] = 59;
						uc5_TurnTime[1]--;
						
						if(uc5_TurnTime[1] == 0xff)
						{
							//百小时
							uc5_TurnTime[1] = 99;
							uc5_TurnTime[0]--;
							
							if(uc5_TurnTime[0] == 0xff)
							{
								bTurnTimeEnd = 1;	//时段计时没有结束,停止计时
							}
						}						
					}		
				}
			}
		}
        	else
        	{
        		//正计时
			uc5_TurnTime[4]++;
			
			if(uc5_TurnTime[4] == 100)
			{
				//秒
				uc5_TurnTime[4] = 0;
				uc5_TurnTime[3]++;

				//时段秒计数器标志 刷新
				ucTurnSecT = 0xFF;
								
				if(uc5_TurnTime[3] == 60)
				{
					//分钟
					uc5_TurnTime[3] = 0;
					uc5_TurnTime[2]++;
					
					if(uc5_TurnTime[2] == 60)
					{
						//小时
						uc5_TurnTime[2] = 0;
						uc5_TurnTime[1]++;
						
						if(uc5_TurnTime[1] == 100)
						{
							//百小时
							uc5_TurnTime[1] = 0;
							uc5_TurnTime[0]++;
							
							if(uc5_TurnTime[0] == 100)
							{
								//时段正计时没有结束
								//bTurnTimeEnd = 1;	
								uc5_TurnTime[0] = 0;
							}
						}						
					}		
				}
			}
        	}
	}
        

}



//***************************显示刷新计时***************************


/*******************************************************************
		设置显示刷新计时函数
函数原型: void	fnSet_DisplayFlashTime(uchar ucSec);
功能: 	设置显示刷新计时
********************************************************************/

void	fnSet_DisplayFlashTime(uchar ucSec)
{
        uc2_DisplayFlashTime[0] = 0;
        uc2_DisplayFlashTime[1] = ucSec;
}



/*******************************************************************
		开始显示刷新计时函数
函数原型: void 	fnStart_ DisplayFlashTime();
功能: 	开始显示刷新计时
********************************************************************/

void 	fnStart_DisplayFlashTime()
{
        bDisplayFlashTimeEnd = 0;
        bDisplayFlashEnable = 1;
}



/*******************************************************************
		暂停显示刷新计时函数
函数原型: void	fnStop_ DisplayFlashTime();
功能: 	暂停显示刷新计时
********************************************************************/

void	fnStop_DisplayFlashTime()
{
        bDisplayFlashEnable = 0;
}



/*******************************************************************
		判断显示刷新结束
函数原型: bit	fnIfEnd_ DisplayFlashTime();
功能: 	判断显示刷新结束
********************************************************************/

bit	fnIfEnd_DisplayFlashTime()
{
        return(bDisplayFlashTimeEnd);
}


//***************************时段计时*******************************


/*******************************************************************
		设置时段计时函数
函数原型: void	fnSet_TurnTime (uchar uc4_SetTime[4],bit bTimeSortStateTemp);
功能: 	设置时段计时
	bit bTimeSortStateTemp
	0	倒计时
	1	正计时
********************************************************************/

void	fnSet_TurnTime (uchar uc4_SetTime[4],bit bTimeSortStateTemp)
{
        
	bTurnTimeSortState = bTimeSortStateTemp;		
        uc5_TurnTime[0] = uc4_SetTime[0];
        uc5_TurnTime[1] = uc4_SetTime[1];
        uc5_TurnTime[2] = uc4_SetTime[2];
        uc5_TurnTime[3] = uc4_SetTime[3];
        uc5_TurnTime[4] = 0;                

}


/*******************************************************************
		开始时段计时函数
函数原型: void 	fnStart_ TurnTime();
功能: 	开始时段计时
********************************************************************/

void 	fnStart_TurnTime()
{
        bTurnTimeEnd = 0;
        bTurnTimeEnable = 1;
}


/*******************************************************************
		暂停时段计时函数
函数原型: void	fnStop_TurnTime();
功能: 	暂停时段计时
********************************************************************/

void	fnStop_TurnTime()
{
        bTurnTimeEnable = 0;
}



/*******************************************************************
		判断时段结束
函数原型: bit	fnIfEnd_TurnTime();
功能: 	判断时段结束
        1:结束。
        0:没有结束。
********************************************************************/

bit	fnIfEnd_TurnTime()
{
        return(bTurnTimeEnd);
}



⌨️ 快捷键说明

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