超声波测距程序,用了索尼的CX20106A 做解调,在PD2上输出40Khz的超声波。源码如下:
#include <mega16.h>
#include <delay.h>
#define WAVE PORTD.2//超声波发送引脚
bit over=0; //用于判断是否收到返回信号
uint time=0;//记录用了多久的时间(us)
bit mark=0; //标记超声波占用定时器
interrupt [EXT_INT1] void ext_int1_isr(void)
{
over=1; //结束接受
time+=TCNT2;//读取结果
TIMSK=0X00; //定时器关
GICR|=0x00; //外部中断1关
GIFR=0x80; //清除中断标志位
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(mark)//超声波占用
{
time+=256; //定时器累加
if(time>65000){time=0;TCNT2=0;}
}
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
  ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
/*------------超声波发送程序-----------
每次发送三个脉冲
---------------------------------------*/
void Sound_Wave(void)//超声波启动
{
uchar t;
DDRD.2=1;
PORTD.2=1;
mark=1; //标志置位
time=0; //高位清零
TCNT2=0X00;//计时器清零
TIMSK=0X40;//开启计时器2
for(t=0;t<3;t++)//发送三个超声波
{
WAVE=!WAVE;
delay_us(11);
}
WAVE=1;
GICR|=0x80;//外部中断1使能
}
void main(void)
{
uchar key,k;
long t=0;
PORTC=0XFF;
DDRC=0XFF;
TCCR2=0x02;//1Mhz 时钟
TCNT2=0x00;//初始化为零
GICR|=0x80;//外部中断1开
MCUCR=0x08;//下降沿触发
MCUCSR=0x00;
GIFR=0x80; //清除中断1标记位
TIMSK=0x40;
#asm("sei")
while(1)
{
display(t%10,5);delay_ms(2);
display((t/10)%10,4);delay_ms(2);
display((t/100)%10,3);delay_ms(2);
display((t/1000)%10,2);delay_ms(2);
display((t/10000)%10,1);delay_ms(2);
if(k==50){k=0;Sound_Wave();} //重新启动
if(over) //获得数据,并转换
{
t=(long)time*17/1000;
time=0;
over=0;
mark=0;
}
k++;
}
}
|