OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14191|回复: 8

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

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 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
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 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一般都是用来放大接收到的信号的,发射一般不用这个吧。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 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

主题

25

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 15:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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