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

📄 csb_test.c

📁 一个倒车雷达的程序 使用的是AVR单片机。 在include.h文件里面定义 #define CPU_F 4 //4MHZ 定义外晶振的频率 #define GOOD //40K
💻 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 + -