打印
[AVR单片机]

谁给编个AVR16L的超声波测距程序

[复制链接]
2480|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duilitao|  楼主 | 2013-5-26 22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
huangxz| | 2013-5-26 23:33 | 只看该作者
你自己啊;P

使用特权

评论回复
板凳
dirtwillfly| | 2013-5-27 20:58 | 只看该作者
网上很多超声波测距程序,找个移植下吧

使用特权

评论回复
地板
qin552011373| | 2013-5-27 22:25 | 只看该作者
huangxz 发表于 2013-5-26 23:33
你自己啊

这个伸手党好让人气愤

使用特权

评论回复
5
qin552011373| | 2013-5-27 22:25 | 只看该作者
dirtwillfly 发表于 2013-5-27 20:58
网上很多超声波测距程序,找个移植下吧

他是不花钱搞研发的

使用特权

评论回复
6
dirtwillfly| | 2013-5-27 22:34 | 只看该作者
qin552011373 发表于 2013-5-27 22:25
他是不花钱搞研发的

:lol我倒觉得楼主更像是衣来伸手饭来张口的学生党
;P

使用特权

评论回复
7
qin552011373| | 2013-5-27 22:37 | 只看该作者
dirtwillfly 发表于 2013-5-27 22:34
我倒觉得楼主更像是衣来伸手饭来张口的学生党

真像啊

使用特权

评论回复
8
d5252yh0307| | 2013-6-23 11:20 | 只看该作者
最近也在写这个程序。正在调试中....

使用特权

评论回复
9
035197_X| | 2013-7-24 17:04 | 只看该作者

使用特权

评论回复
10
aifang| | 2013-7-24 21:32 | 只看该作者
超声波其实挺简单的,发个脉冲就可以读了

给你个我自己写的吧   不是很完美



#include "HC_SR04_T1.h"

//变量区
static int Lvt = 0;    //低电平时间变量
static int Hvt = 0;    //高电平时间变量
static char V_Flag = 0;   //电平标志变量
static char S_Flag = 0;   //状态标志量:0 未运行,1 正在运行,2 运行超时


/*                超声波初始化函数
        超声波端口初始化,设置单片机与Trig口相连的引脚为
    输出;设置T1定时/计数器工作于输入捕捉方式,输入噪声
    抑制,触发沿为上升沿(用于捕捉超声波的上升沿),开定
    时/计数器,8分频。
*/
void HC_SR04_Init(void){
    Trig_DDR_1;
    Echo_DDR_0;
    Trig_PORT_0;
    Echo_PORT_1;
    TCCR1B = (1 << ICNC1)|(1 << ICES1)|(1 << CS11);
    TIMSK = (1 << TICIE1)|(1 << TOIE1);                 //输入捕捉中断,溢出中断
    TCNT1 = 0;
}
/*               超声波发射发射函数
        单片机控制超声波,用于超声波模块发射超声波。
*/
void HC_SR04_Send(void){
    SREG = 0x80;             //全局中断使能
    TIFR = ~(1 << ICF1)|(1 << TOV1);
    TCNT1 = 0;
    Trig_PORT_1;
    _delay_us(15);
    Trig_PORT_0;
    S_Flag = 1;              //模块正在运行
}
int HC_SR04_Juli(void){
    int Juli = 0;
    Juli = Hvt - Lvt;
    Juli = (int)Juli/5;     //距离的单位为毫米
    SREG = 0x00;             //关闭全局中断
    S_Flag = 0;              //模块停止运行
    return Juli;
}
int HC_SR04_State(void){
    char State;
    State = S_Flag;
    return State;
}
ISR(TIMER1_CAPT_vect){
    if(V_Flag == 0){
        Lvt = ICR1;
        TCCR1B &= ~(1 << ICES1);
        V_Flag = 1;                 //置位标志位,以使得下次输入捕捉中断中执行对下降沿处理的程序
    }
    else{//V_Flag == 1;
        Hvt = ICR1;
        TCCR1B |= (1 << ICES1);
        V_Flag = 0;                 //置位标清零,以使得下次输入捕捉中断中执行对上升沿处理的程序
    }
}
ISR(TIMER1_OVF_vect){
    S_Flag = 2;           //模块运行超时
}




接口如下

#define HC_SR04_DDR DDRD
#define HC_SR04_PORT PORTD
#define HC_SR04_PIN PIND

#define Trig 0
#define Echo 6

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝