📄 timer.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 + -