📄 t0mesure.c
字号:
///////////////T0 对/INT0输入信号脉宽测量/////////////////
//////////////////t0mesure.c/////////////////////////////////////////////
#include "c8051F040.h"
idata unsigned int interval0;
idata unsigned char t0flow=0;
idata unsigned char tempPage;
bit isnewdata;
void config(){
//采用config.exe配置向导
//-----看门狗禁止,以方便调试-----//
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
// 交叉开关配置 将/INT0输入管脚配到P0.0口 ,T0可不用配置//
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x04;
XBR2 = 0x40;
XBR3 = 0x00;
//系统时钟配置,采用内部晶振,8分频//
SFRPAGE = 0x0F;
CLKSEL = 0x00; // Oscillator Clock Selector
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x84; // Internal Oscillator Control Register
}
void t0ini(){
EA=0;
SFRPAGE=0x00;//这条指令很重要,否则以下操作无法写入相应寄存器,与MCS-51略有不同
TF0=0;
TR0=0;
IT0=1;// /INT0中断在电平下降沿触发
IE0=0;// 外部中断/INT0中断标志位清零,/INT0中断中可硬件清零
CKCON&=0xf0;
CKCON|=0x01;//T0时钟采用系统时钟4分频
TMOD&=0xf0;
TMOD|=0x08;//T0为模式0,13bit定时器模式,脉宽测量使能
TH0=0;
TL0=0xe0;//高3位在13bit模式下无效,不妨置1
ET0=1;//全页寻址,所以SFRPAGE不用指向其页址,开启T0中断
EX0=1;//允许/INT0外部事件中断
EA=1;//开启全局中断
}
void main(){
config();
t0ini();
while(1){
if(isnewdata){
//对测量值进行处理
isnewdata=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;
SFRPAGE=tempPage;
}
void t0_ISR() interrupt 1{//T0中断处理
TF0=0;
t0flow++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -