网上收集到的一款比较简单的AVR单片机超声波测距的实例
这款SL-SRF-25超声波传感器,是多网络是收集的,SL-SRF-25超声波传感器由3位LED数码管显示障碍物距离, 3位LED数码管采用积木式插装方式,便于调试检查及使用在不同场合。测量范围10cm-250cm,测距小于100cm时,误差是1~2cm.,大于100cm时,误差是3~5cm。SL-SRF-25超声波传感器,还可以指定从单片机I/O端口上输出分段距离检测信号,可以直接装在双龙SL系列机器人上,作为寻物、避障探测等应用。LED发光二极管显示所测分段距离范围信号,可以用于机器人控制。
短路插针JD1-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 : 超声波测距
- Chip type : ATMEGA8
- Clock frequency: 8.000000MHz
- *********************************************************************/
- #include
- #include
- #pragma interrupt_handler intt0:10 //T0溢出中断
- #pragma interrupt_handler icp_timer1:6 //T1捕捉中断
- #pragma data:code //设定数据区为程序存储器
- const unsigned char tab1[]={0X28,0XEE,0X32,0XA2,0XE4,
- 0XA1,0X21,0XEA,0X20,0XA0};//七段译码字型表(lm,cm)
- const unsigned char tab2[]={0X08,0XCE,0X12,0X82,0XC4,
- 0X81,0X01,0XCA,0X00,0X80};//七段译码字型表(m)
- #pragma data:data //设定数据区回到数据存储器
- unsigned char ledbuff[]={0X08,0X28,0X28};//显示缓冲区
- unsigned char count;
- unsigned char newcount;
- unsigned char oldcount;
- void intt0(void)//T0中断定时程序,定时58US,即测距1CM.
- {
- TCNT0=0XC6;
- count++;
- }
- void icp_timer1(void)//ICP1捕捉中断,捕捉频率38.5~41.6
- {
- if (96<=ICR1<=104)
- {
- SREG&=0X7f;
- newcount=count-13;
- ICR1=0;
- TCNT1=0;
- TCCR1B=0X81;
- }
- }
- void delay_1us(void)//1us
- {
- asm("nop");
- }
- void delay_us(unsigned int t)//tus
- {
- unsigned int i=0;
- for(i=0;i<t;i++)
- delay_1us();
- }
- void delay_1ms(void)//1ms
- {
- unsigned int i;
- for(i=1;i<1142;i++);
- }
- void delay_ms(unsigned char t)
- {
- unsigned char i=0;
- for(i=0;i<t;i++)
- {
- delay_1ms();
- }
- }
- void send40kHz(void) //发射40KHz超声波
- {
- count=0;
- TIMSK&=0XDF;//禁止ICP1使能
- OCR2=0X64;
- TCCR2=0X19;
- }
- void close40kHz(void) //停止发射超声波
- {
- TCCR2=0X00;
- }
- void hextobcd(unsigned char m)//将count十六进制数据转换为LED七段码
- {
- unsigned char temp;
- 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位
- }
- void display3led(void) //数码管显示
- {
- unsigned char i;
- for(i=0;i<3;i++)
- {
- PORTD=ledbuff;
- PORTC=~(1<<i); pc0-mm位,pc1-lm位,pc2-m位=""
- delay_1ms();
- PORTC=(1<<i);
- }
- }
- void display8led(void) //8LED显示
- {
- if(newcount<10)
- PORTD=0XFE;
- else if (newcount<20)
- PORTD=0XFD;
- else if (newcount<30)
- PORTD=0XFB;
- else if (newcount<40)
- PORTD=0XF7;
- else if (newcount<50)
- PORTD=0XEF;
- else if (newcount<100)
- PORTD=0XDF;
- else if (newcount<180)
- PORTD=0XBF;
- else
- PORTD=0X7F;
- }
- void mcu_init(void)//MCU初始化
- {
- DDRD=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定时溢出
-
- }
- void main(void)
- {
- unsigned char i;
- 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
- Chip type : AT89S52
- Clock frequency : 24MHz
- */
- /************************************************************************/
- #include "reg52.h"
- sbit P1_0=P1^0; //定义避障距离检测脚
- void delay_1ms(void) //1毫秒延时程序
- {
- unsigned char j=0,i=8;
- do
- {
- while(--j) ;
- }
- while(--i);
- }
- void delay(unsigned char i) // 毫秒级延时程序
- {
- while(i--)
- delay_1ms();
- }
- void forward(void) //LED4~5亮,前进
- {
- P0=0XE7;
- P3=0x50;
- }
- void left (void) //LED1~3亮,左转
- {
- P0=0XF8;
- P3=0x60;
- }
- void back (void) //LED全亮,后退
- {
- P0=0;
- P3=0XA0;
- }
- void init(void) //端口初始化
- {
- P1|=0X01; //要读取P1.0,就先写1
- P0=255; //8LED全不亮
- P3=0;
- }
- /***********************************************************************
- 主函数
- ***********************************************************************/
- void main(void)
- {
- init(); //系统初始化
- while(1) //循环
- {
- if(!P1_0) //如果在避障范围,则后退,左转弯
- {
- back();
- delay(200); //后退200毫秒
- left();
- delay(200); //左转90度.
- }
- else
- {
- forward();
- delay(200);
- }
- }
- }
很感谢那
相当的好、、、、
看看。
无私啊
学习了
谢啦,尽管不确定是否正确
不错,对的
最近在收集这样的资料,谢谢分享!
感谢哈
很全很难得~~感谢!
最近在收集这样的资料,谢谢分享
66666666666666666