原标题:c51:测脉冲周期
/*函数功能:测量
测量参数
t1:脉冲起始时间,
t2:脉冲结束时间
counter:TF2溢出计数
测量标志
fstart:开始测量标志,初始fstart=0,,测得t1,fstart=1。测得t1、t2,fstart=0.
fenable:允许测量标志,fenable=1表示允许测量。
初始fenable=1;
当测得t1,t2时,fenable=0,不允许测量。
当t1、t2数据处理结束,fenable=1,允许测量。
fready:测量数据准备好标志
初始fready=0;
当测得t1、t2,fready=1.
当t1、t2数据处理完成,fready=0,
*/
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
//声明T2初始化程序
void init_timer2();
//声明变量初始化程序
void init_variable();
//声明数据处理函数
void process();
//设置变量,
uchar bdata flag; //标志
sbit fstart=flag^0;
sbit fenable=flag^1;
sbit fready=flag^2;
//设置计数器
uchar counter;
//缓存,存放脉冲起始、终止计数
uint buf1,buf2;
//定义捕获寄存器
16 RCAP2=0xca;
//脉冲周期
uint pulse;
void main()
{
init_timer2();
init_variable();
while(1)
{
if(fready==1)
{
process();
fready=0;
fenable=1;
counter=0;
}
}
}
void init_timer2()
{
//设T2初值
TL2=0;
TH2=0;
//T2捕获方式,EXEN2=1,TR2=1,CP/RL2=1
T2CON=0x0D;
//开中断
EA=1;
ET2=1;
}
void init_variable()
{
//初始化变量
flag=0;
buf1=0;
buf2=0;
counter=0;
fenable=1;
fstart=0;
fready=0;
}
//数据处理
void process()
{
pulse=counter*65536+buf2-buf1;
}
//T2 中断程序
void timer2() 5
{
//处理TF2标志
if(TF2==1)
{
TF2=0;
if(fstart==1) counter++;
}
//处理EXF2标志
if(EXF2==1)
{
EXF2=0;
if(fenable==1)
{
if(fstart==0)
{
buf1=RCAP2;
fstart=1;
}
else
{
buf2=RCAP2;
fenable=0;
fready=1;
fstart=0;
}
}
}
}
责任编辑: