📄 csb_test.c
字号:
/**********************/
/* 发射40KHZ脉冲模块 */
/**********************/
#include "include.h"
void send_ch(uchar ch)
{
if(ch==0) {PORTB_Bit3=0;PORTB_Bit4=1;}//S4
if(ch==1) {PORTB_Bit1=0;PORTB_Bit2=1;}//S3
if(ch==2) {PORTD_Bit7=0;PORTB_Bit0=1;}//S2
if(ch==3) {PORTD_Bit5=0;PORTD_Bit6=1;}//S1
}
/******以下为了得到优化后更准的40KHZ中心频率*******/
void change_0(void)
{
for(uchar k=0;k<send_count;k++)
{
PORTB_Bit3=~PORTB_Bit3;
PORTB_Bit4=~PORTB_Bit4;
delayus(7);
}
}
void change_1(void)
{
for(uchar k=0;k<send_count;k++)
{
PORTB_Bit1=~PORTB_Bit1;
PORTB_Bit2=~PORTB_Bit2;
delayus(7);
}
}
void change_2(void)
{
for(uchar k=0;k<send_count;k++)
{
PORTD_Bit7=~PORTD_Bit7;
PORTB_Bit0=~PORTB_Bit0;
delayus(7);
}
}
void change_3(void)
{
for(uchar k=0;k<send_count;k++)
{
PORTD_Bit5=~PORTD_Bit5;
PORTD_Bit6=~PORTD_Bit6;
delayus(7);
}
}
/******************/
/* 停止发送40K脉冲 */
/******************/
void stop_send(void)
{
PORTD &= 0x1F;
PORTB &= 0XE0;
}
/**********************/
/* 发射与接收 */
/**********************/
uchar send_and_incept(uchar ch)
{
uchar counter=0;//counter1=0;
// uchar non_temp1=0,non_temp2=0,non_temp3=0;
uchar i=0,count_n=0;
uchar d1=0,d2=0;
CLI();
send_ch(ch);
delayus(3400);
switch(ch)
{
case 0:change_0();break;
case 1:change_1();break;
case 2:change_2();break;
case 3:change_3();break;
default: break;
}
delayus(10);
stop_send();
SEI();
TCNT1_count=7;
TCCR1B =0x01;
while(TCNT1_count<34); //超过1.8ms余振的处理
/*
while(!(PINC&(1<<ch))&&(TCNT1_count<50))//==1 ,再往下走 ,==0等高电平来
{
if(TCNT1_count>48) counter1=1;//若在这里大于48时就是有障碍物 0
}
*/
loop: while((PINC&(1<<ch))&&(TCNT1_count<252));
if(!(PINC&(1<<ch))&&(TCNT1_count<252))
{
d1=TCNT1_count;
while(!(PINC&(1<<ch))&&(TCNT1_count<252));
d2=TCNT1_count;
d2=d2-d1;//取两次的间距(低电平)
i=1;
if(d1<60){ i=0; }
if(d2>=i)
{
if(count_n==0) counter=d1;//temp=d2;}//第一次进来
count_n++;goto loop;
}
else { count_n++; goto loop;}
}
TCCR1B =0x00;
/*
if(((non_temp1==2)&&(non_temp2==2)) // 说明余振长
||((non_temp2==2)&&(non_temp3==2))
||((non_temp1==2)&&(non_temp3==2)))
{
counter=0;
}//余振过长也显示距离
*/
if(count_n==0) counter=252; //正常, 并没有障碍物
else if(count_n>10) counter=0; // 正常, 有近障碍物
// if(counter1==1) counter=0; //波形一开始就是低电平, 那为0
if(counter)
{
#ifdef GOOD
#ifdef DIS150CM//1.5M有效
if(counter<50) return(0);
if(counter<60) return(3);
if(counter<70) return(4);
if(counter<79) return(5);
if(counter<89) return(6);
if(counter<99) return(7);
if(counter<108) return(8);
if(counter<118) return(9);
if(counter<128) return(10);
if(counter<138) return(11);
if(counter<148) return(12);
if(counter<158) return(13);
if(counter<168) return(14);
if(counter<178) return(15);
if(counter>=178) counter=26;
/*
if(counter<35) return(0);
if(counter<37) return(3);
if(counter<40) return(4);
if(counter<50) return(5);
if(counter<60) return(6);
if(counter<69) return(7);
if(counter<77) return(8);
if(counter<83) return(9);
if(counter<93) return(10);
if(counter<102) return(11);
if(counter<109) return(12);
if(counter<118) return(13);
if(counter<127) return(14);
if(counter<135) return(15);
if(counter>=135) counter=26;
*/
#else//2.5M有效
if(counter<35) return(0);
if(counter<39) return(3);
if(counter<46) return(4);
if(counter<56) return(5);
if(counter<66) return(6);
if(counter<75) return(7);
if(counter<84) return(8);
if(counter<93) return(9);
if(counter<101) return(10);
if(counter<110) return(11);
if(counter<121) return(12);
if(counter<131) return(13);
if(counter<141) return(14);
if(counter<151) return(15);
if(counter<161) return(16);
if(counter<171) return(17);
if(counter<181) return(18);
if(counter<191) return(19);
if(counter<201) return(20);
if(counter<211) return(21);
if(counter<221) return(22);
if(counter<231) return(23);
if(counter<241) return(24);
if(counter<251) return(25);
if(counter>=251) counter=26;
#endif
#else
if(counter<50) return(0);
if(counter<180) counter=(counter/10)-2;
if(counter>180) counter=26;
#endif
}
return(counter);
}
/*
一阶滞后滤波法
为加快程序处理速度假定基数为100,a=0~100
*/
/*
uchar get_main(uchar ch)
{
for(uchar k=0;k<2;k++)
{
uchar new_value;
new_value=send_and_incept(ch);
old_value = (1-a)*old_value + a*new_value;
delayms(5);
}
return old_value;
}
*/
/**********************/
/* 测量 返回距离 */
/**********************/
uchar csb_main(void)
{
uchar temp0,temp1,temp2,n;
loop2:
temp0=255;
for(uchar ch=0;ch<4;ch++)
{
data_8[ch]=send_and_incept(ch);
delayms(12);
if(temp0>data_8[ch]) { temp0=data_8[ch]; }
}
min_data[2]=min_data[1];//3
min_data[1]=min_data[0];//2
min_data[0]=temp0;/*1、新数据采样*/
temp0=min_data[0];
temp1=min_data[1];
temp2=min_data[2];
if((temp0==temp1)||(temp0==temp2))return(min_data[0]);/*2、新数据和二次采样数据,相等直接确认*/
if((temp0==(temp1-1))||(temp0==(temp1+1)))return(min_data[0]);/*3、新数据和二次采样数据,在合法范围直接确认*/
n++;
WDR();
if(n<10)goto loop2;
return(0);/*返回最小距离*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -