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

📄 t0_int0_func.c

📁 c8051f020中 T0 对/INT0外部输入信号脉宽测量
💻 C
字号:
///////////////T0 对/INT0输入信号脉宽测量/////////////////
//////////////////t0mesure.c/////////////////////////////////////////////
#include "c8051F020.h"
idata unsigned long interval0;
idata unsigned long t0flow=0;
xdata unsigned long detect_temp=0,detect_avg=0;
unsigned int i=0;
unsigned int j;
#define   LEN 20
xdata unsigned long detect_result[LEN];//存放检测数据,为LEN个数据,因为需要测量周期较大的波形,所以用长无符号整形
//idata unsigned char tempPage;
bit isnewdata;
void config()
{
//采用config.exe配置向导
//-----看门狗禁止,以方便调试-----//
	WDTCN = 0x07;	
 	WDTCN = 0xDE;   
  	WDTCN = 0xAD;
 //  	交叉开关配置	将/INT0输入管脚配到P0.0口	,T0可不用配置// 	
	XBR0 = 0x00;	
	XBR1 = 0x04;	    //INT0E=1(b2)=1,INT0链接到端口引脚
	XBR2 = 0x40;	  
//系统时钟配置,采用内部晶振//
	OSCXCN = 0x00;	// EXTERNAL Oscillator Control Register	
    OSCICN = 0x87;	// Internal Oscillator Control Register
                    //b7=1,使能时钟丢失检测器(时钟丢失时间大于100ms将触发复位),
	                //CLKSL(b3)=0,选择内部晶振,IOSCEN(B2)=1,内部振荡器使能
					//IFCN1-0(B1-0)=11,内部振荡器典型频率为16MHz(实测频率为17.239MHz)
					//(2MHz实际检测为2.1562166MHz)
					//即每个时钟为0.4637753us
    P0MDOUT = 0x00; 
}
void t0ini()
{
	EA=0;
	TF0=0; //TF0:定时器溢出标志位
	TR0=1; //定时器允许控制位:0禁止;1允许
	IT0=1;// /INT0中断在电平下降沿触发,0为低电平有效触发
	IE0=0;// 外部中断/INT0中断标志位清零,/INT0中断中可硬件清零
	CKCON=0x08;//	CKCON:时钟控制寄存器,T4M T2M T1M T0M(b6-3):0001(0为相应的定时器使用系统时钟的12分频)
	            //1为使用系统时钟
	TMOD=0x08;//当TR0=1且GATE0(b3)=1,C/T0(b2)=0为定时器功能(记录由CKCON.3定义的时钟加1)
	          //  选择为T0为模式0(b1-0)=00,13bit定时器模式

	TH0=0;
    TL0=0xe0;//高3位在13bit模式下无效,不妨置1
	ET0=1;//开启T0中断
	EX0=1;//允许/INT0外部事件中断
	EA=1;//开启全局中断
}
void main()
{   bit flag;
	config();
	t0ini();
	while(1)
	{
		if(isnewdata)//对测量值进行处理
		{   detect_result[i]=interval0;
            i++;
			if(i>LEN-1)//在此设断点,观察程序运行结果
			{i=0;
			  flag=1;
			  detect_temp=0;
			  detect_avg=0;
			 }
           	isnewdata=0;
         			  
		}
        if(flag==1)
		 {for(j=0;j<=LEN-1;j++)
		  detect_temp+=detect_result[j];
		  detect_avg=detect_temp/LEN;
          flag=0;
		  }
	}
}
void int0_ISR() interrupt 0
{//外部事件中断处理
    interval0=TH0<<5;//13bit 定时器,所以要左移5位
	interval0+=TL0&0x1f;
	interval0+=t0flow<<13;//加上T0溢出次数的处理,这样T0便能测量长周期的事件宽度
	t0flow=0;//需将溢出值复位,否则多次测量后会把溢出值累加
	TH0=0;
	TL0=0;
	TR0=1;
	isnewdata=1;
}

void t0_ISR() interrupt 1
{//T0中断处理
	TF0=0;
	t0flow++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -