超声波模块实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

超声波模块编程控制

实验报告

院、系机械与电气工程学院

专业班级机械125班第五组

姓名李泉军同组人赵凯,徐思琪,郭明开,韦耀辰

实验日期2014 年11 月21 日

一、实验原理

通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。这与雷达测距原理相似。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2)

二、超声波工作原理简介

(1) 采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; 本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值

三、系统硬件电路图及实物照片

超声波测距电路图

显示距离10cm

四、系统软件程序流程图及程序清单

N

Y

Y Y

N

N

Y Y

程序清单:

//晶振9.6MHZ ,默认8分频,计时步距8/9.6=0.833333us #include #include]

‘开始

初始化IO 口,初始化中断(上升沿触发)

PB2口激活超声波模块

检测Echo 回响信号 INT0上升沿引发了中断? INT0下降引发了中断? 设为下降沿触发中断,打开定时器(64分频,普通模式) PB1是否为

高电平?

PB1是否为低电平? 设为上升沿触发中断,

关闭定时器,读取

TCNT0的值

TCNT0清零

计算距离(单位:厘米) 采用5161BS 数码管串联

显示两位数

unsigned int Dist=0;

unsigned char s;

unsigned char LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//////////////////延时函数//////////////////////

void delay_ms(unsigned int i)

{

int a,b;

for(a=0;a

{for(b=0;b<30;b++);}

}

//////////////////数码管显示函数 /////////////////////

void display_num(unsigned char num)

{ static unsigned char wei=0;

unsigned char num_l,num_r,i,n;

num_r = num%10; //取个位数字

num /= 10;

num_l = num%10; //取十位数字

if (wei)

num_r=LED[num_r];

else

num_r=LED[num_l];

if (wei)

{

num_r &= 0x7f; //十位数码管的位选角Q7清零

PORTB |= 0x08 ; //个位数码管的位选角PB3置一

}

else{

num_r |= 0x80; //十位数码管的位选角Q7置一

PORTB &= 0xf7; //个位数码管的位选角PB3清零

}

for (i=0;i<8;i++)

{

if (num_r & 0x80)

{

PORTB |= 0x01;

}

else

{

PORTB &= 0x0FE;

}

num_r = num_r << 1;

PORTB|=0x10; //时钟PB4置一

PORTB&=(~0x10); //时钟PB4清零

}

wei = !wei;

}

//////////////初始化程序 //////////////

void system_init()

{

DDRB=0xfd;

PORTB=0xfd; //PB1置一

SREG=0x80; //允许单片机的中断功能MCUCR=0x03; //上升沿触发

GIMSK=0x40; //INT0位置一,外部中断使能TCCR0A=0x00; //设置定时器工作模式

}

/**中断程序 **/

#pragma interrupt_handler time_0:2

void time_0()

{

if((PINB&0x02)!=0)

{

MCUCR=0x02; //设置引脚下降沿触发

TCCR0B=0x03; //开定时器

}

if((PINB&0x02)==0)

{

MCUCR=0x03; //设置引脚上升沿触发

TCCR0B=0x00; //关定时器

s=TCNT0; //读取定时器数据

TCNT0=0; //对定时器清零

}

Dist=s;

}

/**主程序**/

void main(void)

{

system_init();

while(1)

{

PORTB&=0xfb;

delay_ms(1); //延时25us

PORTB|=0x04;

delay_ms(1);

Dist=Dist;

display_num(Dist);

delay_ms(40); //延时25*40us=1000us}}

相关文档
最新文档