久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4343|回復: 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.       
復制代碼
      
                                                                                                                                 

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:304971 發表于 2018-6-12 11:46 | 只看該作者
有可能是內存泄漏導致
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费黄色大片 | 日韩久久网 | 精品视频一区二区三区在线观看 | 午夜精品一区二区三区在线播放 | 一级欧美一级日韩片免费观看 | 成人黄色在线观看 | 日韩高清一区 | 国产精品无码久久久久 | 亚洲乱码一区二区三区在线观看 | 精品一区二区电影 | 国产欧美三区 | 色接久久| 久久久久国产一级毛片 | 色偷偷人人澡人人爽人人模 | 男人午夜视频 | 最新国产精品视频 | 91精品国产综合久久久久久漫画 | 玖玖色在线视频 | a精品视频| 国产精品一区二 | 日韩网站在线观看 | 日韩国产一区二区三区 | 精品视频一区二区三区 | 日韩电影免费观看中文字幕 | 精品福利一区二区三区 | 国产精品久久国产精品 | 久久国产精品一区二区三区 | 欧美日韩国产一区 | 精品久久久久久亚洲精品 | 亚洲一区二区免费视频 | 精品毛片 | 国产一级一级毛片 | 久在线| 国产视频中文字幕 | 成人影 | 97色综合 | 成人在线免费观看 | 国产精品久久久免费 | 麻豆av在线免费观看 | 51ⅴ精品国产91久久久久久 | av中文字幕在线 |