📄 t0_int0_func.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 + -