📄 startcount.c
字号:
/*===============================================================*/
/*函数名称: startCount.c */
/*函数功能: 对frenum个脉冲进行计时 */
/*入口参数: val-----------------------------------所计的脉冲数目*/
/*函数说明: T4被配置在P0.0口上面,加外部脉冲时最好加个3 k的上拉电阻
*/
/*修改记录: 无修改记录 */
/*编写作者: t483-4-19chenyong */
/*编写日期: 2007-4-06 */
/*===============================================================*/
#include "common.h"
#include "delay.h"
#define fre_factor 73728
#define frenum 10 //设定的脉冲数
extern ulong freTime;
uchar tf2num,temp_page;
extern bit isnewdata;
bit isfilter;
ulong freTime; //所用时间
uchar h=0;
/*================================================================*/
/*开始计时 */
/*================================================================*/
void startCount(uint val)
{
// T4_Setvalue(1);
// while(!isfilter); //等待上升沿的到来
T4_Setvalue(val); //设定要计数的脉冲个数
T4RUN;
tf2num=0;
T2_Start();
isnewdata=0;
}
/*================================================================*/
/*计数器初始化说明: 计数器工作在自动重载模式下,采用系统时钟12分频
中断益处时需要软件对标志位清0,但是不能位寻址,只
能进行字操作.计数时,不需时钟设置.
C/T2(计数模式)--------------------------------1
CP/RL4(自动重载)------------------------------0
*/
/*================================================================*/
void T4_Initial() //T4为计数模式
{
temp_page=SFRPAGE;
SFRPAGE=0x02;
TMR4CF=0x00;
TMR4CN=0x02;
SFRPAGE=0x00;
//CT4=1,T4为计数器模式,下降沿触发加1
EIE2|=0X04; //T4中断使能
SFRPAGE=temp_page;
}
/*================================================================*/
/*定时器2初始化说明:定时器2工作在自动重载模式下,采用系统时钟12分频
中断益处时需要软件对标志位清0,
C/T2(定时器模式)-----------------------------0
CP/RL2(自动重载)-----------------------------0
T2M(系统时钟12分频)--------------------------0
*/
/*================================================================*/
void T2_Initial() //t2为定时器模式,采用系统时钟12分频
{
temp_page=SFRPAGE;
SFRPAGE=0x00;
TMR2CN=0x00;
TMR2CF=0x00;
RCAP2=0x0000;
TMR2=0x0000; //定时初始化
SFRPAGE=0x00;
IE|=0X20; //T2中断使能
SFRPAGE=temp_page;
}
/*================================================================*/
/*定时器2开始工作 */
/*================================================================*/
void T2_Start()
{
temp_page=SFRPAGE;
SFRPAGE=0x00;
TMR2=0x0000;
TF2=0;
TR2=1; //启动定时器
SFRPAGE=temp_page;
}
/*================================================================*/
/*设置计数器要计的脉冲数 */
/*================================================================*/
void T4_Setvalue(uint val)
{
temp_page=SFRPAGE;
SFRPAGE = 0x02;
RCAP4=(~val+1);
TMR4=RCAP4; //装载初始值
SFRPAGE=temp_page;
}
/*================================================================*/
/*计数器初始化 */
/*================================================================*/
void Count_Initial(void)
{
T2_Initial(); //定时器2初始化
T4_Initial(); //定时器4初始化
EA=1; //打开所有中断
delay_nus(10);
startCount(frenum); //开始数脉冲
isnewdata=0;
}
/*================================================================*/
/*读计数器的值 */
/*================================================================*/
float Read_Number(void)
{
float t3frequency[10],sum=0;
float average_frequncy=0,temp; //所测频率值
float return_value;
unsigned char n=0;
if (isfilter)
{
temp = (float)fre_factor/freTime;
temp = (float)temp*100;
t3frequency[h++] = (float)temp*100;
Port_Initial(); //端口初始化
Count_Initial();
delay_nms(100);
startCount(frenum);
if(h>=10)
//可以设置断点观测频率值
{
h=0;
for(n=0;n<10;n++)
{
sum+=t3frequency[n];
}
sum = sum-t3frequency[0];
return_value=(float)sum/9;
}
//结束if
}
return(return_value);
}
void T4_Service() interrupt 16
{
//frenum个频率计满,产生T4中断
temp_page=SFRPAGE;
SFRPAGE=0x00;
TR2=0;
freTime=TMR2; //计算所用时间
SFRPAGE = 0x02;
TR4=0; //关闭计数器
TF4=0;
isfilter=1;
freTime+=65536L*tf2num-34; //需要加上T2的溢出时间
// freTime=freTime*0.344140206;
//0.3441402此数据为经验值,对50个数据处理的结果
SFRPAGE=temp_page;
}
/*================================================================*/
/*中断服务函数 */
/*================================================================*/
void T2_Service() interrupt 5
{ //T2定时溢出处理
temp_page=SFRPAGE;
SFRPAGE=0x00;
TF2=0;
tf2num++;
SFRPAGE=temp_page;
}
/*=============================end=================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -