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

📄 startcount.c

📁 电子设计训练课题
💻 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 + -