定时计数器中断服务程序流程图;
C语言及讲解:
● 0号定时器设置子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名: SetTimer0
// 功能说明: 配置定时计数器0
// 入口参数: 工作方式
// 定时计数模式
// 控制方式选择
// 第一初值
// 第二初值
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char SetTimer0(char mode, char tc,char ctrl,int value0,int value1)
{
switch(mode) //工件方式设置
{
case 0: //工作方式0
TMOD = (TMOD & 0xF0) | 0x00;
TH0 = value0 >> 0x05;
TL0 = value0 << 0x03;
break;
case 1: //工作方式1
TMOD = (TMOD & 0xF0) | 0x01;
TH0 = value0 >> 0x08;
TL0 = value0 ;
break;
case 2: //工作方式2
TMOD = (TMOD & 0xF0) | 0x02;
TH0 = value0 ;
TL0 = value0 ;
break;
case 3: //工作方式3
TMOD = (TMOD & 0xF0) | 0x03;
TH0 = value0;
TL0 = value1;
break;
default:
return 0;
}
switch(tc) //定时计数器模式
{
case 0: //定时器
TMOD |= 0x00;
break;
case 1: //计数器
TMOD |= 0x04;
break;
default:
return 0;
}
switch(ctrl) //启动模式
{
case 0: //TR0控制启动
TMOD |= 0x00;
break;
case 1: //引脚/INT0控制启动
TMOD |= 0x08;
break;
default:
return 0;
}
return 1;
}
● 打开0号定时器子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名: OpenTimer0
// 功能说明: 打开定时计数器0
// 入口参数: 工作方式
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char OpenTimer0(char mode)
{
switch(mode) //工件方式设置
{
case 0: //工作方式0
ET0 = 1;
EA = 1;
TR0 = 1;
break;
case 1: //工作方式1
ET0 = 1;
EA = 1;
TR0 = 1;
break;
case 2: //工作方式2
ET0 = 1;
EA = 1;
TR0 = 1;
break;
case 3: //工作方式3
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
break;
default:
return 0;
}
return 1;
}
● 1号定时器设置子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名: SetTimer1
// 功能说明: 配置定时计数器1
// 入口参数: 工作方式
// 定时计数模式
// 控制方式选择
// 第一初值
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char SetTimer1(char mode, char tc,char ctrl,int value0)
{
switch(mode) //工件方式设置
{
case 0: //工作方式0
TMOD = (TMOD & 0x0F) | 0x00;
TH0 = value0 >> 0x05;
TL0 = value0 << 0x03;
break;
case 1: //工作方式1
TMOD = (TMOD & 0x0F) | 0x10;
TH0 = value0 >> 0x08;
TL0 = value0 ;
break;
case 2: //工作方式2
TMOD = (TMOD & 0x0F) | 0x20;
TH0 = value0 ;
TL0 = value0 ;
break;
default:
return 0;
}
switch(tc) //定时计数器模式
{
case 0: //定时器
TMOD |= 0x00;
break;
case 1: //计数器
TMOD |= 0x40;
break;
default:
return 0;
}
switch(ctrl) //启动模式
{
case 0: //TR0控制启动
TMOD |= 0x00;
break;
case 1: //引脚/INT0控制启动
TMOD |= 0x80;
break;
default:
return 0;
}
return 1;
}
● 打开1号定时器子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名: OpenTimer1
// 功能说明: 打开定时计数器1
// 入口参数: 工作方式
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char OpenTimer1(char mode)
{
switch(mode) //工件方式设置
{ case 0: //工作方式0
ET1 = 1;
EA = 1;
TR0 = 1;
break;
case 1: //工作方式1
ET1 = 1;
EA = 1;
TR0 = 1;
break;
case 2: //工作方式2
ET1 = 1;
EA = 1;
TR0 = 1;
break;
default:
return 0;
}
return 1;
}
51单片机内部有两个16位定时/计数器,在作为定时器使用时,与软件定时相比,可以实现比较精确的定时时间,利用这一特点,51可以实现对低频信号的数据采集,脉宽调制以及其他多种功能。 |