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

📄 highspeedout.c

📁 C8051系列单片机开发与C语言编程!
💻 C
字号:
/////////PCA CEX0为高速输出模式//////////////
/////////PCA CEX4 捕捉模式 测试程序/////////
/////////HighSpeedOut.c//////////////////////////
#include <C8051F040.h>
#define CEX0PORT p00
#define TESTPORT p00
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sbit p07=P0^7;
sbit p00=P0^0;
bit iscex0H;
uchar temppage;
xdata ulong pcacap4[10];
uint cex0L,cex0H;
void delay1ms(uint time){//延迟1ms
	uint i;
	uint j;
	for (i=0;i<time;i++){
		for(j=0;j<300;j++);
	}
}	
void pca0ini(){//CEX0为高速输出模式
	SFRPAGE = 0x00;
	PCA0CPM0=0X4d;
}
void CEX0_out(uint h,uint l){
	cex0L=l;
	cex0H=h;
	CEX0PORT=1;//CEX0初始时刻输出为1
	iscex0H=1;
}
void CEX0_set(uint pram){//将PCA0CP0偏移pram个PCA时钟
	SFRPAGE = 0x00;
	PCA0CP0+=pram;
	PCA0CPM0|=0x40;//注意编译时sfr16寄存器先写高地址,再写低地址
	//所以编译结果使得最后写PCA0CPL0,将使得ECOM0清零,故加此句置1
}
void pca4ini(){//PCA CEX4配置为正负边沿均捕捉
	SFRPAGE=0x00;
	PCA0CPM4 = 0x31;    // 正负边沿触发模式,CEX4捕捉中断使能
 	PCA0CPL4 = 0x00;    
 	PCA0CPH4 = 0x00;    
}
void pcaini(){
	SFRPAGE=0x00;
	PCA0MD=0x09;//PCA采用系统时钟,且PCA溢出中断开启
	PCA0CN=0x40;//启动PCA计数器
	EIE1|=0x08;//PCA中断使能
}
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	SFRPAGE = 0x0F;
//交叉开关配置,CEX4配置在P0.4
	XBR0 = 0x30;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x00;   
//管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
 	SFRPAGE = 0x0F;
 	P0MDOUT = 0x00; 
 	P1MDIN = 0xFF;  
//晶振配置,采用内部晶振8分频
	SFRPAGE = 0x0F;
 	CLKSEL = 0x00;  
	OSCXCN = 0x00;	
	OSCICN = 0x84;	
}
void main(void){//测试时将P0.4与P0.0口相连
	xdata uint tmph,tmpl;
	config();
	pca0ini();
	EA=1;
	pcaini();
	pca4ini();
	p00=0;
	tmph=500;tmpl=2000;
	CEX0_out(tmph,tmpl);
	while(1){
		CEX0_out(tmph,tmpl);
		delay1ms(2000);
		tmph+=10;
		tmpl-=10;
		if(tmph>=2000){
			tmph=100;
			tmpl=400;
		}
	}
}
void PCA_ISR(void) interrupt 9  {
	static xdata  uchar num1=0,cfnum=0;
	static xdata uint tmpcnt=0;
	if(CF){
		cfnum++;
		CF=0;
	}
	if(CCF4){
		if(PCA0CP4<tmpcnt)
			cfnum--;
		pcacap4[num1]=PCA0CP4-tmpcnt;
		pcacap4[num1]+=65536L*cfnum;
		tmpcnt=PCA0CP4;
		if(!TESTPORT)
			pcacap4[num1]+=10000000L;
		num1++;
		cfnum=0;
		if(num1>=10){
			num1=0;
		}	
		CCF4=0;
	}
	if(CCF0){
		if(iscex0H){
			CEX0_set(cex0L);
			iscex0H=0;
			}
		else{
			CEX0_set(cex0H);
			iscex0H=1;
		}
		p07=iscex0H;
		CCF0=0;
	}
  }	

⌨️ 快捷键说明

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