找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8525|回复: 2
收起左侧

51单片机超声波避障智能小车源程序

[复制链接]
ID:313508 发表于 2018-4-22 09:27 | 显示全部楼层 |阅读模式
无聊的时候写的小车超声波避障程序
串口接线方式.jpg

单片机源程序如下:
  1. /***********************************************************************************************************/
  2. //HC-SR04 超声波测距模块 DEMO 程序
  3. //晶振:11。0592
  4. //程序          QQ:  517535000
  5. //接线:模块TRIG接 P1.2  ECH0 接P1.1
  6. //串口波特率9600
  7. /***********************************************************************************************************/          
  8.         #include   <AT89X51.H>
  9.         #include   <intrins.h>
  10.     #include   <STDIO.H>

  11.     #define uchar unsigned  char
  12.     #define uint  unsigned   int  
  13.         #define  RX  P1_5
  14.     #define  TX  P1_6
  15.   
  16.         sbit IN1=P2^4 ;
  17.         sbit IN2=P2^3;
  18.         sbit IN3=P2^2;
  19.         sbit IN4=P2^1;

  20.         unsigned int  time=0;
  21.         unsigned int  timer=0;
  22.         float         S=0;
  23.     bit           flag =0;
  24.        


  25.         void qian()//前进
  26. {
  27.     IN1=1;
  28.         IN2=0;

  29.         IN3=1;
  30.         IN4=0;
  31. }

  32. void hou()//后退
  33. {
  34.     IN1=0;
  35.         IN2=1;

  36.         IN3=0;
  37.         IN4=1;
  38. }       

  39. void stop()//停止
  40. {
  41.     IN1=0;
  42.         IN2=0;

  43.         IN3=0;
  44.         IN4=0;
  45. }

  46. void you()//右转
  47. {
  48.     IN1=1;
  49.         IN2=0;

  50.         IN3=0;
  51.         IN4=1;
  52. }






  53. /********************************************************/
  54. void delayms(unsigned int ms)
  55. {
  56.         unsigned char i=100,j;
  57.         for(;ms;ms--)
  58.         {
  59.                 while(--i)
  60.                 {
  61.                         j=10;
  62.                         while(--j);
  63.                 }
  64.         }
  65. }

  66. /********************************************************/
  67.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  68.   {
  69.     flag=1;                                                         //中断溢出标志
  70.   }




  71. /********************************************************/
  72.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  73.   {
  74.           TX=1;                                         //800MS  启动一次模块
  75.           _nop_();
  76.           _nop_();
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.           _nop_();
  81.           _nop_();
  82.           _nop_();
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();                                                                           
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           TX=0;
  97.   }


















  98. /********************************************************/
  99.     void Conut(void)
  100.         {
  101.                          time=TH0*256+TL0;
  102.                          TH0=0;
  103.                          TL0=0;
  104.                          S=(time*1.7)/100;     //算出来是CM
  105.                          if(flag==1)                    //超出测量
  106.                          {
  107.                                   flag=0;        
  108.                      }       
  109.          }


  110. /********************************************************/
  111. void main(void)
  112. {  

  113.    
  114.     TMOD=0x21;                   //设T0为方式1,GATE=1;
  115.         SCON=0x50;
  116.                                                                                     
  117.         TH0=0;
  118.         TL0=0;
  119.         TR0=1;  
  120.         ET0=1;             //允许T0中断
  121.         TR1=1;                           //开启定时器
  122.         TI=1;

  123.         SCON|=0X50;                        //设置为工作方式1
  124.         TMOD|=0X20;                        //设置计数器工作方式2
  125.         PCON=0X80;                        //波特率加倍
  126.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  127.         TL1=0XF3;
  128.         ES=1;                                                //打开接收中断


  129.    

  130.         EA=1;                           //开启总中断

  131. //        delayms(2000);
  132.         while(1)
  133.         {
  134.          StartModule();
  135.          while(!RX);                //当RX为零时等待
  136.          TR0=1;                            //开启计数
  137.          while(RX);                        //当RX为1计数并等待
  138.          TR0=0;                                //关闭计数
  139.      Conut();                        //计算


  140.          /*    printf("%f\r\n",S); //输出一次数据
  141.                          if(S<10)
  142.                            IN1=0;
  143.                            else IN1=1;   */


  144.                                              if(S<30)
  145.                 {
  146.                           delayms(2);
  147.                           if(S<30)
  148.                           {
  149.                                          
  150.                                          stop();
  151.                                          delayms(4);
  152.                                          hou();
  153.                                          delayms(30);
  154.                                
  155.                                          B:you();
  156.                                            delayms(20);
  157.                                            stop();
  158.                                           
  159.                                                  StartModule();
  160.                                                  while(!RX);                //当RX为零时等待
  161.                                                  TR0=1;                            //开启计数
  162.                                                  while(RX);                        //当RX为1计数并等待
  163.                                                  TR0=0;                                //关闭计数
  164.                                              Conut();                        //计算




  165.                
  166.                                                            if(S>40)
  167.                                                            {
  168.                                                                            you();
  169.                                                                         delayms(8);
  170.                                                     stop();
  171.                                                                 delayms(4);
  172.                                                                         qian();
  173.                                                }       
  174.                                                            else
  175.                                                            {
  176.                                                              goto B;
  177.                                                            }                 
  178.                         }
  179.                                 else
  180.                                 {
  181.                                    qian();
  182.                                 }
  183.                  }
  184.                 else
  185.                 {  
  186.                   
  187.                    qian();
  188.                 }                          

  189.                                                                                                                  


  190.           delayms(10);

  191.         }

  192. }
复制代码

所有资料51hei提供下载:
超声波避障.rar (84.88 KB, 下载次数: 87)
回复

使用道具 举报

ID:171111 发表于 2018-5-3 22:58 | 显示全部楼层
谢谢 这是好东西啊
回复

使用道具 举报

ID:242298 发表于 2019-10-23 02:20 | 显示全部楼层
发现刷写后没有反应!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表