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

📄 t0mesure.c

📁 Cygnal公司的著名产品C8051f系列单片机
💻 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 + -