微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 网上收集到的一款比较简单的AVR单片机超声波测距的实例

网上收集到的一款比较简单的AVR单片机超声波测距的实例

时间:10-02 整理:3721RD 点击:

       这款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超声波测距源程序:

  1. /*********************************************************************
  2. Project        :   超声波测距
  3. Chip type      :   ATMEGA8
  4. Clock frequency:   8.000000MHz
  5. *********************************************************************/
  6. #include
  7. #include
  8. #pragma interrupt_handler intt0:10                    //T0溢出中断
  9. #pragma interrupt_handler icp_timer1:6                //T1捕捉中断
  10. #pragma data:code  //设定数据区为程序存储器
  11. const unsigned char tab1[]={0X28,0XEE,0X32,0XA2,0XE4,
  12.                             0XA1,0X21,0XEA,0X20,0XA0};//七段译码字型表(lm,cm)
  13. const unsigned char tab2[]={0X08,0XCE,0X12,0X82,0XC4,
  14.                             0X81,0X01,0XCA,0X00,0X80};//七段译码字型表(m)
  15. #pragma data:data //设定数据区回到数据存储器
  16. unsigned char ledbuff[]={0X08,0X28,0X28};//显示缓冲区
  17. unsigned char count;
  18. unsigned char newcount;
  19. unsigned char oldcount;
  20. void intt0(void)//T0中断定时程序,定时58US,即测距1CM.
  21. {
  22. TCNT0=0XC6;
  23. count++;
  24. }
  25. void icp_timer1(void)//ICP1捕捉中断,捕捉频率38.5~41.6
  26. {
  27. if (96<=ICR1<=104)
  28. {
  29.   SREG&=0X7f;
  30.   newcount=count-13;
  31.   ICR1=0;
  32.   TCNT1=0;
  33.   TCCR1B=0X81;
  34. }
  35. }
  36. void delay_1us(void)//1us
  37. {
  38. asm("nop");
  39. }
  40. void delay_us(unsigned int t)//tus
  41. {
  42. unsigned int i=0;
  43. for(i=0;i<t;i++)
  44. delay_1us();
  45. }
  46. void delay_1ms(void)//1ms
  47. {
  48. unsigned int i;
  49. for(i=1;i<1142;i++);
  50. }
  51. void delay_ms(unsigned char t)
  52. {
  53. unsigned char  i=0;
  54. for(i=0;i<t;i++)
  55. {
  56.   delay_1ms();
  57. }
  58. }

  59. void send40kHz(void)           //发射40KHz超声波
  60. {
  61. count=0;
  62. TIMSK&=0XDF;//禁止ICP1使能
  63. OCR2=0X64;
  64. TCCR2=0X19;
  65. }
  66. void close40kHz(void)         //停止发射超声波
  67. {
  68. TCCR2=0X00;
  69. }
  70. void hextobcd(unsigned char m)//将count十六进制数据转换为LED七段码
  71. {
  72. unsigned char temp;
  73. temp=m%10;
  74. ledbuff[0]=tab1[temp];//mm位
  75. m=m/10;
  76. temp=m%10;
  77. ledbuff[1]=tab1[temp];//lm位
  78. temp=m/10;
  79. ledbuff[2]=tab2[temp];//m位
  80. }  
  81. void display3led(void)        //数码管显示
  82. {
  83. unsigned char i;
  84.   for(i=0;i<3;i++)
  85. {
  86.   PORTD=ledbuff;
  87.   PORTC=~(1<<i); pc0-mm位,pc1-lm位,pc2-m位=""
  88.   delay_1ms();
  89.   PORTC=(1<<i);
  90. }
  91. }  

  92. void display8led(void)        //8LED显示
  93. {
  94.     if(newcount<10)                 
  95.       PORTD=0XFE;
  96.     else if (newcount<20)
  97.     PORTD=0XFD;
  98.     else if (newcount<30)   
  99.       PORTD=0XFB;
  100.     else if (newcount<40)
  101.       PORTD=0XF7;
  102.     else if (newcount<50)   
  103.       PORTD=0XEF;
  104.     else if (newcount<100)  
  105.       PORTD=0XDF;
  106.     else if (newcount<180)  
  107.       PORTD=0XBF;
  108.     else                        
  109.      PORTD=0X7F;
  110. }   

  111. void mcu_init(void)//MCU初始化
  112. {
  113. DDRD=0XFF;
  114. PORTD=0XFF;
  115. DDRC=0XDF;       //PC5为输入
  116. PORTC=0XFF;
  117. DDRB=0XFE;
  118. PORTB=0XF7;
  119. TCNT2=0X00;
  120. TCNT0=0XC6;      //T0定时58US
  121. TCCR0=0X02;      //T0定时器1/8分频
  122. TCNT1=0X00;
  123. TCCR1A=0X00;
  124. TCCR1B=0X81;     //输入捕获噪音抑制允许,ICP1下降沿触发,系统时钟
  125. TIMSK=0X01;      //使能T0定时溢出
  126.   
  127. }
  128. void main(void)
  129. {
  130. unsigned char i;
  131. mcu_init();
  132. for(;;)
  133. {
  134.   send40kHz();
  135.   SREG|=0X80;  
  136.   delay_us(50);
  137.   close40kHz();
  138.   delay_us(20);
  139.   TIMSK=0X21;
  140.   if(!(PINC&0X20))                    //如果插上JD1短路块,则数码管显示距离
  141.     {  
  142.     if (newcount!=oldcount)
  143.        oldcount=newcount;
  144.        hextobcd(oldcount);
  145.     for(i=0;i<20;i++)
  146.        display3led();
  147.     }
  148.   else  
  149.     {   
  150.     PORTC=0XFF;
  151.     display8led();  
  152.     delay_ms(100);
  153.     }   
  154.   }
  155.   
  156. }

  157. 双龙SL-SRF-25超声波避障程序—51单片机
  158. /***********************************************************************/
  159. /*
  160.                  广州双龙电子
  161.                 WWW.SL.COM.CN
  162.    功能:
  163.         超声波避障,避障距离为10cm;前进遇障后退左转弯.
  164.     接线方法:
  165.          52板P1.0(用短线)接超声波传感器J1-1(J1插针的第一脚)
  166.    注意:
  167.          用户可以根据自已的避障距离,把52板P1.0脚连接到超声波传感器的相应脚
  168.    以下是避障距离范围情况:
  169.         1:  J1-1  避障距离范围5~9cm  
  170.         2:  J1-2  避障距离范围10~19cm  
  171.         3:  J1-3  避障距离范围20~29cm  
  172.         4:  J1-4  避障距离范围30~39cm  
  173.         5:  J1-5  避障距离范围40~49cm  
  174.         6:  J1-6  避障距离范围50~99cm  
  175.         7:  J1-7  避障距离范围100~179cm  
  176.         8:  J1-8  避障距离范围180~250cm  
  177.    Chip type       :  AT89S52     
  178.    Clock frequency :  24MHz
  179. */
  180. /************************************************************************/
  181. #include "reg52.h"
  182. sbit P1_0=P1^0;              //定义避障距离检测脚
  183. void delay_1ms(void)         //1毫秒延时程序
  184. {
  185. unsigned char j=0,i=8;
  186.    do
  187.      {
  188.         while(--j) ;  
  189.      }
  190.    while(--i);
  191. }

  192. void delay(unsigned char i)  // 毫秒级延时程序
  193. {
  194.   while(i--)
  195.   delay_1ms();   
  196. }

  197. void forward(void)           //LED4~5亮,前进
  198. {
  199.    P0=0XE7;
  200.    P3=0x50;
  201. }
  202. void left (void)             //LED1~3亮,左转
  203. {
  204.   P0=0XF8;
  205.   P3=0x60;
  206. }
  207. void back (void)            //LED全亮,后退
  208. {
  209.   P0=0;
  210.   P3=0XA0;
  211. }

  212. void init(void)            //端口初始化
  213. {
  214.   P1|=0X01;                //要读取P1.0,就先写1
  215.   P0=255;                  //8LED全不亮
  216.   P3=0;
  217. }
  218. /***********************************************************************
  219.                      主函数
  220. ***********************************************************************/
  221. void main(void)     
  222. {
  223.   init();                //系统初始化
  224.   while(1)               //循环
  225.   {  
  226.     if(!P1_0)            //如果在避障范围,则后退,左转弯
  227.     {
  228.       back();
  229.       delay(200);         //后退200毫秒
  230.       left();
  231.       delay(200);         //左转90度.
  232.     }
  233.    else  
  234.       {
  235.        forward();
  236.        delay(200);
  237.       }
  238.     }
  239. }

复制代码





很感谢那

相当的好、、、、

看看。

无私啊

学习了

谢啦,尽管不确定是否正确

不错,对的

最近在收集这样的资料,谢谢分享!

感谢哈

很全很难得~~感谢!

最近在收集这样的资料,谢谢分享

66666666666666666

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top