蓝桥杯单片机使用PCA进行超声波测距

前言

蓝桥杯单片机定时器的资源是非常紧张的,只有三个,定时器0,1,2;用来超声波测距的话要用到溢出标志位,而定时器2又没有溢出标志位,当比赛中一考察到频率加串口加超声波测距,那么三个定时器就不够用了,这时我们可以用PCA对超声波测距进行处理。

一、PCA是什么?

PCA是指16位定时器/计数器模块(Programmable Counter Array)。PCA可以在多种工作模式下工作,包括:
捕获模式:可以捕获外部输入的脉冲,并测量脉冲的频率或占空比。
比较模式:可以设置比较值,当计数器计数到设定的值时,可以产生中断或外部信号。
PWM模式:可以产生占空比可调的PWM波形信号,在驱动直流电机、灯光调节等应用中非常常用。
单边模式:可以用作单边计数器,在计算脉冲时非常有用。
双边模式:可以用作双向计数器,可以计算输入脉冲的上升沿和下降沿。
根据不同的应用需求,可以选择不同的工作模式,以实现目标功能。

可以看到,PCA实质上也就是一个定时器,也就具备超声波测距的一个能力。
注意:reg52头文件中未定义PCA,使用的话就需要使用stc15f2k60s2的头文件

二、使用步骤

首先,我们查看手册,寻找PCA工作所需的寄存器:
在这里插入图片描述
在这里插入图片描述
查看手册之后就可以对寄存器定义了,我们让其工作在系统频率的12分频之下,即CPS2=0,CPS1=0,CPS0=0;再让CIDL=0,让PCA在空闲模式下继续工作。所以我们让CMOD&=0x00就行了。
还有一个CCON寄存器(PCA控制寄存器),内部包含CF(溢出标志位);CR(PCA计数器控制位),也就是用来启动PCA计数的位;还有CCF(PCA模块中断标志),此处未用到。由于该寄存器是一个可位寻址寄存器,在实际使用的时候对其位寻址更方便去操作。

固定部分代码如下:

#include <STC15F2K60S2.H>
sbit TX=P1^0;   //定义发送端
sbit RX=P1^1;   //定义接收端
unsigned int dis;      //距离数据
void Delay12us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}
void Send_Wave()  //产生一个40Khz方波
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		TX=1;
		Delay12us();
		TX=0;
		Delay12us();
	}
}

使用起来跟定时器大同小异,一样的工作流程:

unsigned int Get_Csb()
{
	unsigned int dis;
	CMOD&=0x00;   //定义工作模式
	CH=0;      //计数高八位
	CL=0;      //计数低八位
	Send_Wave();  //发送40Khz波
	CR=1;     //开始计时
	while((RX==1)&&(CF==0));//等待接收端接收到返回信号或者溢出
	CR=0; //关闭计时
	if(CF==0) //如果未超出测量范围,进行数据处理
	{
		dis=CH;
		dis=(dis<<8)|CL;
		dis=((dis/10)*17)/100+3;
	}
	else  //如果超出测量范围,溢出标志位会硬件置一,我们需要在此软件清零
	{
	    CF=0;  //溢出标志位清零
		dis=999;
	}
	return  dis;
}

获取数据只需要函数值返回给变量就行了

dis=Get_Csb()

总结

本文仅仅简单介绍了PCA在超声波测距中的使用的使用。这可以使我们在比赛中节省一个定时器,还是非常好用的。小伙伴们不用担心记不住,代码不是用来硬记的,只要理解了整个一个流程,理解了它的运作方式,那么写起来自然就水到渠成了。

  • 15
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值