找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3951|回复: 3
收起左侧

单片机中断有问题,P00=0的时候进不去

[复制链接]
ID:262 发表于 2016-3-11 23:30 | 显示全部楼层 |阅读模式

  1.         #include<AT89x51.H>

  2.         #define Left_moto_pwm     P1_6           //接驱动模块ENA        使能端,输入PWM信号调节速度
  3.         #define Right_moto_pwm    P1_7           //接驱动模块ENB

  4.         sbit P00=P0^0;

  5.         sbit P10=P1^0;          //循迹口
  6.         sbit P11=P1^1;
  7.         sbit P12=P1^2;
  8.         sbit P13=P1^3;
  9.         sbit P14=P1^4;


  10.         #define Left_moto_go      {P3_4=0,P3_5=1;} //P3_4 P3_5 接IN1  IN2    当 P3_4=0,P3_5=1; 时左电机前进
  11.         #define Left_moto_back    {P3_4=1,P3_5=1;} //P3_4 P3_5 接IN1  IN2    当 P3_4=1,P3_5=0; 时左电机后退               
  12.         #define Right_moto_go     {P3_6=0,P3_7=1;} //P3_6 P3_7 接IN1  IN2         当 P3_6=0,P3_7=1; 时右电机前转
  13.         #define Right_moto_back   {P3_6=1,P3_7=1;} //P3_6 P3_7 接IN1  IN2         当 P3_6=1,P3_7=0; 时右电机后退

  14.            unsigned char pwm_val_left  =0;//变量定义
  15.         unsigned char push_val_left =0;// 左电机占空比N/10
  16.         unsigned char pwm_val_right =0;
  17.         unsigned char push_val_right=0;// 右电机占空比N/10
  18.         bit Right_moto_stop=1;
  19.         bit Left_moto_stop =1;
  20.         unsigned  int  time=0;
  21.         int i;

  22. /************************************************************************/
  23.      void  run(void)        //前进函数
  24. {
  25.      push_val_left  =10;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  26.          push_val_right =5;         //PWM 调节参数1-10   1为最慢,10是最快         改这个值可以改变其速度
  27.         // Left_moto_go ;                 //左电机前进
  28.         // Right_moto_go ;         //右电机前进
  29. }

  30. /************************************************************************/
  31. /*                    PWM调制电机转速                                   */
  32. /************************************************************************/
  33. /*                    左电机调速                                        */
  34. /*调节push_val_left的值改变电机转速,占空比            */
  35.                 void pwm_out_left_moto(void)
  36. {  
  37.    if(Left_moto_stop)
  38.    {
  39.     if(pwm_val_left<=push_val_left)
  40.                Left_moto_pwm=1;
  41.         else
  42.                Left_moto_pwm=0;
  43.         if(pwm_val_left>=10)
  44.         pwm_val_left=0;
  45.    }
  46.    else  Left_moto_pwm=0;
  47. }
  48. /******************************************************************/
  49. /*                    右电机调速                                  */  
  50.    void pwm_out_right_moto(void)
  51. {
  52.   if(Right_moto_stop)
  53.    {
  54.     if(pwm_val_right<=push_val_right)
  55.                Right_moto_pwm=1;
  56.         else
  57.                Right_moto_pwm=0;
  58.         if(pwm_val_right>=10)
  59.         pwm_val_right=0;
  60.    }
  61.    else    Right_moto_pwm=0;
  62. }
  63. /***************************************************/
  64. ///*TIMER0中断服务子函数产生PWM信号*/
  65.         void timer0()interrupt 1   using 2
  66. {
  67.      TH0=0XF8;          //1Ms定时
  68.          TL0=0X30;
  69.          time++;
  70.          pwm_val_left++;
  71.          pwm_val_right++;
  72.          pwm_out_left_moto();
  73.          pwm_out_right_moto();
  74. }        
  75. /***************************************************/

  76.   void xiong() interrupt 3
  77. {         
  78.   if(P10==0&&P11==0&&P12==1&&P13==0&&P14==0)  //小车直线快走  定时0.002ms                                 
  79.            {
  80.             push_val_left  =6;  
  81.             push_val_right =6;
  82.             TH1=0XFF;
  83.             TL1=0xFe;
  84.             Left_moto_go;
  85.                 Right_moto_go;
  86.          }

  87.   if(P10==0&&P11==0&&P12==0&&P13==1&&P14==0)                          //小车右转小                定时0.005ms         
  88.    {                                       
  89.                push_val_left  =5;  
  90.             push_val_right =4;                          
  91.             TH1=0XFF;
  92.             TL1=0Xfb;
  93.             Left_moto_go;
  94.                 Right_moto_back;
  95.    }
  96.      if(P10==0&&P11==0&&P12==0&&P13==0&&P14==1)                          //小车右转大                定时0.005ms         
  97.    {                                       
  98.                push_val_left  =6;  
  99.             push_val_right =3;                          
  100.             TH1=0XFF;
  101.             TL1=0Xfb;
  102.             Left_moto_go;
  103.                 Right_moto_back;
  104.    }
  105.                                        
  106.     if(P10==0&&P11==1&&P12==0&&P13==0&&P14==0)                  //小车左转小                        定时0.005ms
  107.        {
  108.             push_val_left  =4;  
  109.             push_val_right =5;
  110.         TH1=0XFF;
  111.         TL1=0XFb;
  112.         Right_moto_go;
  113.             Left_moto_back;      
  114.               }        
  115.                    if(P10==1&&P11==0&&P12==0&&P13==0&&P14==0)                  //小车左转大                        定时0.005ms
  116.        {
  117.             push_val_left  =3;  
  118.             push_val_right =6;
  119.         TH1=0XFF;
  120.         TL1=0XFb;
  121.         Right_moto_go;
  122.             Left_moto_back;      
  123.               }                        
  124.          if(P11==1&&P12==1&&P13==1&&i==1)
  125.                  {
  126.                           push_val_left  =0;  
  127.                              push_val_right =8;
  128.                           TH1=0XFc;
  129.                       TL1=0X30;
  130.                       Right_moto_go;
  131.                           Left_moto_back;
  132.                           i++;        
  133.                 }
  134.          if(P11==1&&P12==1&&P13==1&&i==2)
  135.                  {
  136.                           push_val_left  =8;  
  137.                              push_val_right =0;
  138.                           TH1=0XFc;
  139.                       TL1=0X30;
  140.                       Right_moto_back;
  141.                           Left_moto_go;
  142.                           i++;        
  143.                 }                        
  144.          if(P11==1&&P12==1&&P13==1&&i==3)
  145.          {                                                                                    //全部检测到黑线时 车停
  146.                   TH1=0XFF;
  147.               TL1=0Xfb;
  148.           Right_moto_back;
  149.               Left_moto_back;
  150.                   i==3;
  151.           }        
  152.             if(P00==0)                                   
  153.            {
  154.             push_val_left  =8;  
  155.             push_val_right =8;
  156.             TH1=0XFF;
  157.             TL1=0x30;
  158.             Left_moto_go;
  159.                 Right_moto_go;
  160.          }
  161. }
  162.         void main(void)
  163. {
  164.         TMOD=0X11;
  165.         TH0= 0XF8;                  //1ms定时
  166.         TL0= 0X30;
  167.         TR0= 1;
  168.         ET0= 1;
  169.         TH1=0XFF;
  170.         TL1=0Xfb;
  171.         TR1=1;
  172.         ET1=1;
  173.         EA =1;
  174.     P00=0;

  175.          
  176.         while(1)                                                        /*无限循环*/
  177.         {                                          // P10=0;P11=0;P12=1;P13=0;P14=0;
  178.         if(P10==0&&P11==0&&P12==1&&P13==0&&P14==0)                           // 小车直走           定时0.002ms                 
  179.          {
  180.          TH1=0XFF;                  //定时0.01ms
  181.          TL1=0xFe;
  182.          TR1=1;
  183.          }
  184.         if(P10==0&&P11==0&&P12==0&&P13==1&&P14==0)                  //小车右转                定时0.005ms         
  185.   {
  186.    TH1=0XFF;
  187.    TL1=0Xfb;
  188.    TR1=1;  
  189.   }        
  190.           if(P10==0&&P11==0&&P12==0&&P13==0&&P14==1)                  //小车右转                定时0.005ms         
  191.   {
  192.    TH1=0XFF;
  193.    TL1=0Xfb;
  194.    TR1=1;  
  195.   }         
  196.           if(P10==0&&P11==1&&P12==0&&P13==0&&P14==0)                  //小车左转                定时0.005ms                        
  197.   {
  198.    TH1=0XFF;
  199.    TL1=0XFb;
  200.    TR1=1;
  201.   }
  202.             if(P10==1&&P11==0&&P12==0&&P13==0&&P14==0)                  //小车左转                定时0.005ms                        
  203.   {
  204.    TH1=0XFF;
  205.    TL1=0XFb;
  206.    TR1=1;
  207.   }
  208.     if(P11==1&&P12==1&&P13==1&&i==1)                  //十字左转
  209.                 {
  210.                         TH1=0XFc;
  211.                         TL1=0X30;
  212.                         TR1=1;        
  213.                 }
  214.    if(P11==1&&P12==1&&P13==1&&i==2)                   //十字右转
  215.                 {
  216.                         TH1=0XFc;
  217.                         TL1=0X30;
  218.                         TR1=1;               
  219.                 }
  220.     if(P11==1&&P12==1&&P13==1&&i==3)                           //全部检测到黑线时 车停
  221.           {
  222.            TH1=0XFF;
  223.        TL1=0Xfb;
  224.        TR1=1;
  225.           }        
  226.            if(P00==0)
  227.            {
  228.              TH1=0XFF;                  //定时1s
  229.                  TL1=0x30;
  230.                  TR1=1;
  231.            }
  232. }
  233. }  
复制代码


回复

使用道具 举报

ID:262 发表于 2016-3-11 23:30 | 显示全部楼层
51黑有你更精彩!
回复

使用道具 举报

ID:72781 发表于 2016-3-12 01:22 | 显示全部楼层
是不是你没有锁定P00=0啊,也就是你在主循环中P00=0;把定时器设置成定时1秒,一秒的时间太长了,在这个时间内,有其他情况发生,比如十字左转发生,把定时器的设置的时间又改了,因为51的话是定时器的时间改了以后就用新值重新定时的,还有,或者在定时过程中,P00是等于0,一秒后,当进入中断了,P00不等于0了,相当于在中断中P00==0的if不能执行直接被跳过
回复

使用道具 举报

ID:72781 发表于 2016-3-12 01:26 | 显示全部楼层
我的建议是,在定时器中设置一个标志位,未进中断前,标志为为0,进入中断后设为1,并且关闭定时器。在主循环中用if(P00==0){TH=XX,TL=XX;TR=1;XX;while(flag标志位==0);一秒时间到执行函数xx;xx;flag=0清零}下一个IF},另外,没有仔细看程序,回答的可能不到点子上,如果有误请原谅,欢迎讨论。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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