搜索
bottom↓
回复: 3

求助:AVR 超声波测距的问题,用的srf04,一直显示恒定距离……帮忙看看程序!谢谢了

[复制链接]

出0入0汤圆

发表于 2009-8-15 11:20:41 | 显示全部楼层 |阅读模式
小弟用的是MEGA128,PB0口是输出Trig,PB1口是输入Echo,麻烦看下,感觉是 计数器 的问题,就是调不出……
#include<iom128v.h>
#include<macros.h >
#define uchar unsigned char
#define uint unsigned int
#include"1602.h"

uint get_srf04(void);
uchar wz[]={"Distance is:"};
uchar gd[]={"        cm  "};

void main(void)
{
uint range,distance,range1,range2,range3;

        DDRB = 0xfd;                                // RB0 (trig) is output       
        PORTB = 0xfe;
               
        DDRA=0xff;
        PORTA=0xff;
        DDRG=0xff;
        PORTG=0xff;
        LcdInit();
        WriteChar(2,1,12,wz);                          
        WriteChar(1,1,12,gd);      
               
        while(1)
            {                                                                // loop forever
                range = get_srf04();                        // get range from srf04 (round trip flight time in 0.5uS units)
                     distance=range/116;
               
                range1=distance/100;
                range2=(distance-range1*100)/100;
                range3=distance-range1*100-range2*10;
               
          range1+=0x30;
          range2+=0x30;
          range3+=0x30;
          WriteNum(1,5,(range1));
          WriteNum(1,6,(range2));
          WriteNum(1,7,(range3));
               
                TCNT1H=0;                                // 52mS delay - this is so that the SRF04 ranging is not too rapid
                TCNT1L=0;       
                SREG|=BIT(7);                        // and the previous pulse has faded away before we start the next one
                TCCR1B = 0x02;
                TIMSK|=BIT(2);                                                        // 1:8 prescale and running
                TIFR=0;                         //置零
                while(!TIFR);                                                // wait for delay time
                TIMSK&=~BIT(2);                                                        // stop timer       
        }
}

uint get_srf04(void)
{   
   uchar key;
        TCNT1H = 0xff;                                                // 产生10um的开始脉冲  prepare timer for 10uS pulse
        TCNT1L = 0xEB;
        TCCR1B = 0x02;
        TIMSK|=BIT(2);                                                // 1:8 prescale and running
           TIFR=0;                                                                 // TOV1
        PORTB|=BIT(0);                                                        // start trigger pulse
        while(!TIFR);                                        // wait 10uS
        PORTB&=~BIT(0);                                                // end trigger pulse
        TIMSK&=~BIT(2);                                                        // stop timer
               
        TCNT1H = 0;                                                        // prepare timer to measure echo pulse
        TCNT1L = 0;
        TCCR1B = 0x02;                                        // 1:8 prescale but not running yet
        TIFR=0;
       
        PORTB|=BIT(1);
        key=PINB;
        key&=0x02;                       //看返回的高电平长度
        while(!key& !TIFR);                // wait for echo pulse to start (go high)
        TIMSK|=BIT(2);                                                                // start timer to measure pulse
        while( key& !TIFR);                        // wait for echo pulse to stop (go low)
        TIMSK&=~BIT(2);                                                        // stop timer
        return (TCNT1H<<8)+TCNT1L;                // TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

以下是用的 SRF04 资料:

点击此处下载 ourdev_471040.pdf(文件大小:130K) (原文件名:SRF04-tech.pdf)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-8-18 20:41:15 | 显示全部楼层
首先说一下,我对AVR不是很精通,说你的问题之处,如果不对的话请指出来哈:


我觉得:第一;你没有开总中断。
        第二:开了总中断的话可能你测的距离已经大于最大时间,while(!key& !TIFR); while( key& !TIFR); 只要中断到了他们都会退出来。所以测的时间可能不对。
        第三:我不知道TCNT1H<<8)+TCNT1L;是什么意思,楼主想测时间的话为什么不这样:在中断的时候设一个变量,每一个中断让其加一。到最后就是  多少次*中断时间+(65535-计时器里面的值),这样不好吗?
  呵呵,本人纯属菜鸟,在此提出问题,还望楼主解答

出0入0汤圆

发表于 2011-8-4 11:51:42 | 显示全部楼层
我也在写,呵呵,望交流

出0入0汤圆

发表于 2013-1-13 10:20:29 | 显示全部楼层
LZ 不知道还在不在 最后问题解决了没有啊 我现在也遇到了相同的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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