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

📄 ultra_sonci.c

📁 c8051f 例程
💻 C
字号:
/////////PCA CEX0为高速输出模式//////////////
/////////PCA CEX4 捕捉模式 测试程序/////////
/////////HighSpeedOut.c//////////////////////////
#include "mylcd.h"
#include "stdio.h"
#define ADJRATE 0.0111
extern bit isline0;
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;
enum {mesure_len=5};
uchar temppage;
xdata ulong pcacap4[mesure_len];
xdata uint compensate;
void pca0ini(){//CEX0为高速输出模式,作为超声波控制信号输出
	SFRPAGE = 0x00;
	PCA0CPM0=0X4c;//CEX0中断禁止
}
void CEX0_set(uint pram){//超声波逻辑门延时补偿
	SFRPAGE = 0x00;
	PCA0CP0=~pram+1;
	PCA0CPM0|=0x40;//注意编译时sfr16寄存器先写高地址,再写低地址
	/*所以编译结果使得最后写PCA0CPL0,将使得ECOM0清零,故加此句置1,否则输出电平翻转不生效*/
}
void pca4ini(){//PCA CEX4配置为正边沿捕捉
	SFRPAGE=0x00;
	PCA0CPM4 = 0x21;    // 正边沿触发模式,CEX4捕捉中断使能
 	PCA0CPL4 = 0x00;    
 	PCA0CPH4 = 0x00;    
}
void pca1ini(){//PCA CEX1配置为正负边沿均捕捉
	SFRPAGE=0x00;
	PCA0CPM1 = 0x21;    // 正边沿触发模式,CEX1捕捉中断使能
 	PCA0CPL1 = 0x00;    
 	PCA0CPH1 = 0x00;    
}
void pcaini(){
	SFRPAGE=0x00;
	PCA0MD=0x08;//PCA采用系统时钟,且PCA溢出中断开启
	PCA0CN=0x40;//启动PCA计数器
	EIE1|=0x08;//PCA中断使能
}
void dispini(){	//lcd显示初始化
	delay1ms(100);
	SFRPAGE=0xf;
	lcdcs=0;         
	lcdrs=1;
	lcdrw=1;
	delay1ms(30);
	sendc(0x38);//8位,2行,5*7字体
	delay1ms(100);
	sendc(0x0c);//显示开,光标关;不闪
	delay1ms(100);
	sendc(0x06);//增量方式,现不移动
	delay1ms(100);
	sendc(0x01);//清屏
	delay1ms(100);
}
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
	SFRPAGE = 0x0F;
//交叉开关配置,CEX0-CEX05配置在P0.0-P0.5
	XBR0 = 0x30;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x00;   
//管脚输出配置,P0口为开漏输出,其中P0.0接上拉电阻,驱动超声波控制信号
 	SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
//晶振配置,采用内部晶振8分频
	SFRPAGE = 0x0F;
 	CLKSEL = 0x00;  
	OSCXCN = 0x00;	
	OSCICN = 0x84;	
}
void main(void){
	uchar i;
	xdata float disval;
	xdata ulong temp;
	config();
	dispini();
	pca0ini();
	EA=1;
	pcaini();
	pca4ini();
	pca1ini();
	CEX0_set(4);//设置补偿时间
	isline0=1;
	printf("\nULTRA_SONIC V1.0");
	while(1){
		for(i=0,temp=0;i<mesure_len;i++)
			temp+=pcacap4[i];
		temp/=mesure_len;
		temp>>=1;
		/*所测得的是往返程时间,故要除2得到单程时间,注意不能写成temp/=2,可写成temp/=2L*/
		disval=(float)temp*ADJRATE;
		isline0=0;
		printf("\ndisval=%.1fcm",disval);
		delay1ms(500);
	}
}
void PCA_ISR(void) interrupt 9  {
	static xdata  uchar num1=0;
	if(CCF4){
		pcacap4[num1]=PCA0CP4;
		num1++;
		if(num1>=mesure_len){
			num1=0;
		}	
		CCF4=0;
	}
	if(CCF1){
		compensate=PCA0CP1;
		CCF1=0;
	}
}	

⌨️ 快捷键说明

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