找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1543|回复: 4
收起左侧

单片机定时器初始化后整个程序不能运行了,求大神解答!

[复制链接]
ID:898731 发表于 2021-3-30 20:47 | 显示全部楼层 |阅读模式
我是单片机小白,刚接触几天。我做的是一个智能小车,三个功能,避障、遥控、追光,分别用遥控的ABC键切换程序。用了定时器0来输出pwm波调速。但是我在主函数下写了定时器初始化函数后就怎么按键都不动了,去掉后三个功能正常切换运作(但是不能调速),是怎么回事呢?下附完整代码,小白一个代码写得很烂,注释有些地方还没改,跪求大佬解答。

单片机源程序如下:
  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. //采用宏定义红外发射、接收端口,便于更改端口进行调试


  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设置工作模式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; //设置定时器初值期间,关闭定时器
  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)                           //子函数:调用后返回P2_4位的值
  60. {
  61.         return (P3&0x04)?1:0;           //将P2口八个位与0x08(00000100)进行"与"运算,若为非零就返回1,若为零就返回零
  62. }
  63. int P3_4state(void)                           //子函数:调用后返回P2_5位的值
  64. {
  65.         return (P3&0x10)?1:0;           //将P2口八个位与0x10(00010000)进行"与"运算,若为非零就返回1,若为零就返回零
  66. }


  67. void bizhang()
  68. {               
  69.                 irDetectLeft=P3_2state();                                //调用子函数,获得左红外接收变量值
  70.                 irDetectRight=P3_4state();                                //调用子函数,获得右红外接收变量值
  71.                 printf("irDetectLeft=%d    ",irDetectLeft);        //利用串口输出左红外接收变量值
  72.                 printf("irDetectRight=%d\n",irDetectRight);                //利用串口输出右红外接收变量值

  73.                 delay_nms(20);                                                        //隔20毫秒后再次重复此红外探测过程

  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)      //右边有障碍,左转
  83.                 {        
  84.                 IN1=1;
  85.                 IN2=0;
  86.                 IN3=0;
  87.                 IN4=1;
  88.                 delay_nms(200);
  89.                 }
  90.         if         (irDetectLeft==0&&irDetectRight==1)      //左边有障碍,右转
  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)      //两边有障碍,先后退再右转
  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()                                   //无操作数主函数
  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)//确认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)//确认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键,左转
  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键,右转
  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键,前进
  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)//确认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)//确认D按钮按下无误后
  222.                 {
  223.           IN1=0;
  224.           IN2=0;
  225.           IN3=0;
  226.           IN4=0;
  227.                 }
  228.         }
  229.   }                                                                                                
  230. }



复制代码


回复

使用道具 举报

ID:898731 发表于 2021-3-31 16:06 | 显示全部楼层
在第178行
回复

使用道具 举报

ID:777834 发表于 2021-3-31 20:18 来自手机 | 显示全部楼层
我遇到定时器定200微秒时程序像卡住一样,运行超慢,你会不会也是这样?
回复

使用道具 举报

ID:275826 发表于 2021-3-31 20:50 | 显示全部楼层
时间都用在定时器中断了
回复

使用道具 举报

ID:301978 发表于 2021-3-31 21:05 | 显示全部楼层
  49   void timer0_int ()
178          timer0_init()
马虎了你,呵呵。找出不一样的地方
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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