OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 10630|回复: 8

我的AVR资料[程序篇]超声波测距源码(源码25)

[复制链接]

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128161
金钱
128161
注册时间
2010-12-1
在线时间
1132 小时
发表于 2011-1-9 11:11:08 | 显示全部楼层 |阅读模式
正点原子公众号

超声波测距程序,用了索尼的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++;
    }
}  
 

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

  离线 

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-9-22 17:07:29 | 显示全部楼层
我想问一下,原子大哥的发射电路用的是什么样的啊。用非门搭的、LM386还是用MAX232啊
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128161
金钱
128161
注册时间
2010-12-1
在线时间
1132 小时
 楼主| 发表于 2012-9-22 23:13:28 | 显示全部楼层
回复【2楼】爱吃水煮鱼:
---------------------------------
忘了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128161
金钱
128161
注册时间
2010-12-1
在线时间
1132 小时
 楼主| 发表于 2012-9-22 23:13:48 | 显示全部楼层
CX20106A ,直接带发射功能吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-9-23 22:00:36 | 显示全部楼层
正点原子公众号
CX20106A一般都是用来放大接收到的信号的,发射一般不用这个吧。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128161
金钱
128161
注册时间
2010-12-1
在线时间
1132 小时
 楼主| 发表于 2012-9-23 23:46:20 | 显示全部楼层
回复【5楼】爱吃水煮鱼:
---------------------------------
那我可能记错了,呵呵,发射直接功率驱动就可以了吧?
貌似超声波驱动电压高一点,效果会好一些,记得当时还用了变压器...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

108

主题

1438

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2217
金钱
2217
注册时间
2012-4-30
在线时间
5 小时
发表于 2012-9-24 08:13:54 | 显示全部楼层
我以前做的是,发射用555芯片,输出接推挽电路(不接放大一下的话,测不了多远!),再接超声波发射头。
必须要用专门的超声波发射头,555芯片输出频率必须是40KHz左右,这样才可以和超声波探头内部产生共振,如果不产生共振,发射出来的能量太小。
回复 支持 反对

使用道具 举报

  离线 

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-9-24 22:21:08 | 显示全部楼层
回复【7楼】lsj9383:
---------------------------------
推挽电路是用非门搭的吗?有人用MAX232好像也能达到提升电压的效果。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-6-29
在线时间
9 小时
发表于 2018-3-1 14:00:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-20 17:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */