超声波模块实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
‘开始
初始化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}}