找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2071|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机扫地机器人程序有问题

[复制链接]
跳转到指定楼层
楼主
ID:391877 发表于 2018-10-24 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请求大佬帮忙看一下程序 程序废真的整不出来
我想的是这个小车可以直接用蓝牙遥控(用手机app操控)着走动 也可以按一下app上一个按键(参考程序的case5)可以自动清扫 加了驱动 最小系统 避障模块 就是程序整不了了 希望大佬们帮忙看一下 代码没有写完 如下:
  1. #include<reg52.h>
  2. typedef unsigned int uint;
  3. typedef unsigned char uchar;

  4. sbit ZA1A=P1^0;
  5. sbit ZA1B=P1^1;
  6. sbit ZB1A=P1^2;
  7. sbit ZB1B=P1^3;
  8. sbit YA1A=P1^4;
  9. sbit YA1B=P1^5;
  10. sbit YB1A=P1^6;
  11. sbit YB1B=P1^7;
  12. sbit Trig = P3^2 ;
  13. sbit Echo = P3^3 ;



  14. uchar rev=0; //蓝牙接收缓存值
  15. bit rok=0;        //接收标志
  16. /********************************************************************
  17. * 名称 :qianjin()
  18. * 功能 : 电机1、2启动,都是前进,整车表现为前进。
  19. * 输入 : 无
  20. * 输出 : 无                                                                       
  21. ***********************************************************************/
  22. void qianjin(){
  23.      ZA1A=0;
  24.          ZA1B=1;
  25.          ZB1A=0;
  26.      ZB1B=1;
  27.      YA1A=0;
  28.      YA1B=1;
  29.      YB1A=0;
  30.      YB1B=1;
  31. }
  32. void houtui(){
  33.          ZA1A=1;
  34.          ZA1B=0;
  35.          ZB1A=1;
  36.      ZB1B=0;
  37.      YA1A=1;
  38.      YA1B=0;
  39.      YB1A=1;
  40.      YB1B=0;
  41. }
  42. void zuozhuan(){
  43.          ZA1A=1;
  44.          ZA1B=0;
  45.          ZB1A=1;
  46.      ZB1B=0;
  47.      YA1A=0;
  48.      YA1B=1;
  49.      YB1A=0;
  50.      YB1B=1;
  51. }
  52. void youzhuan(){
  53.          ZA1A=0;
  54.          ZA1B=1;
  55.          ZB1A=0;
  56.      ZB1B=1;
  57.      YA1A=1;
  58.      YA1B=0;
  59.      YB1A=1;
  60.      YB1B=0;
  61. }

  62. void tingche(){
  63.             ZA1A=0;
  64.          ZA1B=0;
  65.          ZB1A=0;
  66.      ZB1B=0;
  67.      YA1A=0;
  68.      YA1B=0;
  69.      YB1A=0;
  70.      YB1B=0;
  71. }

  72. void chaoshengbo ()
  73. {
  74.     TR0=0;           //定时器开关
  75.         TH0=0;
  76.         TL0=0;

  77.     Trig=0;
  78.            Echo=0;
  79.         Trig=1;
  80.         DelayUs2x(20);
  81.         Trig=0;
  82.         while(Echo==0); //等待Echo回波引脚变高电平
  83.         TR0=1;           //定时器0开关打开
  84.         while(Echo); //等待
  85.         time=TH0*256+TL0; //*256是16位计数器的高8位和低八位之分.恢复成16位数的时候要*256。读取脉宽长度
  86.         S=time*0.0172;  //(厘米)*0.0172,根据超声的声速,单片机的频率,得出来的一个系数.
  87.         if(S>400)S=400;
  88.   }

  89. void bizhang()                                                //避障功能
  90. {  
  91.       
  92.            if(S<=10)                  //距离小于15CM
  93.                    {
  94.                        tingche();          //小车停止
  95.                                            zuozhuan();
  96.                                            delay(1000);
  97.                                            chaoshengbo();
  98.                                            szuo=s;
  99.                                            youzhuan(2000);
  100.                                            chaoshengbo();
  101.                                            syou=s;
  102.                                            zuozhuan(1000);
  103.                                            if(szuo>=syou){
  104.                                               zuozhuan();
  105.                                                   delay(2000);
  106.                                                   else if(szuo<syou){
  107.                                                          youzhuan();
  108.                                                                  delay(2000);
  109.                                                   }
  110.                                            }
  111.                    }
  112.                    else if(S>15)                  //距离大于,30CM往前走
  113.                    qianjin();
  114.                           
  115.            }                     

  116. void suiyuanqingsao(){
  117. qianjin();
  118. }


  119. }

  120. void COMM( void ) //到达某一位置后左右前后测距判断应该怎么走
  121. {
  122. chaoshengbo();//超声波测距如果还可以直行则直行,不能直行的话判断应该左转还是右转
  123. {if(s>5){
  124. qianjin();
  125. delay(500);
  126. zuoyouzhuanceju();
  127. }
  128. else if(){
  129. tingche();
  130. zuoyouzhaunceju();
  131. }
  132. }
  133. void zuoyouzhuanceju()
  134. {tingche();
  135. zuozhuan();
  136. delay(1000);//需要计算时间
  137. chaoshengbo(); //启动超声波测距
  138. S2=S;
  139. youzhuan();//小车向右转180度
  140. delay(2000);
  141. chaoshengbo(); //启动超声波测距
  142. S4=S;
  143. zuozhuan();//测完距离后让小车回到原前进方向
  144. delay(1000);
  145. chaoshengbo() //启动超声波测距
  146. S1=S;
  147. if((S2<15)||(S4<15)) //只要左右各有距离小于15CM小车后退
  148. {
  149. houtui(); //后退
  150. }

  151. if(S2>S4)
  152. {
  153. youzhuan(); //车的左边比车的右边距离小 右转
  154. delay(1000);
  155. }
  156. else
  157. {
  158. zuozhuan(); //车的左边比车的右边距离大 左转
  159. delay(1000);
  160. }
  161. }

  162. /********************************************************************
  163. * 名称 : Com_Init()
  164. * 功能 : 串口初始化,晶振11.0592,波特率9600,使串口中断
  165. * 输入 : 无
  166. * 输出 : 无
  167. ***********************************************************************/
  168. void Com_Init(void)
  169. {
  170.         TMOD = 0x20;
  171.         PCON = 0x00;
  172.         SCON = 0x50; //0101 000设置串行口控制寄存器sm0,sm1为01,即为工作方式1
  173.         TH1 = 0xFd; //设置波特率 9600
  174.         TL1 = 0xFd;
  175.         TR1 = 1; //启动定时器1
  176.         ES = 1; //开串口中断
  177.         EA = 1; //开总中断
  178. }

  179. void gongneng()
  180. {
  181.   switch(rev)
  182.                 {
  183.                         case '0': tingche(); break;
  184.                         case '1': qianjin(); break;
  185.                         case '2': houtui(); break;
  186.                         case '3': zuozhuan(); break;
  187.                         case '4': youzhuan(); break;
  188.             case ’5’:suiyuanqingsao();break;
  189.                         default:break;
  190.                 }
  191.   rok=0;
  192. }

  193. void main()
  194. {
  195.     Com_Init();//初始化                                                                                       
  196.     while(1)//循环结构,选择函数控制小车的状态
  197.         {
  198.           if(rok)gongneng();
  199.         }
  200. }
  201. /********************************************************************
  202. * 名称 : Com_Int()
  203. * 功能 : 串口中断子函数
  204. * 输入 : 无
  205. * 输出 : 无
  206. ***********************************************************************/
  207. void Com_Int(void) interrupt 4
  208. {
  209.         ES = 0;
  210.         if(RI) //当硬件接收到一个数据时,RI会置位
  211.                 {
  212.                 rev=SBUF;
  213.                 RI = 0;//取消本次中断申请,方便进入下一次
  214.                 rok=1;
  215.                 }
  216.         ES = 1;               
  217. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:547750 发表于 2019-5-26 18:52 | 只看该作者
你好   请问你这个硬件设计里有几个电机啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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