找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1870|回复: 1
收起左侧

关于单片机超声波避障的代码

[复制链接]
ID:500854 发表于 2019-4-6 22:55 | 显示全部楼层 |阅读模式
关于一些简单的超声波避障代码

单片机源程序如下:
  1. #include<reg52.h>

  2. //定义选择开关
  3. sbit selet1 = P3^5;
  4. sbit selet2 = P3^4;
  5. //sbit selet3 = P3^3;

  6. //定义L298N端口
  7. sbit in1 = P0^0;
  8. sbit in2 = P0^1;
  9. sbit in3 = P0^2;
  10. sbit in4 = P0^3;
  11. sbit enA = P0^4;
  12. sbit enB = P0^5;

  13. //定义微动开关端口
  14. sbit key1 = P1^0;
  15. sbit key2 = P1^1;

  16. //定义蜂鸣器
  17. sbit beep = P3^6;

  18. //定义超声波模块端口
  19. sbit Trig = P1^2;
  20. sbit Echo = P1^3;
  21. unsigned int distance_cm = 0;          //距离
  22. unsigned int overflow_count = 0;  //溢出计数
  23. unsigned int status = 0;                  //超声波模块状态
  24. unsigned int dis_count = 0;                  //计数

  25. unsigned char tmp, dat, flat;         
  26. unsigned int num, model, c=0;
  27. unsigned int speed = 100;

  28. //static unsigned int car_statues = 5; //小车默认状态为停止

  29. void delay(unsigned int z);
  30. void delay_us(unsigned int aa);
  31. void forward(unsigned char pwm);
  32. void f(void);
  33. void back(unsigned char pwm);
  34. void b(void);
  35. void left(unsigned char pwm);
  36. void l(void);
  37. void right(unsigned char pwm);
  38. void r(void);
  39. void stop(void);
  40. void laba(unsigned int i);
  41. void chaoshengbo_init(void);
  42. void GetDistance(void);
  43. void lanya_init();   //串口初始化
  44. void send(unsigned char a);        //单字节发送函数
  45. void ctrl(); //接收处理函数
  46. void get_model(unsigned char value);

  47. void main(void)
  48. {
  49.         unsigned int n = 0;
  50.         //chaoshengbo_init();
  51.         lanya_init();                         //蓝牙模块初始化
  52.         speed = 40;
  53.         while(1)
  54.         {

  55.                 get_model(SBUF);
  56.                 if(model == 1)
  57.                         forward(speed);
  58.                 if(model == 2)
  59.                         left(speed);
  60.                 if(model == 3)
  61.                         right(speed);
  62.                 if(model == 4)
  63.                         back(speed);
  64.                 if(model == 5)
  65.                         stop();
  66.                 if(model == 6)
  67.                         speed = 40;
  68.                 if(model == 7)
  69.                         speed = 75;
  70.                 if(model == 8)
  71.                         speed = 100;
  72.                 if(RI==1)                     // 是否有数据到来
  73.                 {
  74.                         RI = 0;
  75.                         ctrl();
  76.                 }      

  77.                 if(selet1 == 0)                //S1被按下时,前进,微动开关模式
  78.                 {
  79.                         delay(5);          //消抖
  80.                         if(selet1 == 0)                //确认按键被按下
  81.                         {
  82.                                 while(!selet1)        //松开按键检测
  83.                                         ;
  84.                                 n = 1;                        //n赋值为1,微动开关模式
  85.                         }                                
  86.                 }

  87.                 if(selet2 == 0)                //S2被按下时,后退,超声波避障模式
  88.                 {
  89.                         delay(5);                  //消抖
  90.                         if(selet2 == 0)           //确认按键被按下
  91.                         {
  92.                                 while(!selet2)         //按键松开检测
  93.                                         ;
  94.                                 n = 2;                         //n赋值为2,超声波避障模式
  95.                         }                        
  96.                 }
  97.                    /*
  98.                 if(selet3 == 0)                //S3被按下时,手机蓝牙控制模式
  99.                 {
  100.                         delay(5);                                //消抖
  101.                         if(selet3 == 0)                        //确认按键被按下
  102.                         {
  103.                                 while(!selet3)                //按键松开检测
  104.                                         ;
  105.                                 n = 3;                           //n赋值为3,蓝牙控制模式
  106.                                 lanya_init();
  107.                         }                                
  108.                 }
  109.            */
  110.                 if( n == 1)                                 //若n为1,微动开关模式
  111.                 {
  112.                         f();                         //默认前进

  113.                         if(key1 == 0)                          //若左边微动开关被按下
  114.                         {
  115.                                 delay(5);                                //消抖
  116.                                 if(key1 == 0)                        //确认左边微动开关被按下
  117.                                 {
  118.                                         //while(!key1);                //按键松开检测
  119.                                         b();                                //先后退
  120.                                         delay(1000);
  121.                                         r();                                //再左转
  122.                                         delay(1000);
  123.                                 }        
  124.                         }
  125.                         if(key2 == 0)                   //若右边微动开关被按下
  126.                         {        
  127.                                 delay(5);                        //消抖
  128.                                 if(key2 == 0)                        //确认右边微动开关被按下
  129.                                 {
  130.                                         //while(!key2);                 //按键松开检测
  131.                                         b();                                 //先后退
  132.                                         delay(1000);
  133.                                         r();                         //在右转
  134.                                         delay(1000);
  135.                                 }        
  136.                         }
  137.                 }

  138.                 else if( n == 2)                        //若n为2,超声波避障模式
  139.                 {
  140.                         ES = 0;
  141.                         TR1 = 0;
  142.                         chaoshengbo_init();                //超声波模块初始化
  143.                         //speed = 100;
  144.                         b();                                        //默认后退
  145.                         GetDistance();                        //获取距离
  146.                         if(distance_cm > 0 && distance_cm <= 15)                //若获取的距离大于0且小于等于15cm时
  147.                         {
  148.                                 f();                                                           //先前进(与默认行驶方式相反)
  149.                                 delay(1000);
  150.                                 r();                                                          //再右转
  151.                                 delay(1000);
  152.                         }
  153.                 }
  154.          /*
  155.                 else if( n == 3)                        //若n为3, 蓝牙控制模式
  156.                 {
  157.                         //TR2 = 0;                                //关闭超声波模块开的定时器2
  158.                         lanya_init();                         //蓝牙模块初始化
  159.                         stop();                                        //默认停止
  160.                         get_model(SBUF);                //获取信号
  161.                         speed = 35;

  162.                         if(model == 1)                        //若接收到的信号为1,前进
  163.                                 forward(speed);                        //前进
  164.                         if(model == 2)                        //若接收到的信号为2,左转
  165.                                 left(speed);                                //左转
  166.                         if(model == 3)                        //若接收到的信号为3,右转
  167.                                 right(speed);                        //右转
  168.                         if(model == 4)                        //若接收到的信号为4,后退
  169.                                 back(speed);                                //后退
  170.                         if(model == 5)                        //若接收到的信号为5,停止
  171.                                 stop();                                //停止
  172.                         if(model == 6)                        //若接收到的信号为6,一档
  173.                                 speed = 35;                        //speed为35
  174.                         if(model == 7)                        //若接收到的信号为7,二挡
  175.                                 speed = 70;                        //speed为70
  176.                         if(model == 8)                        //若接收到的信号为8,三挡
  177.                                 speed = 100;                //speed为100

  178.                         if(RI==1)               //判断是否有数据到来
  179.             {
  180.                                 RI = 0;
  181.                                 ctrl();
  182.                         }                                 
  183.                 }
  184.                 */
  185.         }
  186. }

  187. //小车右转
  188. void right(unsigned char pwm)
  189. {
  190.         enA = 1;
  191.         in1 = 0;
  192.         in2 = 1;
  193.         in3 = 0;
  194.         in4 = 0;
  195.         delay_us( pwm );
  196.         
  197.         enA = 1;
  198.         in1 = 0;
  199.         in2 = 0;
  200.         in3 = 0;
  201.         in4 = 0;
  202.         delay_us( 100 - pwm );
  203. }
  204. void r(void)
  205. {
  206.         enA = 1;
  207.         in1 = 0;
  208.         in2 = 1;
  209.         in3 = 0;
  210.         in4 = 0;
  211. }

  212. //小车左转
  213. void left(unsigned char pwm)
  214. {
  215.         enA = 1;
  216.         in1 = 0;
  217.         in2 = 0;
  218.         in3 = 1;
  219.         in4 = 0;
  220.         delay_us( pwm );
  221.         
  222.         enA = 1;
  223.         in1 = 0;
  224.         in2 = 0;
  225.         in3 = 0;
  226.         in4 = 0;
  227.         delay_us( 100 - pwm );
  228. }
  229. void l(void)
  230. {
  231.         enA = 1;
  232.         in1 = 0;
  233.         in2 = 0;
  234.         in3 = 1;
  235.         in4 = 0;
  236. }

  237. //小车后退
  238. void back(unsigned char pwm)
  239. {
  240.         enA = 1;
  241.         enB = 1;
  242.         in1 = 1;
  243.         in2 = 0;
  244.         in3 = 1;
  245.         in4 = 0;
  246.         delay_us( pwm );
  247.         
  248.         enA = 1;
  249.         in1 = 0;
  250.         in2 = 0;
  251.         in3 = 0;
  252.         in4 = 0;
  253.         delay_us( 100 - pwm );
  254. }
  255. void b(void)
  256. {
  257.         enA = 1;
  258.         enB = 1;
  259.         in1 = 1;
  260.         in2 = 0;
  261.         in3 = 1;
  262.         in4 = 0;
  263. }

  264. //小车前进
  265. void forward(unsigned char pwm)
  266. {
  267.         enA = 1;
  268.         enB = 1;
  269.         in1 = 0;
  270.         in2 = 1;
  271.         in3 = 0;
  272.         in4 = 1;
  273.         delay_us( pwm );
  274.         
  275.         enA = 1;
  276.         in1 = 0;
  277.         in2 = 0;
  278.         in3 = 0;
  279.         in4 = 0;
  280.         delay_us( 100 - pwm );
  281. }
  282. void f(void)
  283. {
  284.         enA = 1;
  285.         enB = 1;
  286.         in1 = 0;
  287.         in2 = 1;
  288.         in3 = 0;
  289.         in4 = 1;
  290. }

  291. //小车停止
  292. void stop(void)
  293. {
  294.         enB = 1;
  295.         in1 = 0;
  296.         in2 = 0;
  297.         in3 = 0;
  298.         in4 = 0;
  299. }

  300. /*
  301. //喇叭
  302. void laba(unsigned int i)
  303. {
  304.         unsigned char j;

  305.         if( i == 1 )
  306.                 forward();
  307.         else if( i == 2 )
  308.                 left();
  309.         else if( i == 3 )
  310.                 right();
  311.         else if( i == 4 )
  312.                 back();
  313.         else if( i == 5 )
  314.                 stop();

  315.         for(j=200; j>0; j--)
  316.         {
  317.                 beep = ~beep;
  318.                 delay_us(500);
  319.         }
  320.         delay(500);
  321.         for(j=200; j>0; j--)
  322.         {
  323.                 beep = ~beep;
  324.                 delay_us(500);
  325.         }
  326. }
  327. */

  328. //超声波模块初始化
  329. void chaoshengbo_init(void)
  330. {
  331.         Trig = 0;
  332.         //TH2 = RCAP2H = 0;
  333.         //TL2 = RCAP2L = 0;
  334.         TH0 = TL0 = 0;
  335.         TR0 = 0;        //关闭定时器0
  336.         ET0 = 1;        //允许T0中断
  337. }

  338. //超声波模块获取距离
  339. void GetDistance(void)
  340. {
  341.         Trig = 1;        //发送触发信号
  342.         status = 1;          //状态1为发射超声波
  343.         TH0 = 0;         
  344.         TL0 = 0;
  345.         TR0 = 1;        //打开定时器0
  346.         while(TL0 < 42)                //产生超过10us的脉冲
  347.                 ;
  348.         status = 2;          //状态2为发射完超声波后
  349.         Trig = 0;
  350.         TR0 = 0;
  351.         TH0 = 0;
  352.         TL0 = 0;
  353.         overflow_count = 0;
  354.         TR0 = 1;                  //打开定时器0
  355.         while(Echo == 0)   //当无信号返回时
  356.         {
  357.                 if(status == 5)                //状态5表示超时
  358.                 {
  359.                         status = 0;
  360.                         distance_cm = 0;
  361.                         break ;        //失败
  362.                 }
  363.         }
  364.         TR0 = 0;        //清空计数
  365.         TH0 = 0;
  366.         TL0 = 0;
  367.         overflow_count = 0;
  368.         TR0 = 1;
  369.         while(Echo == 1)        //有信号返回时,开始计算长度
  370.         {
  371.                 if(status == 5)        //status为5时失败
  372.                 {
  373.                         status = 0;
  374.                         distance_cm = 0;
  375.                         TR0 = 0;
  376.                         break ;
  377.                 }
  378.         }
  379.         dis_count = overflow_count * 65536 + TH0 * 256 + TL0;
  380.         TR0 = 0;
  381.         distance_cm = (unsigned int)( (long)(dis_count) * 34 / 10000);
  382.         status = 0 ;        //准备下次发送
  383. }

  384. //定时器2中断
  385. void Timer0Int() interrupt 1
  386. {
  387.         TF0 = 0;
  388.         overflow_count++;
  389.         TH0 = 0;
  390.         TL0 = 0;
  391.         if(overflow_count == 2)
  392.         {
  393.                 status = 5;                //超时
  394.         }
  395. }

  396. //蓝牙模块
  397. void get_model(unsigned char value)
  398. {                  
  399.         unsigned char shu1,value1;
  400.         value1=value-48;
  401.         //bai=value1/16;
  402.         shu1=value1%16;


  403.    switch(shu1)
  404.    {
  405.            case 1:model = 1;break;        //model赋值为1,前进
  406.         case 2:model = 2;break;        //model赋值为2,左转
  407.         case 3:model = 3;break;        //model赋值为3,右转
  408.         case 4:model = 4;break;        //model赋值为4,后退
  409.         case 5:model = 5;break;        //model赋值为5,停止
  410.         case 6:model = 6;break; //model赋值为6,一档
  411.         case 7:model = 7;break; //model赋值为7,二挡
  412.         case 8:model = 8;break; //model赋值为8;三挡
  413.         //case 9:model = 6;break;        //model赋值为6,喇叭
  414.    }

  415. }        

  416. void lanya_init()        //串口初始化
  417. {
  418.         TR1 = 0;
  419.         ES=0;                                                                  //关中断
  420.         SCON = 0x50;                        // 即10010000,REN为1,串口工作模式为2
  421.                                                                                 //

  422.         TMOD = 0x20;                        // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
  423.         TH1=TL1=0xFD;                       // 初始值设为FD,产生9600波特率
  424.          
  425.         PCON &= 0x7f;                       // 即SMOD1为0,波特率不倍增
  426.         TR1 = 1;                                                          //定时器1开始工作,产生波特率
  427.                                                                                 //发送标志位置0
  428.         TI=0;                                                                  //接收标志位置0
  429.         RI=0;
  430.                   
  431.         //EA=0;
  432.         ES=1;
  433. }

  434. void send(unsigned char a)        //单字节数据发送
  435. {                                                        
  436.         TI=0;        
  437.         SBUF=a;
  438.         while(TI==0);
  439.         TI=0;

  440. }

  441. void ctrl()                            //接收处理函数
  442. {
  443.         //static unsigned int car_statues = 5; //小车默认状态为停止
  444.         switch(tmp)
  445.         {
  446.                 case '1':send(tmp);break;        //前进                                       
  447.                 case '2':send(tmp);break;        //左转
  448.                 case '3':send(tmp);break;        //右转
  449.                 case '4':send(tmp);break;        //后退
  450.                 case '5':send(tmp);break;        //停止
  451.                 case '6':send(tmp);break;        //一档
  452.                 case '7':send(tmp);break;        //二挡
  453.                 case '8':send(tmp);break;        //三挡
  454.                 //case '9':send(tmp);break;        //喇叭
  455.                 default:send(tmp);
  456.         }
  457. }

  458. void delay(unsigned int z)
  459. {
  460.         unsigned int x, y;
  461.         for(x = z; x > 0 ; x--)
  462.                 for(y=110;y>0;y--)
  463.                         ;
  464. }

  465. void delay_us(unsigned int aa)
  466. {
  467.         while(aa--);
  468. }
复制代码

所有资料51hei提供下载:
源码.7z (4.11 KB, 下载次数: 9)
回复

使用道具 举报

ID:1 发表于 2019-4-9 02:08 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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