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

📄 cscj_io.c

📁 超声测距c语言程序 利用定时器产生40khz站空比50 的方波 通过检测收到超声波的时间来测距
💻 C
字号:
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include "lcd12864.h"
#define  uchar unsigned char
#define  uint  unsigned int
#pragma interrupt_handler int2:4
#pragma interrupt_handler timer1:15

uchar flag=0,a=10,csin;
uint turn_flag=1,aa=0;
uint s=0,cscj=34;// cscj是超声的传播速度为  34mm/100us

/*******************************************
函数名称: delayus
功    能: 延时指定微秒(8.31M晶振)
参    数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值  : 无
/********************************************/
void delayus(uint us)		  
{
 uint i;
 us=us*13/10;		  	 //13/10是在8.31MHz晶振下,通过反复实验得到的数值
 for( i=0;i<us;i++); 
}

/*******************************************
函数名称: delay()
功    能: 8.31MHz晶振下延时 z ms 
参    数: z
返回值  : 无
/********************************************/
void delayms(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=1185;y>0;y--);
}
/*******************************************
函数名称: int0()
功    能: 进入中断后让发光二极管点亮 
          检测是否收到超声波 
返回值  : 无
/******************************************


void TIMER2_COMP()
{
   TCNT2=0Xa0;
}
*/

/*******************************************
函数名称: int0()
功    能: 进入中断后置标志位,表示收到超声波
          并计算距离 
返回值  : 无
/********************************************/
void int2()  
{
  DDRB&=~BIT(PB4);
  TIMSK&=~BIT(2);
  flag=1;
  s=aa*cscj/20-8;//距离计算公式  -8是校准后的数值
}

/*******************************************
函数名称: timer1()
功    能: 进入定时器中断后aa加1,用于距离的计算
返回值  : 无
/********************************************/
void timer1()
{
   TCNT1H=0xff;
   TCNT1L=0xac;
   aa++;
}

/*******************************************
函数名称: int2_init()
功    能: 外部中断2初始化
参    数: 无
返回值  : 无
/********************************************/
void int2_init() 
{
   DDRD&=~BIT(2); 
   PORTD|=BIT(2); //设置输出口上拉
   EICRA=0X20; 
   EIMSK|=BIT(2);
   SREG|=BIT(7);
}

/*******************************************
函数名称: timer0_init()
功    能: 定时器0初始化  配置输出40khz占空比50%的方波
参    数: 无
返回值  : 无
/********************************************/
void timer0_init()
{
   DDRB&=~BIT(PB4);//关闭发送超声  在下面和定时器1一起打开 可提高测距准确性
   ASSR&=~BIT(3);
   TCCR0=0X19;
   OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
}

/*******************************************
函数名称: timer1_init()
功    能: 定时器1初始化 用于测量距离
参    数: 无
返回值  : 无
/********************************************/
void timer1_init()
{
    TCCR1B=0X01;// 设置分频数为1  计数频率为8.31MHZ  
	TCNT1H=0xFF;//  设置计数初值  每一微秒进入定时器中断处理子函数 使aa加1
    TCNT1L=0xAC;
	TIMSK&=~BIT(2);//关闭定时器1  在下面和超声发射一起打开 可提高测距准确性
    SREG|=BIT(7);
}

/*******************************************
函数名称: timer2_init()
功    能: 定时器2初始化  配置输出周期为32ms 输出31.35hz方波
          占空比=OCR2/256
参    数: 无
返回值  : 无
/*******************************************
void timer2_init()
{
    DDRB|=0X80; //  设置PWM口(PB7)为输出
	TIMSK|=0X80;
	TCCR2=0X6d;//  设置OC2为快速PWM模式  设置时钟源为64分频
	TCNT2=0Xa0;
	OCR2=10;// 设置输出周期为32ms 输出31.35hz方波  占空比=OCR2/256
	//OCR1B=97;//设置占空比 输出50hzPWM
}*/
void main()
{
   uint i;
   DDRA=0XFF;
   PORTA=0X00;
   DDRD&=~BIT(2);//设置超声信号接收管脚为输入
   PORTD|=BIT(2);//设置输入口上拉
  // int2_init();
   timer0_init();
   timer1_init();
   //timer2_init();
   lcd12864_init();
   line1 = "检测到障碍物";
   line2 = "  距离:";
   delayms(100);
  // DDRB&=~0X80;
   DDRB|=BIT(PB4);
   TIMSK|=BIT(2);
   while(1)
   {
    if(flag==1)
	  { 
	    flag=0;
	    line1 = "检测到障碍物";
        line2 = "  距离:";
	    display();
		PORTA=0xcc;
		
		write_com(0x94);
	    write_data((s%1000/100)+0x30);
	    write_data((s%100/10)+0x30);
	    write_data((s%10)+0x30);
		lcd_write("mm");
		//OCR2=a;
		delayms(500);
		PORTA=0X00;
		aa=0;
		TCNT1H=0xff;//
        TCNT1L=0xac;//
		DDRB|=BIT(PB4);
        TIMSK|=BIT(2);
	  }
	 csin=PIND&BIT(2);
	 if(csin==0x00)
	 {
	    DDRB|=0X80;
		TIMSK&=~BIT(2);
		DDRB&=~BIT(PB4);
        flag=1;
		s=aa*cscj/20;
       /* if(turn_flag==1)
        {
         a++;
	     a++;
		// a++;
	    // a++;
	      if(a>=16)
	      {
	        a=10;
	        turn_flag=0;
	      }
        }
        else
        {
           a--;
	       a--;
		// a--;
	   //  a--;
	     if(a<=4)
	     {
	        a=10;
	        turn_flag=1;
	     }
        }
        delayms(50);*/
	 }
	if(flag==0)
	  {
	    clear_dis();
	    /*i++;
		delayms(10);
		if(i==40)
		{
		  i=0;
		  DDRB|=0X80;
		  OCR2=10;
		  delayms(300);
		  DDRB&=~0X80;
		}*/
	  }
   }
} 

⌨️ 快捷键说明

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