资讯详情

比较简单的AVR单片机超声波测距的实例

于调试检查及使用在不同场合。测量范围10cm-250cm,测距小于100cm时,误差是1~2cm.,大于 100cm时,误差是3~5cm。SL-SRF-25超声波 ,还可以指定从单片机I/O端口上输出分段距离检测信号,可以直接装在双龙SL系列机器人上,作为寻物、避障探测等应用。LED 显示所测分段距离范围信号,可以用于机器人控制。

短路插针 1-2/-3脚功能接地;JD1-1接PC5;短路块插于2,3间,使用LED 显示;短路块插于1,2间,使用LED发光二极管显示,或超声波传感器输出分段控制信号。超声波传感器输出分段控制信号对应J1引脚: 1、J1-1—PD0避障距离范围5~9cm 2:J1-2—PD1避障距离范围10~19cm 3:J1-3—PD2避障距离范围20~29cm 4:J1-4—PD3避障距离范围30~39cm 5:J1-5—PD4避障距离范围40~49cm 6:J1-6—PD5避障距离范围50~99cm 7:J1-7—PD6避障距离范围100~179cm 8:J1-8—PD7避障距离范围180~250cm SLSRF-25电原理图

SL-SRF-25超声波测距源程序: /********************************************************************* Project:超声波测距 Chiptype:AT 8 Clockfrequency:8.000000MHz *********************************************************************/ #include<iom8v.h> #include<macros.h> #pragmainterrupt_handlerintt0:10//T0溢出中断 #pragmainterrupt_handlericp_timer1:6//T1捕捉中断 #pragmadata:code//设定数据区为程序存储器 constunsignedchartab1[]={0X28,0XEE,0X32,0XA2,0XE4, 0XA1,0X21,0XEA,0X20,0XA0};//七段译码字型表(lm,cm) constunsignedchartab2[]={0X08,0XCE,0X12,0X82,0XC4, 0X81,0X01,0XCA,0X00,0X80};//七段译码字型表(m) #pragmadata:data//设定数据区回到数据存储器 unsignedcharledbuff[]={0X08,0X28,0X28};//显示缓冲区 unsignedcharcount; unsignedcharnewcount; unsignedcharoldcount; voidintt0(void)//T0中断定时程序,定时58US,即测距1CM. { TC 0=0XC6; count++; } voidicp_timer1(void)//ICP1捕捉中断,捕捉频率38.5~41.6 { if(96<=ICR1<=104) { SREG&=0X7f; newcount=count-13; ICR1=0; TCNT1=0; TCCR1B=0X81; } } voiddelay_1us(void)//1us { asm("nop"); } voiddelay_us(unsignedintt)//tus { unsignedinti=0; for(i=0;i<t;i++) delay_1us(); } voiddelay_1ms(void)//1ms { unsignedinti; for(i=1;i<1142;i++); } voiddelay_ms(unsignedchart) { unsignedchari=0; for(i=0;i<t;i++) { delay_1ms(); } } voidsend40kHz(void)//发射40KHz超声波 { count=0; TIMSK&=0XDF;//禁止ICP1使能 OCR2=0X64; TCCR2=0X19; } voidclose40kHz(void)//停止发射超声波 { TCCR2=0X00; } voidhextobcd(unsignedcharm)//将count十六进制数据转换为LED七段码 { unsignedchartemp; temp=m%10; ledbuff[0]=tab1[temp];//mm位 m=m/10; temp=m%10; ledbuff[1]=tab1[temp];//lm位 temp=m/10; ledbuff[2]=tab2[temp];//m位 } voiddisplay3led(void)//数码管显示 { unsignedchari; for(i=0;i<3;i++) { PORTD=ledbuff[i]; PORTC=~(1<<i);//PC0-mm位,PC1-lm位,PC2-m位 delay_1ms(); PORTC=(1<<i); } } voiddisplay8led(void)//8LED显示 { if(newcount<10) PORTD=0XFE; elseif(newcount<20) PORTD=0XFD; elseif(newcount<30) PORTD=0XFB; elseif(newcount<40) PORTD=0XF7; elseif(newcount<50) PORTD=0XEF; elseif(newcount<100) PORTD=0XDF; elseif(newcount<180) PORTD=0XBF; else PORTD=0X7F; } voidmcu_init(void)// 初始化 { D=0XFF; PORTD=0XFF; DDRC=0XDF;//PC5为输入 PORTC=0XFF; DDRB=0XFE; PORTB=0XF7; TCNT2=0X00; TCNT0=0XC6;//T0定时58US TCCR0=0X02;//T0定时器1/8分频 TCNT1=0X00; TCCR1A=0X00; TCCR1B=0X81;//输入捕获噪音抑制允许,ICP1下降沿触发,系统时钟 TIMSK=0X01;//使能T0定时溢出 } voidmain(void) { unsignedchari; mcu_init(); for(;;) { send40kHz(); SREG|=0X80; delay_us(50); close40kHz(); delay_us(20); TIMSK=0X21; if(!(PINC&0X20))//如果插上JD1短路块,则数码管显示距离 { if(newcount!=oldcount) oldcount=newcount; hextobcd(oldcount); for(i=0;i<20;i++) display3led(); } else { PORTC=0XFF; display8led(); delay_ms(100); } } } 双龙SL-SRF-25超声波避障程序—51单片机 /***********************************************************************/ /* 广州双龙电子 WWW.SL.COM.CN 功能: 超声波避障,避障距离为10cm;前进遇障后退左转弯. 接线方法: 52板P1.0(用短线)接超声波传感器J1-1(J1插针的第一脚) 注意: 用户可以根据自已的避障距离,把52板P1.0脚连接到超声波传感器的相应脚 以下是避障距离范围情况: 1:J1-1避障距离范围5~9cm 2:J1-2避障距离范围10~19cm 3:J1-3避障距离范围20~29cm 4:J1-4避障距离范围30~39cm 5:J1-5避障距离范围40~49cm 6:J1-6避障距离范围50~99cm 7:J1-7避障距离范围100~179cm 8:J1-8避障距离范围180~250cm Chiptype:AT89S52 Clockfrequency:24MHz */ /************************************************************************/ #include"reg52.h" sbitP1_0=P1^0;//定义避障距离检测脚 voiddelay_1ms(void)//1毫秒延时程序 { unsignedcharj=0,i=8; do { while(--j); } while(--i); } voiddelay(unsignedchari)//毫秒级延时程序 { while(i--) delay_1ms(); } voidforward(void)//LED4~5亮,前进 { P0=0XE7; P3=0x50; } voidleft(void)//LED1~3亮,左转 { P0=0XF8; P3=0x60; } voidback(void)//LED全亮,后退 { P0=0; P3=0XA0; } voidinit(void)//端口初始化 { P1|=0X01;//要读取P1.0,就先写1 P0=255;//8LED全不亮 P3=0; } /*********************************************************************** 主函数 ***********************************************************************/ voidmain(void) { init();//系统初始化 while(1)//循环 { if(!P1_0)//如果在避障范围,则后退,左转弯 { back(); delay(200);//后退200毫秒 left(); delay(200);//左转90度. } else { forward(); delay(200); } } } -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台