找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3847|回复: 1
收起左侧

stc60s2单片机运行一段时间就死机了,复位后用能运行

[复制链接]
ID:318095 发表于 2018-6-12 09:52 | 显示全部楼层 |阅读模式
程序是循环使用超声波传感器测距  刚开始时正常工作,工作一两分钟后就死机了这是程序
   //本程序为单机测试程序,大板可用  
//本程序采用中断形式接收指令,同时在进入中断程序之后对所有控制指令进行停止
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<intrins.h>

  4. #define  DIZHI  'C'

  5. sfr        CMOD=0XD9;//工作模式寄存器
  6. sfr        CCON=0XD8;//控制寄存器
  7. sfr      CCAPM0=0XDA;//模块0比较、捕获寄存器
  8. sfr      CCAPM1=0XDB;//模块1比较、捕获寄存器
  9. sfr          CH=0XF9;//可编程计数器高8位
  10. sfr                     CL=0Xe9;//可编程计数器低8位
  11. sfr      CCAP0H=0XFA;//捕获、比较寄存器0高8位
  12. sfr      CCAP0L=0XEA;//捕获、比较寄存器0低8位
  13. sfr      CCAP1H=0XFB;//捕获、比较寄存器1高8位
  14. sfr      CCAP1L=0XEB;//捕获、比较寄存器1低8位
  15. sfr     PCAPWM0=0XF2;//模块0的PWM寄存器
  16. sfr     PCAPWM1=0XF3;//模块1的PWM寄存器
  17. sfr        AUXR=0X8E;//多路开关寄存器
  18. sfr         BRT=0X9C;//独立波特率发生器
  19. sfr       P1ASF=0X9D;//P1口模拟通道选择寄存器
  20. sfr   ADC_CONTR=0XBC;//ADC控制寄存器
  21. sfr     ADC_RES=0XBD;//ADC结果寄存器高8位
  22. sfr    ADC_RESL=0XBE;//ADC结果寄存器低2位
  23. sfr        P4SW=0XBB;//设置P4.4/5/6引脚为IO口
  24. sfr          P4=0XC0;
  25. sfr   IAP_CONTR=0XC7;        //与复位相关寄存器
  26. sfr       AUXR1=0XA2;//可以将P1口迁移到P4口
  27. sbit       EADC=IE^5;//ADC中断允许位
  28. sbit       CR=CCON^6;//PWM时钟输入位
  29. sbit         b1=P2^3;//继电器——左——上前12V
  30. sbit         b2=P2^2;//继电器——左——下后12V
  31. sbit         b3=P2^0;//继电器——左——角度
  32. sbit         b4=P2^1;//继电器——左——距离
  33. sbit        b11=P2^6;//继电器——右——上前12V
  34. sbit        b21=P2^7;//继电器——右——下后12V
  35. sbit        b31=P2^4;//继电器——右——角度
  36. sbit        b41=P2^5;//继电器——右——距离
  37. sbit      trig1=P1^5;//         j9 6
  38. sbit      echo1=P1^4;//         5
  39. sbit      trig2=P1^7;//             8
  40. sbit      echo2=P1^6;//             7
  41. sbit      trig3=P0^3;//        10
  42. sbit      echo3=P0^2;//        9
  43. sbit      trig4=P0^5;//        12
  44. sbit      echo4=P0^4;//        11
  45. sbit          d=P0^6;//灯——手动和自动选择指示灯
  46. sbit         d1=P0^7;//灯——亮表示左腿调平机构到位
  47. sbit         d2=P4^6;//灯——亮表示右腿调平机构到位
  48. sbit        w11=P0^0;//左电机方向
  49. sbit        w21=P0^1;//右电机方向
  50. sbit         Q3=P4^4;//左电机开关
  51. sbit         Q4=P4^5;//上升
  52. sbit         Q5=P3^6;//下降
  53. sbit         Q6=P3^4;//右电机开关
  54. sbit        pxx=P4^0;//多机通信判断是否有人占用T总线

  55. int   c1,m1,m2,m3;//m1上位机发送的角度值,m2上位机发送的前后距离值,m3上位机发送的上升距离值,
  56. float a0,a1,a2,a3,b,b01;

  57. bit   dbzh,c5,c51,tzb=0;
  58. unsigned char kzh;//kzh点动控制数据

  59. float ceju(int b)  //测距离
  60. {          int k=0;float a;
  61.     // ES=0;
  62.      loop0:
  63.                TH0=0X00;
  64.                TL0=0X00;
  65.                  if(b==1)//左腿——前后距离测量
  66.                    {
  67.                            trig1=1;
  68.                            k++;k++;k++;k++;k++;k++;k++;k++;k++;k++;
  69.                            trig1=0;
  70.                            while(!echo1);
  71.                            TR0=1;
  72.                            while(echo1);
  73.                            a=TH0*256+TL0;
  74.                        a=a*12*17;
  75.                        TR0=0;
  76.                    }
  77.                    if(b==2)//右腿——前后距离测量
  78.                    {
  79.                        trig2=1;
  80.                            k++;k++;k++;k++;k++;k++;k++;k++;k++;
  81.                            trig2=0;
  82.                            while(!echo2);
  83.                            TR0=1;
  84.                            while(echo2);
  85.                        a=TH0*256+TL0;
  86.                        a=a*12*17;
  87.                        TR0=0;
  88.                    }  
  89.                    if(b==3)//左腿上升下降距离
  90.                    {
  91.                            trig3=1;
  92.                            k++;k++;k++;k++;k++;k++;k++;k++;k++;
  93.                            trig3=0;                           
  94.                            while(!echo3);
  95.                            TR0=1;                           
  96.                            while(echo3);
  97.                            a=TH0*256+TL0;
  98.                        a=a*12*17;
  99.                        TR0=0;
  100.                            
  101.                    }
  102.                    if(b==4)//右腿上升下降距离
  103.                    {
  104.                        trig4=1;
  105.                            k++;k++;k++;k++;k++;k++;k++;k++;k++;
  106.                            trig4=0;
  107.                            while(!echo4);
  108.                            TR0=1;
  109.                            while(echo4);
  110.                        a=TH0*256+TL0;
  111.                        a=a*12*17;
  112.                        TR0=0;
  113.                    }
  114.                    a=(a/11059.2)+0.7;        //修正误差
  115.                    if(a<2) goto loop0;
  116.                    return a;
  117.           //ES=1;
  118. }
  119. float jiaodu(int b)         //        角度测量
  120. {         char i;float a1;
  121.      if(b==1)   ADC_CONTR=0XEA;
  122.          else       ADC_CONTR=0XEB;
  123.      i++;i++;//可以没有,有是为了读取ADC_CONTR时更加可靠;
  124.      while(!(ADC_CONTR&0X10));
  125.      ADC_CONTR=0XE0;
  126.      a1=(ADC_RES*4+ADC_RESL)*3.26/1024;           
  127.      if(b==1)    a1=-38.141*a1*a1*a1*a1+101.23*a1*a1*a1-25.47*a1*a1-201.9*a1+274.58;//zuo角度传感器
  128.          else        a1=-31.349*a1*a1*a1*a1+91.498*a1*a1*a1+7.381*a1*a1-306.34*a1+383.6;//右角度传感器
  129.          return  a1;
  130. }
  131. void songxian(float a)        // 串口送显
  132. {           float b1,c1;int b,c;char data x[8],i;
  133.        c1=modf(a,&b1);
  134.            b=(int)(b1);
  135.            c=(int)(1000*c1);                  
  136.                x[0]=0x30+b/100;
  137.                    x[1]=0x30+b/10-10*(b/100);
  138.                    x[2]=0x30+b-10*(b/10);
  139.                    x[3]=0x2e;
  140.                    x[4]=0x30+c/100;
  141.                    x[5]=0x30+c/10-10*(c/100);
  142.                    x[6]=0x20;;
  143.                    x[7]='\0';
  144.           // ES=0;  //关闭中断,采用查询发送,数据传输更快
  145.            for(i=0;i<8;i++)
  146.            {   if((x[i]==0x30)&&(i<2))
  147.                   {    if(!(x[0]==0x30))
  148.                                     {          SBUF=x[i];
  149.                                   while(!TI);
  150.                                   TI=0;
  151.                                              }
  152.                                    else
  153.                                     {    SBUF=0x20;
  154.                                  while(!TI);
  155.                                  TI=0;
  156.                                                 }
  157.                           }
  158.                    else {  SBUF=x[i];
  159.                        while(!TI);
  160.                         TI=0;
  161.                                 }
  162.             }
  163.         //        ES=1;
  164. }
  165. void delay(int a)
  166. {
  167. int i,j;
  168.   for(i=1;i<a;i++)
  169.    for(j=1;j<=500;j++);
  170. }
  171. void anjiankongzhi(char i)         //手动控制模块
  172. {  
  173.           int k,j;
  174.       d=0;
  175.           while(1)
  176.           {  
  177.                
  178.                         
  179.                           for(k=1;i<200;k++)
  180.                for(j=1;j<=500;j++);

  181.                  a0=ceju(1);
  182.                           
  183.                          a1=ceju(2);  
  184.                           
  185.                          a2=ceju(3);  
  186.                           
  187.                          a3=ceju(4);   
  188.                         
  189.                          b=jiaodu(1);  
  190.                         
  191.                          b01=jiaodu(2);  
  192.                         
  193.                  
  194.                
  195.                  if(i==1) // 手动控制--左右腿同步上下移
  196.                  {
  197.                          /*   a=ceju(3);// 左腿距离
  198.                                 songxian(a);
  199.                                 a=ceju(4);// 右腿距离
  200.                                 songxian(a);*/        
  201.                                 if(Q3==0)      CCAPM0=0X42;
  202.                                 else           CCAPM0=0X40;               
  203.                                 if(Q6==0)      CCAPM1=0X42;
  204.                                 else           CCAPM1=0X40;
  205.                                 if(Q4==0)   {w11=1;w21=1;while(!Q4);}
  206.                                 if(Q5==0)        {w11=0;w21=0;while(!Q5);}
  207.                   }
  208.                   if(i==2)//左腿下模块控制
  209.                   {
  210.                          /*          a=ceju(1);// 左距离
  211.                                  songxian(a);
  212.                                  a=jiaodu(1); //左角度
  213.                                  songxian(a);         */
  214.                                  if(Q6==0)         { b1=1;b2=0;b3=0; }//角度向上走
  215.                                   if(Q5==0)         { b1=0;b2=1;b3=0; }//角度向下走
  216.                                  if(Q3==0)         { b1=1;b2=0;b4=0; }//距离向前走
  217.                                   if(Q4==0)         { b1=0;b2=1;b4=0; }//距离向后走
  218.                                  if((Q6==1)&&(Q5==1)&&(Q3==1)&&(Q4==1))  {b1=1;b2=1;b3=1;b4=1;}
  219.                   }
  220.                   if(i==3)//右腿下模块控制
  221.                   {
  222.                         /*         a=ceju(2);// 右距离
  223.                                  songxian(a);
  224.                                  a=jiaodu(2); //右角度
  225.                                  songxian(a);  */
  226.                                  if(Q6==0)         { b11=1;b21=0;b31=0; }//角度向上走
  227.                                   if(Q5==0)         { b11=0;b21=1;b31=0; }//角度向下走
  228.                                  if(Q3==0)         { b11=1;b21=0;b41=0; }//距离向前走
  229.                                   if(Q4==0)         { b11=0;b21=1;b41=0; }//距离向后走
  230.                                  if((Q6==1)&&(Q5==1)&&(Q3==1)&&(Q4==1))  {b11=1;b21=1;b31=1;b41=1;}
  231.                   }
  232.                  
  233.                 }
  234. }

  235. void s1() interrupt 4         //中断接收数据,能提高实时性,发送采用查询更快
  236. {
  237.     int zh,i,j;
  238.     bit pb;        
  239.         ES=0;
  240.         if(d==0){pb=1;}
  241.          else pb=0;        
  242.         if(RI==1)
  243.         {
  244.                 RI=0;
  245.                 SM2=0;
  246.                 zh=SBUF;
  247.             if(DIZHI==zh)
  248.                 {         
  249.                           CCAPM0=0x40;         //         左腿停止工作 防止在接收数据期间发生碰撞
  250.                           CCAPM1=0x40;         //         右腿停止工作 防止在接收数据期间发生碰撞
  251.                           b1=1;b2=1;b3=1;b4=1; b11=1;b21=1;b31=1;b41=1;//让所有继电器停止工作,防止位姿机构卡死
  252.                           while(!RI);
  253.                           RI=0;
  254.                           zh=SBUF;// 接收数据包标志位
  255.                           if(dbzh!=1)        
  256.                           {
  257.                                   switch(zh)//自动控制接收数据模块
  258.                                   {
  259.                                      case 0x31: while(RI==0);
  260.                                                         RI=0;
  261.                                                                 m3=SBUF-0x30;//接收抬高控制数据
  262.                                                                 while(RI==0);
  263.                                                         RI=0;
  264.                                                                 m2=SBUF-0x30;//接收位姿伸缩控制数据
  265.                                                                 while(RI==0);
  266.                                                         RI=0;
  267.                                                                 m1=SBUF-0x30;//接收位姿角度控制数据
  268.                                                                 while(pxx==0);
  269.                                                                 pxx=0;
  270.                                                                 TB8=1;SBUF=DIZHI;
  271.                                                                 while(!TI);TI=0;
  272.                                                                 TB8=0;SBUF=0x31;
  273.                                                                 while(!TI);TI=0;
  274.                                                                 songxian(a2);songxian(a3);
  275.                                                                 songxian(a0);songxian(b);
  276.                                                                 songxian(a1);songxian(b01);
  277.                                                                 songxian(0);songxian(0);
  278.                                                                         TB8=0;SBUF='S'        ;while(!TI);TI=0;
  279.                                                                 pxx=1;
  280.                                                         
  281.                                                         
  282.                                                                
  283.                                          case 0x32:if((c5!=0)||(c51!=0)||(pb==1))//c5=0;c51=0; 表示所有控制指令已经完成
  284.                                                 {
  285.                                                                 while(pxx==0);
  286.                                                                 pxx=0;
  287.                                                                 TB8=1;SBUF=DIZHI;
  288.                                                                 while(!TI);TI=0;
  289.                                                                 TB8=0;SBUF=0x32;
  290.                                                                 while(!TI);TI=0;
  291.                                                             songxian(a2);
  292.                                                                 songxian(a3);
  293.                                                             songxian(a0);
  294.                                                                 songxian(b);
  295.                                                              songxian(a1);
  296.                                                                 songxian(b01);
  297.                                                             songxian(0);
  298.                                                                 songxian(0);
  299.                                                                         TB8=0;SBUF='S'        ;while(!TI);TI=0;
  300.                                                             pxx=1;
  301.                                                                 break;
  302.                                                         }
  303.                                                         else
  304.                                                         {
  305.                                                                 while(pxx==0);
  306.                                                                 pxx=0;
  307.                                                                 TB8=1;SBUF=DIZHI;
  308.                                                                 while(!TI);TI=0;
  309.                                                                 TB8=0;SBUF=0x33;
  310.                                                                 while(!TI);TI=0;
  311.                                                         songxian(a2);songxian(a3);
  312.                                                                 songxian(a0);songxian(b);
  313.                                                                 songxian(a1);songxian(b01);
  314.                                                                 songxian(0);songxian(0);
  315.                                                                         TB8=0;SBUF='S'        ;while(!TI);TI=0;
  316.                                                                 pxx=1;
  317.                                                                 break;
  318.                                                         }
  319.                                          case 0x35: d=0; //在多机情况下,表示烧写程序使用
  320.                                                     for(i=0;i<5000;i++)
  321.                                                                    for(j=0;j<500;j++);
  322.                                                             d=1;
  323.                                                                 IAP_CONTR=0x60; //        与复位相关的操作
  324.                                                                 break;              
  325.                                   }
  326.                         }

  327.                                  
  328.                 }
  329.         TI=0;SM2=1;
  330.         }

  331.         ES=1;  
  332.         
  333. }

  334. void main()
  335. {
  336.       float d11,d12,d13;
  337.           int i,j,k,m,bzh=0;
  338.           bit e3,e4;
  339.           //初始化
  340.           BRT=0XFD;        
  341.           AUXR=0X11;
  342.           TMOD=0X01;
  343.           SCON=0Xf8;
  344.           P1ASF=0X0C; //记住一定要把当ADC通道的引脚一定要值1;
  345.           ADC_CONTR=0XE0;
  346.           EADC=0;
  347.           EA=1;
  348.           ES=1;
  349.           trig1=0;
  350.           echo1=1;
  351.           trig2=0;
  352.           echo2=1;
  353.           trig3=0;
  354.           echo3=1;
  355.           trig4=0;
  356.           echo4=1;                    
  357.           CMOD=0X00;  //控制输出速度
  358.           CL=0;
  359.           CH=0;
  360.       CCAP1H=CCAP1L=0X80;
  361.           CCAP0H=CCAP0L=0X80;
  362.           PCAPWM0=0;
  363.              PCAPWM1=0;
  364.           CCAPM0=0X40;
  365.           CCAPM1=0X40;
  366.           AUXR1=0X40;//将PWM口搬迁到P4口
  367.           CR=1;
  368.           P4SW=0X70;
  369.           pxx=1;
  370.           IAP_CONTR=0x40;  //与复位相关的操作
  371.           b1=1;b2=1;b3=1;b4=1;d=1;d1=1;d2=1;b11=1;b21=1;b31=1;b41=1;
  372.            dbzh=0;

  373.                
  374.           for(k=0;k<6;k++)//手动和自动选择部分
  375.           {          m++;d=m%2;
  376.               for(i=0;i<600;i++)                                                                        
  377.                         for(j=0;j<1000;j++);
  378.                   
  379.                     if(Q3==0)        { while(!Q3); anjiankongzhi(1); }//抬高机构按键
  380.                     if(Q6==0)        { while(!Q6); anjiankongzhi(2); }//左位姿调节机构按键
  381.                     if(Q5==0)        { while(!Q5); anjiankongzhi(3); }//右位姿调节机构按键
  382.                         if(Q4==0)        { while(!Q4); dbzh=1;break; }//上位机点动
  383.           }
  384.           d=1;
  385.           i=0;
  386.           while(1)//空循环
  387.           {;  }

  388.           }
  389.    }
  390.       
复制代码
      
                                                                                                                                 

回复

使用道具 举报

ID:304971 发表于 2018-6-12 11:46 | 显示全部楼层
有可能是内存泄漏导致
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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