找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2317|回复: 7
收起左侧

为什么我每次都想用按键来实现智能车功能的切换,但是每次都实现不了,究竟错在哪里

[复制链接]
ID:99359 发表于 2016-1-31 18:45 | 显示全部楼层 |阅读模式
为什么我每次都想用按键来实现智能车功能的切换,但是每次都实现不了,我都改了N遍了,但还是不行,找不出代码错在哪里,希望大家能帮帮我,以下的程序是实现蓝牙遥控和红外避障功能的切换,按下按键1实现蓝牙遥控功能,按键2 则是想红外避障功能
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;

sbit y=P3^4;
sbit z=P3^5;

sbit key1=P3^2;
sbit key2=P3^3;
uchar a;//接收蓝牙模块发送的数据

void delayxms(uint z)//调节电机转速
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void qian()
{
a1=1;
a2=0;
a3=1;
a4=0;  
}
void hou()
{        a1=0;
        a2=1;
        a3=0;
        a4=1;

}
void zuo()
{
    a1=0;
        a2=0;
        a3=1;
        a4=0;
}
void you()
{
         
           a1=1;
        a2=0;
        a3=0;
        a4=0;
}
void ting()
{
    a1=0;
        a2=0;
        a3=0;
        a4=0;
}

void lanya()
{
    TMOD=0x20;//定时器1工作方式2,8位自动重装  
    TH1=0xFd; //11.0592M晶振,9600波特率    
    TL1=0xFd;
    SCON=0x50;//串口方式1 SM0 SM1 01 允许接收  
    PCON=0x00;//SMOD=0 16分频
    TR1=1;//打开定时器1
        ES=1;//打开串口中断   
    EA=1;//开总中断  
    //以上跟串口通信初始化有关
}

void keyscan()
{
   if(key1==0)
   {
          delayxms(10);
          if(key1==0)
          {
               
                         lanya();
                         
          
                   
                   if(a=='A')
                   qian();
                   else if(a=='B')
                   hou();
                   else if(a=='C')
                   zuo();
                   else if(a=='D')
                   you();
                   else
                   ting();
                  
                 
                   while (!key1) ;
       
       
      }
   }
   if(key2==0)
   {
         delayxms(10);
         
         if(key2==0)
         {
            
           qian();
           while((z==0)&&(y==1))
           {
                 you();
           }
           while((z==1)&&(y==0))
           {
                zuo();
           }
       
          }
            while (!key2);
         }

}

void main()
{


        while(1)
        {  
                     keyscan();
        }
}       


void serial() interrupt 4//中断子函数
{
        RI=0;//清0
        a=SBUF;
}

回复

使用道具 举报

ID:79544 发表于 2016-2-1 22:54 | 显示全部楼层
你的单个程序好用吗?
回复

使用道具 举报

ID:99359 发表于 2016-2-1 23:10 | 显示全部楼层
腾飞的龙 发表于 2016-2-1 22:54
你的单个程序好用吗?

还可以,但是一并起来就不行了
回复

使用道具 举报

ID:79544 发表于 2016-2-2 11:07 | 显示全部楼层
你用的是那款手机蓝牙APP,只能控制前后左右吗?我在论坛里上传了一个手机蓝牙的APP,你下载。也是单字符的协议,手机发送0,1,2,3,4,5,6,7,8. 单片机收到就执行你下位机
回复

使用道具 举报

ID:79544 发表于 2016-2-2 11:48 | 显示全部楼层
应该设定个标志位,
回复

使用道具 举报

ID:79544 发表于 2016-2-2 12:01 | 显示全部楼层
给你个我用的蓝牙小车程序,手机APP在论坛里。
  1. /************************************************
  2. //蓝牙控制小车 加舵机 加避障 可以调速 正确的程序
  3.         单片机: STC12C5608AD
  4. //        晶振  :           11.0592M晶振
  5.         作者  :苏义江
  6.         时间  :2016-1-8
  7. ***************************************************/
  8. #include <reg52.h>
  9. #include<intrins.h>
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. //sfr  T2MOD=0xc9;
  13. sbit in1  =P1^0; //电机1端口
  14. sbit in2  =P1^1;
  15. sbit ina  =P1^2;  //电机PWM-A

  16. sbit in3  =P1^3;//电机2端口
  17. sbit in4  =P1^4;
  18. sbit inb  =P1^5;//电机PWM-B

  19. sbit bz_l =P2^0;  //避障左
  20. sbit bz_z =P2^1;  //避障右
  21. sbit bz_r =P2^2;  //避障右

  22. sbit moto_pwm =P3^4;//PWM输出脚控制舵机
  23. sbit yan      =P3^5;//头灯光

  24. sbit landeng =P3^2;//蓝前大灯
  25. sbit hondeng =P3^3;//红前大灯
  26. sbit yinyue  =P3^7;//音乐端口

  27. sbit wela    =P1^6;//位码
  28. sbit dula    =P1^7;//段码
  29. uchar code table[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,
  30.                                                 0x82,0xF8,0x80,0x90,0xBF,0xff};
  31. uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  32. //uchar disbuff[4] ={ 0,0,0,0,};//数码管全显示 0
  33. uint tt = 0;//变量定义
  34. uint num=0;//变量定义

  35. uchar pwm_lefr=0;//定义 定时器自加1变量
  36. //uchar pwm_lefr1=0;//定义 定时器自加1变量
  37. uchar duojiguizhong=14;//舵机归中1.5ms
  38. uchar duojiguizhong1=14;//舵机归中1.5ms
  39. uchar tmp,w,sudu; //变量w 定义PWM值

  40. void init() ;
  41. void delay1(uint z)//延时函数
  42. {
  43.         uint x,y;
  44.         for(x=z;x>0;x--)
  45.                 for(y=120;y>1;y--);
  46. }
  47. void delay(uint z)
  48. {
  49.         uint x,y;
  50.         for(x=0;x<z;x++)
  51.         for(y=0;y<1000;y++);
  52.        
  53. }

  54. /*void xianshi(uchar num)//显示
  55. {  
  56.   uchar gw,sw,bw,qianw;
  57.         qianw=num/1000%100;
  58.    bw=num%1000/100;   
  59.    sw=num%100/10;   
  60.    gw=num%10;
  61.             
  62.    P2=0xfe;   
  63.    wela=1;     
  64.    _nop_();_nop_();   
  65.    wela=0;     
  66.    P2=table[qianw];
  67.     dula=1;     
  68.    _nop_();_nop_();   
  69.    dula=0;   
  70.    delay1(2);

  71.    P2=0xfd;
  72.    wela=1;     
  73.    _nop_();
  74.    _nop_();   
  75.    wela=0;     
  76.    P2=table[bw];
  77.     dula=1;     
  78.    _nop_();
  79.    _nop_();   
  80.    dula=0;   
  81.    delay1(2);

  82.         P2=0xfb;   
  83.    wela=1;     
  84.    _nop_();_nop_();   
  85.      wela=0;     
  86.    P2=table[sw];   
  87.    dula=1;     
  88.    _nop_();_nop_();   
  89.    dula=0;
  90.    delay1(2);
  91.                 P2=0xf7;   
  92.    wela=1;     
  93.    _nop_();_nop_();   
  94.      wela=0;     
  95.    P2=table[gw];   
  96.    dula=1;     
  97.    _nop_();_nop_();   
  98.    dula=0;
  99.    delay1(2); //显示个 十 百 千

  100. }  */

  101. void pwmmaic()//产生PWM
  102. {
  103.         if(pwm_lefr<=duojiguizhong)       
  104.                 moto_pwm=1;
  105.                 else
  106.                 moto_pwm=0;
  107.                 if(pwm_lefr>=200)
  108.                 pwm_lefr=0;               
  109. }

  110. void duoji_kz()//舵机控制
  111. {
  112.         yan=0;
  113.         duojiguizhong=9;
  114.        
  115.         delay(800);
  116.         yan=0;
  117.         duojiguizhong=16;
  118.        
  119.         delay(800);
  120.         yan=0;
  121.         duojiguizhong=24;
  122.        
  123.         delay(800);
  124.         yan=0;
  125.         duojiguizhong=16;
  126.        
  127.         delay(800);
  128.         yan=0;
  129.         delay(1500);
  130.         yan=1;       
  131. }
  132. void lankong()        //蓝色LED
  133. {
  134.         landeng=0;
  135.         delay1(80);
  136.         landeng=1;
  137.         delay1(80);
  138. }
  139. void hongkong()        //红色LED
  140. {
  141.         hondeng=0;
  142.         delay1(80);
  143.         hondeng=1;
  144.         delay1(80);
  145. }
  146. void qianjin()
  147. {
  148.         in1=1;in2=0;in3=0;in4=1;
  149.         w=40;
  150.         yan=0;landeng=0;hondeng=0;yinyue=0;       
  151. }   
  152. void houtui()
  153. {
  154.         in1=0;in2=1;in3=1;in4=0;
  155.         w=40;
  156.         yan=1;hondeng=0;yinyue=0;       
  157. }  
  158. void zuozhuan()
  159. {
  160.         in3=1;in4=0;
  161.         w=40;
  162.         lankong();yinyue=1;
  163. }
  164. void youzhuan()
  165. {
  166.         in1=0;in2=1;
  167.         w=40;
  168.         hongkong();yinyue=1;
  169. }  
  170. void tingzhi()
  171. {
  172.         in1=0;in2=0;in3=0 ;in4=0;
  173.         hongkong();lankong();yinyue=1;
  174. }
  175. void zhuanquan()
  176. {
  177.         in1=1;in2=0;in3=1;in4=0;
  178.         w=40;
  179.         lankong();yinyue=1;
  180. }
  181. void bizhang()        //避障
  182. {
  183.          if(bz_l==1&&bz_z==1)
  184.          qianjin();
  185.           if(bz_l==0&&bz_z==1)
  186.          zuozhuan();
  187.           if(bz_l==1&&bz_z==0)
  188.          youzhuan();
  189.           if(bz_l==0&&bz_z==0)
  190.           {
  191.                  tingzhi();
  192.                 delay(100);
  193.                  zuozhuan();
  194.                  delay(400);
  195.                  qianjin();       
  196.                  }
  197.         /*
  198.     if(bz_l==1&&bz_z==1&&bz_r==1)
  199.          qianjin();
  200.         if(bz_l==0&&bz_z==1&&bz_r==1)
  201.          zuozhuan();
  202.          if(bz_l==0&&bz_z==0&&bz_r==1)
  203.          zuozhuan();
  204.          if(bz_l==1&&bz_z==1&&bz_r==0)
  205.          youzhuan();
  206.          if(bz_l==1&&bz_z==0&&bz_r==0)
  207.          youzhuan();
  208.          if(bz_l==1&&bz_z==0&&bz_r==1)
  209.          {
  210.                  tingzhi();
  211.                 delay(100);
  212.                 houtui();
  213.                 delay(500);
  214.                 zuozhuan();
  215.                 delay(200);
  216.                 qianjin();
  217.          }
  218.          if(bz_l==0&&bz_z==0&&bz_r==0)
  219.          {       
  220.                  tingzhi();
  221.                 delay(100);
  222.                 houtui();
  223.                 delay(500);
  224.                 zuozhuan();
  225.                 delay(200);
  226.                 qianjin();
  227.          }         */
  228. }
  229. void init()   //串口初始化
  230. {                                                                       //关中断
  231.     SCON =0x50; //串口模式1,允许接收                  
  232.     TMOD =0x20;//定时器1为模式2 8-bit自动装载方式用于产生波特率
  233.     PCON=0x00;//波特率不倍增
  234.         TH1=0xfd;//波特率9600  11.0592M
  235.         TL1=0xfd;
  236.         TH0=0xfd;
  237.         TH0=0xae;
  238.         EA=1;
  239.         ES=1;
  240.         ET0=1; //        T0中断允许
  241.         TR0=1; //        启动T0定时器
  242.         TR1=1; //        启动T1定时器
  243.         duojiguizhong=16;
  244.         duojiguizhong1=16;
  245. }
  246. void ctrl() //接收处理函数
  247. {
  248.    switch(tmp)
  249.    {        
  250.             case 1:qianjin(); break;                                                    
  251.      case 2: houtui();break;                                                                            
  252.      case 3:zuozhuan(); break;
  253.      case 4:youzhuan();break;  
  254.          case 0:tingzhi(); break;
  255.          case 7:duoji_kz();break;        //舵机         C
  256.          case 8: bizhang(); break;        //避障        D
  257.          
  258.    /*case 1:duoji_kz();qianjin(); break;                                                    
  259.      case 2:duoji_kz(); houtui();break;                                                                            
  260.      case 3:zuozhuan(); break;
  261.      case 4:youzhuan();break;  
  262.          case 0:tingzhi(); break;  */
  263.    }
  264. }
  265. void tiaosu () //调速
  266. {
  267.         switch(sudu)
  268.         {
  269.                 case 5: zhuanquan();        break;         //A
  270.                 case 6: w=75; break;         //B               
  271.         }
  272. }
  273. void main()
  274. {
  275.    init();         
  276.    while(1)
  277.    {
  278. //        xianshi( num ); //显示函数  
  279.         ctrl();
  280.         tiaosu();  
  281.    }
  282. }
  283. void time0() interrupt 1
  284. {  
  285.     TH0=0xfd;
  286.     TL0=0xae;
  287.         tt++;
  288.         pwm_lefr++;
  289. //        pwm_lefr1++;
  290.         pwmmaic();
  291.         if(tt<w)
  292.         {
  293.                 ina=1;
  294.                 inb=1;
  295.         }
  296.         else
  297.         {
  298.                 ina=0;
  299.                 inb=0;
  300.         }
  301.         if(tt==100)
  302.         {tt=0;
  303.        
  304.         num++;
  305.         if(num==9999)num=0;       
  306.         }
  307. }
  308. void ckzd() interrupt 4
  309. {
  310.         ES=0;
  311.         RI=0;
  312.         tmp=SBUF;
  313.         sudu=SBUF;
  314.         ES=1;
  315. }
复制代码
回复

使用道具 举报

ID:99359 发表于 2016-2-2 17:12 | 显示全部楼层
腾飞的龙 发表于 2016-2-2 12:01
给你个我用的蓝牙小车程序,手机APP在论坛里。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit a1=P1^0;//电机控制口
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;

uchar a;//接收蓝牙模块发送的数据

void delayxms(uint z)//调节电机转速
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void qingj()//前进
{
        a1=1;
        a2=0;
        a3=1;
        a4=0;       
}

void hout()//后退
{
        a1=0;
        a2=1;
        a3=0;
        a4=1;       
}

void youz()//右转
{
        a1=0;
        a2=0;
        a3=1;
        a4=0;
        delayxms(9);       
        a1=0;
        a2=0;
        a3=0;
        a4=0;
        delayxms(1);       
}

void zuoz()//左转
{
        a1=1;
        a2=0;
        a3=0;
        a4=0;
        delayxms(9);       
        a1=0;
        a2=0;
        a3=0;
        a4=0;
        delayxms(1);       
}

void tingz()//停止
{
        a1=0;
        a2=0;
        a3=0;
        a4=0;
}

void main()
{
        TMOD=0x20;//定时器1工作方式2,8位自动重装  
    TH1=0xFd; //11.0592M晶振,9600波特率 
    TL1=0xFd;
    SCON=0x50;//串口方式1 SM0 SM1 01 允许接收  
    PCON=0x00;//SMOD=0 16分频
    TR1=1;//打开定时器1
        ES=1;//打开串口中断   
    EA=1;//开总中断  
    //以上跟串口通信初始化有关
        while(1)
        {
                if(a=='A') qingj();//前进

                else if(a=='B') hout();//后退
               
                else if(a=='C') zuoz();//左转
               
                else if(a=='D') youz();//右转

                else tingz();//停止               
        }
}

void serial() interrupt 4//中断子函数
{
        RI=0;//清0
        a=SBUF;
}
这是我蓝牙小车的程序
回复

使用道具 举报

ID:79544 发表于 2016-2-3 11:09 | 显示全部楼层
你直接用蓝牙控制。把超声波的程序放在 比如else if(a=='D') chaoshengb();//超声波。哦你要加返回语句:break; if(a=='A') qingj();breakl//前进
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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