標(biāo)題: 單片機定時器初始化后整個程序不能運行了,求大神解答! [打印本頁]

作者: 三五行天    時間: 2021-3-30 20:47
標(biāo)題: 單片機定時器初始化后整個程序不能運行了,求大神解答!
我是單片機小白,剛接觸幾天。我做的是一個智能小車,三個功能,避障、遙控、追光,分別用遙控的ABC鍵切換程序。用了定時器0來輸出pwm波調(diào)速。但是我在主函數(shù)下寫了定時器初始化函數(shù)后就怎么按鍵都不動了,去掉后三個功能正常切換運作(但是不能調(diào)速),是怎么回事呢?下附完整代碼,小白一個代碼寫得很爛,注釋有些地方還沒改,跪求大佬解答。

單片機源程序如下:
  1. //包含所需要的頭文件
  2. #include<AT89X52.h>
  3. #include< BoeBot.h>
  4. #include<uart.h>

  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. int PWMON;
  8. uchar time;
  9. double countA=30; //定義占空比A(右),并初始占空比為27%
  10. double countB=36; //定義占空比B(左),并初始占空比為30%

  11. sbit IN1=P1^0;        //輸出IN1
  12. sbit IN2=P1^1;        //輸出IN2
  13. sbit IN3=P1^2;        //輸出IN3
  14. sbit IN4=P1^3;        //輸出IN4
  15. sbit PWMA=P1^4;       //輸出PWMA
  16. sbit PWMB=P1^5;       //輸出PWMB
  17. sbit comparatorA=P3^5;   //右邊電壓比較器A
  18. sbit comparatorB=P3^3;    //左邊電壓比較器B

  19. //采用宏定義紅外發(fā)射、接收端口,便于更改端口進(jìn)行調(diào)試


  20. sbit LeftIR=P3^2;                //左邊紅外接收連接到P2_4
  21. sbit RightIR=P3^4;                    //右邊紅外接收連接到P2_5



  22. int irDetectLeft;                   //定義整型左紅外接收變量
  23. int irDetectRight;                   //定義整型右紅外接收變量


  24. /***********定時器0初始化***********/

  25. void timer0_init()
  26. {
  27. TMOD=0x01; // 定時器0設(shè)置工作模式1
  28. TH0=(65536-10)/256;
  29. TL0=(65536-10)%256;
  30. TR0=1;
  31. ET0=1;
  32. EA=1;
  33. }


  34. /**************定時0中斷處理******************/

  35. void timer0_int() interrupt 1
  36. {
  37. TR0=0; //設(shè)置定時器初值期間,關(guān)閉定時器
  38. TH0=(65536-10)/256;
  39. TL0=(65536-10)%256;

  40. TR0=1;
  41. time++;

  42. if(time<countA) //countA為占空比
  43. {
  44. PWMA=1; //輸出高電平
  45. }
  46. else
  47. PWMA=0;
  48. if(time<countB) //countB為占空比
  49. {
  50. PWMB=1; //輸出高電平
  51. }
  52. else
  53. PWMB=0;
  54. if(time>=100)
  55. {
  56. time=0;
  57. }
  58. }




  59. int P3_2state(void)                           //子函數(shù):調(diào)用后返回P2_4位的值
  60. {
  61.         return (P3&0x04)?1:0;           //將P2口八個位與0x08(00000100)進(jìn)行"與"運算,若為非零就返回1,若為零就返回零
  62. }
  63. int P3_4state(void)                           //子函數(shù):調(diào)用后返回P2_5位的值
  64. {
  65.         return (P3&0x10)?1:0;           //將P2口八個位與0x10(00010000)進(jìn)行"與"運算,若為非零就返回1,若為零就返回零
  66. }


  67. void bizhang()
  68. {               
  69.                 irDetectLeft=P3_2state();                                //調(diào)用子函數(shù),獲得左紅外接收變量值
  70.                 irDetectRight=P3_4state();                                //調(diào)用子函數(shù),獲得右紅外接收變量值
  71.                 printf("irDetectLeft=%d    ",irDetectLeft);        //利用串口輸出左紅外接收變量值
  72.                 printf("irDetectRight=%d\n",irDetectRight);                //利用串口輸出右紅外接收變量值

  73.                 delay_nms(20);                                                        //隔20毫秒后再次重復(fù)此紅外探測過程

  74.             if         (irDetectLeft==1&&irDetectRight==1)      //無障礙
  75.                 {
  76.                 IN1=1;
  77.                 IN2=0;
  78.                 IN3=1;
  79.                 IN4=0;
  80.                
  81.                 }
  82.         if         (irDetectLeft==1&&irDetectRight==0)      //右邊有障礙,左轉(zhuǎn)
  83.                 {        
  84.                 IN1=1;
  85.                 IN2=0;
  86.                 IN3=0;
  87.                 IN4=1;
  88.                 delay_nms(200);
  89.                 }
  90.         if         (irDetectLeft==0&&irDetectRight==1)      //左邊有障礙,右轉(zhuǎn)
  91.                 {        
  92.                 IN1=0;
  93.                 IN2=1;
  94.                 IN3=1;
  95.                 IN4=0;
  96.                 delay_nms(200);
  97.                 }
  98.                
  99.         if         (irDetectLeft==0&&irDetectRight==0)      //兩邊有障礙,先后退再右轉(zhuǎn)
  100.                 {         
  101.                 IN1=0;
  102.                 IN2=1;
  103.                 IN3=0;
  104.                 IN4=1;
  105.                 delay_nms(300);
  106.                 IN3=1;
  107.                 IN4=0;
  108.                 IN1=0;
  109.                 IN2=1;
  110.                 delay_nms(200);
  111.                
  112.                 }        
  113. }

  114. void zhuiguang()
  115. {
  116.    
  117.      if(comparatorA==0&&comparatorB==1) //左邊有光,右電機加速
  118.              {
  119.               IN1=1;
  120.               IN2=0;
  121.               IN3=0;
  122.               IN4=0;
  123.               }
  124.           if(comparatorA==1&&comparatorB==0) //右邊有光,左電機加速
  125.              {
  126.               IN1=0;  
  127.               IN2=0;
  128.               IN3=1;
  129.               IN4=0;
  130.               }

  131.           if(comparatorA==1&&comparatorB==1)         //兩邊有光,直行
  132.              {
  133.               IN1=1;
  134.               IN2=0;
  135.               IN3=1;
  136.               IN4=0;
  137.              }
  138.           if(comparatorA==0&&comparatorB==0)        //兩邊無光,停止
  139.              {
  140.               IN1=0;
  141.               IN2=0;
  142.               IN3=0;
  143.               IN4=0;
  144.               }
  145. }




  146. void main()                                   //無操作數(shù)主函數(shù)
  147. {
  148.         timer0_init();
  149.            
  150. while(1)
  151. {
  152.     if(P0_1==1) //如果A被按下
  153.         {         
  154.         delay_nms(10); //延時10ms,防止干擾抖動
  155.         if(P0_1==1)//確認(rèn)A按鈕按下無誤后
  156.                 {
  157.                 while(1)
  158.                   {
  159.                         bizhang();  //避障功能
  160.                       if(P0_2==1)break;
  161.                   }
  162.                 }
  163.         }


  164.         if(P0_3==1) //如果B被按下
  165.         {        
  166.         delay_nms(10); //延時10ms,防止干擾抖動
  167.         if(P0_3==1)//確認(rèn)B按鈕按下無誤后
  168.      {
  169.                 while(1)
  170.           {
  171.                      if((P0_0==0)&&(P0_1==0)&&(P0_2==0)&&(P0_3==0))//不操作遙控器
  172.                    {
  173.                 IN1=0;
  174.                 IN2=0;
  175.                 IN3=0;
  176.                 IN4=0;                  
  177.                    }
  178.                    if((P0_1==1)&&(P0_0==0)&&(P0_2==0)&&(P0_3==0))//按A鍵,左轉(zhuǎn)
  179.                 {
  180.                 IN1=1;
  181.                 IN2=0;
  182.                 IN3=0;
  183.                 IN4=1;
  184.                 delay_nms(200);
  185.                 }        
  186.                    if((P0_0==0)&&(P0_3==1)&&(P0_1==0)&&(P0_2==0))//按B鍵,右轉(zhuǎn)
  187.                 {
  188.                 IN1=0;
  189.                 IN2=1;
  190.                 IN3=1;
  191.                 IN4=0;
  192.                 delay_nms(200);
  193.                 }
  194.                 if((P0_0==1)&&(P0_3==0)&&(P0_1==0)&&(P0_2==0))//按C鍵,前進(jìn)
  195.                 {
  196.                 IN1=1;
  197.                 IN2=0;
  198.                 IN3=1;
  199.                 IN4=0;
  200.                 delay_nms(1000);
  201.                 }
  202.                 if(P0_2==1)break;
  203.            }
  204.           }
  205.      }




  206.         if(P0_0==1) //如果C被按下
  207.         {        
  208.         delay_nms(10); //延時10ms,防止干擾抖動
  209.                 if(P0_0==1)//確認(rèn)C按鈕按下無誤后
  210.                 {
  211.                 while(1)
  212.                   {
  213.                         zhuiguang();  //追光功能
  214.                       if(P0_2==1)break;
  215.                   }
  216.                 }
  217.          }
  218.         if(P0_2==1) //如果D被按下
  219.         {        
  220.         delay_nms(10); //延時10ms,防止干擾抖動
  221.                 if(P0_2==1)//確認(rèn)D按鈕按下無誤后
  222.                 {
  223.           IN1=0;
  224.           IN2=0;
  225.           IN3=0;
  226.           IN4=0;
  227.                 }
  228.         }
  229.   }                                                                                                
  230. }



復(fù)制代碼



作者: 三五行天    時間: 2021-3-31 16:06
在第178行
作者: jianuli    時間: 2021-3-31 20:18
我遇到定時器定200微秒時程序像卡住一樣,運行超慢,你會不會也是這樣?
作者: tyrl800    時間: 2021-3-31 20:50
時間都用在定時器中斷了
作者: yhang18    時間: 2021-3-31 21:05
  49   void timer0_int ()
178          timer0_init()
馬虎了你,呵呵。找出不一樣的地方




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1