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

📄 cscj_timer0_2.c

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

uint c=0,flag=0,aa=0,b=0,csin;
uint s=0,cscj=34;//3.4mm/10us
 
/*******************************************
函数名称: 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--);
}
/*******************************************
函数名称: timer1()
功    能: 进入中断后让发光二极管点亮 
          检测是否收到超声波 
返回值  : 无
/********************************************/
/*void timer1()
{
  TCNT1H=0xff;//3c;
  TCNT1L=0xf6;//b0;
  aa++;
  if(aa>=10)
  {
    aa=0;
	s=0;
	//bb++;
	DDRB&=~BIT(PB4);
	TIMSK&=~0x04;
	delayms(10);
	DDRB|=BIT(PB4);
    TIMSK|=0x04;
  }
}*/
/*******************************************
函数名称: timer3()
功    能: 进入中断后让发光二极管点亮 
          检测是否收到超声波 
返回值  : 无
/********************************************/
void timer3()
{
  TCNT3H=0X43;
  TCNT3L=0Xf9;
  b++;
  if(b==5)
  {
    b=0;
	c=1;  
    flag=0; 
	ETIMSK&=~0x04;
  }
}
/*******************************************
函数名称: timer0_init()
功    能: 定时器0初始化  配置输出40khz占空比50%的方波
参    数: 无
返回值  : 无
/********************************************/
void timer0_init()
{
   DDRB&=~BIT(PB4);
   ASSR&=~BIT(3);
   TCCR0=0X19;
   OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
   TIMSK|=BIT(1);
}

/*******************************************
函数名称: timer1_init()
功    能: 定时器1初始化  用于测量距离以及控制超声波发射接收
参    数: 无
返回值  : 无
/********************************************/
void timer1_init()
{
    TCCR1B=0X02;
	TCNT1H=0x00;//0X3c;ff
    TCNT1L=0x00;//0Xb0;f6
	TIMSK&=~BIT(2);
	//SREG|=BIT(7);//问题在这 开全局中断时不能产生40khz 方波
}
/*******************************************
函数名称: timer3_init()
功    能: 定时器3初始化  用于测量距离以及控制超声波发射接收
参    数: 无
返回值  : 无
/********************************************/
void timer3_init()
{
  TCCR3B=0X02;
  TCNT3H=0X43;
  TCNT3L=0Xf9;
  ETIMSK|=0x04;
  SREG|=BIT(7);
}
void main()
{
   uint i,j;
   DDRA=0XFF;
   DDRD&=~BIT(2);
   PORTD|=BIT(2);
   PORTA=0X00;
   timer3_init();
   timer1_init();
   timer0_init();
   lcd12864_init();/* */
   line1 = "检测到障碍物";
   line2 = "  距离:";
   DDRB|=BIT(PB4);
   TIMSK|=0x04;
   while(1)
    { 
	
	    if(flag==1)
	   {
	    line1 = "检测到障碍物";
        line2 = "  距离:";
	    display();
		flag=0;
		PORTA=0X77;/**/
		write_com(0x94);
	    write_data((s%1000/100)+0x30);
	    write_data((s%100/10)+0x30);
	    write_data((s%10)+0x30);
		lcd_write("mm");
		delayms(500);
		PORTA=0X00;
		TCNT1L=0x00;
	    TCNT1H=0x00;
		DDRB|=BIT(PB4);
        TIMSK|=0x04;
	   }
	  //if(c==1)
	 // {
	   i=0;
	  // TCNT1L=0x00;
	  // TCNT1H=0x00;
	   //DDRB|=BIT(PB4);
     //  TIMSK|=0x04;
	   csin=PIND&BIT(2);
	   while(csin==BIT(2))
	     {
           if(++i>=8000)
		   break;
	     }
	   DDRB&=~BIT(PB4);
	   TIMSK&=~0x04;
	 //  TCNT3H=0X43;
    //   TCNT3L=0Xf9;
	//   ETIMSK|=0x04;
	   if(i<8000)
		 {
		   flag=1;
		   aa=TCNT1H*256+TCNT1L;
	       s=aa*cscj/20-100;
		   TCNT1L=0x00;
	       TCNT1H=0x00;
		 }
	//  }
	   if(i>=8000)
	     {
		   TCNT1L=0x00;
	       TCNT1H=0x00;
		   DDRB|=BIT(PB4);
           TIMSK|=0x04;
		 }
	  if(flag==0)
	   {
	      clear_dis();
		  s=0;
	   }
	}
}

⌨️ 快捷键说明

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