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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1273|回復: 5
打印 上一主題 下一主題
收起左側

C51單片機通訊程序問題,收、發沖突

[復制鏈接]
跳轉到指定樓層
樓主
51單片機收發問題。C51單片機向外以1秒10次發送數據,會影響接收,偶爾收不到控制指令。RS422通信。我測試過,如果屏蔽掉單片機的發送,接收指令不會出問題。向外發送的頻率越低,接收指令丟失的問題概率也越低。

單片機源程序如下:
  1. #include <reg52.h> //最新的版本,擁有新的不發送控制和防止出錯處理控制有四處。改為新的焦距表75-375mm  2013-09
  2. #include <math.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define low2(x,y)   ((((int)(x))<<2)+((int)(y)))
  6. #define gaodi8(x,y) ((((int)(x))<<8)+((int)(y)))
  7. #define DZHZj  0x66               //聚焦堵轉值  c5    L298可調電流范圍-1~2.3V,需要時可以調整
  8. #define DZHZb  0x66               //變焦堵轉值  c4    07,08                              
  9. #define DZHZg  0x50               //光圈堵轉值  c2    01                                 

  10. uchar    data_tmp[7];              //
  11. uchar  rdata_tmp[10];              //
  12. uchar  sdata_tmp[10];              //
  13. sfr       AUXR= 0x8e;              //12倍頻
  14. sfr     wd_con= 0xe1;              //看門狗的控制字。
  15. bit idata flg=0;                   //中斷標志
  16. bit idata slg=0;                   //設定值指令標志;

  17. //uchar bdata data1=0;            //數據的位操作;與第二種方法都數值函數連用:dukou2();
  18. //sbit x0=data1^0;
  19. //sbit x1=data1^1;
  20. ////////////////////////////////////////ad的轉換的頭文件////////////////////////////////////////////////////////
  21. sfr adc_contr=0xc5;               //
  22. sfr adc_data=0xc6;                //
  23. sfr adc_low2=0xbe;                //
  24. sfr p1m0=0x91;                    //
  25. sfr p1m1=0x92;
  26. uchar ad[4][2]={
  27.                 {0x00,0x00},  //7
  28.                 {0x00,0x00},  //6
  29.                 {0x00,0x00},  //5
  30.                 {0x00,0x00}}; //4 //
  31. uchar code adc_channel[4]={0xe7,0xe6,0xe5,0xe4};
  32. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33.                                    //
  34. sbit P1_2  = P1^2;                   //
  35. sbit P1_3  = P1^3;                   //
  36. sbit  ad4  = P1^4;                   //
  37.                                   //
  38. sbit key=P3^7;                    //
  39. sbit P1_0=P1^0;                   //
  40. sbit P1_1=P1^1;                   //
  41.                                   //第二個電機控制 變焦電動機;指令: C4  驅動電壓為+12V。 指令過后鎖定控制
  42. sbit P3_2=P3^2;                   //
  43. sbit P3_3=P3^3;                   //
  44. sbit ad6=P1^6;                    //
  45. sbit ad5=P1^5;                    //
  46.                                   //第一個電機控制  聚焦電動機;指令:C5  驅動電壓為+12V。 指令過后鎖定控制
  47. sbit P3_4=P3^4;                   //
  48. sbit P3_5=P3^5;                   //
  49. sbit ad7=P1^7;                    //
  50. //uchar ky;                       //
  51. uchar kk[4][3]=                   //電機正反轉控制量;
  52. {{0x00,0x00,0x00},                //
  53. {0x00,0x00,0x00},                //
  54. {0x00,0x00,0x00},                //
  55. {0x00,0x00,0x00}};               //
  56. uchar bb=0;                       //
  57. uchar xx=0;                       //
  58. uint jj=0;                        //查表的序號;

  59. uint shedz=0;
  60. uchar jjub[2]={0x00,0x00};         //查表緩沖數組;
  61. int Fwei=102;                       //Fwei=51-1;

  62. //20181213更新ceduib表格:
  63. //1、微調兩端電壓對應的焦距值,原來為75和375,改為74和379,留出裕量防止高低溫到不了75和375
  64. uchar code ceduib[103][4]=
  65. {
  66.         {0x32,0xC0,0x00,0x4A},{0x32,0xC0,0x00,0x4A},{0x32,0x03,0x00,0x4E},{0x34,0x03,0x00,0x51},{0x37,0x01,0x00,0x54},
  67.         {0xB3,0x02,0x01,0x75},{0xB4,0x01,0x01,0x78},{0xB4,0x01,0x01,0x78}
  68. }; //前兩個字節為對應的電壓值,后兩個為焦距值  (高位+低位) 2013-9-4        新的75375焦距表



  69. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. void delay5ms() reentrant;
  71. void dlm() reentrant;
  72. void chushihua();
  73. void cuankou();
  74. void send_date( uchar datew);
  75. void ad_power();
  76. void dukou1();
  77. void adc();
  78. void set_open();
  79. void get_ad(uchar k);
  80. void set_off();
  81. void duzhpd();
  82. void kongzhi();
  83. void qingli();
  84. void fs();
  85. uchar rc();
  86. void zhongduan();
  87. void weiyi();
  88. uchar zhilxy();
  89. void zhiling_yingda();
  90. void jisuan();
  91. //void dy_changdu();
  92. void ffind();
  93. void shuj_chuli();
  94. //void dianj();
  95. void guan_kongzi();
  96. ///////////////////////////////////////////////////////////////////
  97. //中斷進行接收數值。并且進行異或校驗。
  98. void serial_int() interrupt 4 using 3   //接收字符;
  99. {  
  100.         uchar i=0;
  101.     ES=0;
  102.     P3|=0x3C;
  103.     P1|=0x0C;//P1|=0x0C;
  104.     if(RI)
  105.                 i=rc();
  106.     if(i)
  107.         {
  108.                 flg=1;
  109.         }
  110.     else  
  111.         {
  112.                 rdata_tmp[1]=0xcf;
  113.                 xx=1;
  114.         }
  115. }
  116. void zhongduan()
  117. {
  118.     uchar i;
  119.     weiyi();
  120.     //delay5ms();delay5ms();
  121.     i=zhilxy();                        //指令進行校驗;包括:指令判斷和長度判斷.
  122.     if(i)
  123.          zhiling_yingda();             //測試指令和對電動機的控制函數;
  124.     else
  125.         {  data_tmp[1]=0xcf;
  126.            guan_kongzi();
  127.            P3|=0x3C;P1|=0x0C;}         //指令出現錯誤;一處
  128.     shuj_chuli();                      //發送指令函數;
  129. }
  130. /*
  131. void dianj()
  132. { uchar i=0;
  133.   delay5ms();delay5ms();
  134.   adc();
  135.   delay5ms();delay5ms();
  136.    for(i=0;i<8;i++)
  137.      {send_date(ad[0][i]);delay5ms();delay5ms();delay5ms();}
  138.    delay5ms();delay5ms();
  139.   }*/
  140. ///////////////////////////////////////主程序//////
  141. void main()
  142. {
  143.         uchar n=0;
  144.         chushihua();
  145.         while(1)
  146.         {
  147.                 wd_con=0x3f;          //看門狗不用,時間太短只有9s。 或更短的 0x38-71.1ms ,0x39-142.2ms ,0x3A-284.4ms ,0x3B-568.8ms ,0x3c-1.1377s ,0x3d-2.2755s ,0x3e-4.5511s, 0x3f-9.1022s;
  148.                 key=1;
  149.                 ES=1;
  150.                 if(slg==1)
  151.                 {ffind(); }
  152.                 else kongzhi();
  153.                 adc();
  154.                 duzhpd();
  155.                 //P1_0=1;               //調試用的按鍵;
  156.                 if(flg==1)
  157.                 {
  158.                         ES=0;
  159.                         if(xx==0)
  160.                         {
  161.                                 zhongduan();
  162.                         }
  163.                         else
  164.                         {
  165.                                 data_tmp[1]=0xcf;                 //接收指令的校驗碼錯誤.
  166.                                 shuj_chuli();
  167.                                 qingli();
  168.                                 guan_kongzi();                 //出錯處理2處。
  169.                                 P3|=0x3C;P1|=0x0C;
  170.                         }
  171.                         flg=0;ES=1; n=0;
  172.                 }                   //中斷結束;
  173.                 qingli();
  174.                 if(n>=10)                               //發送數據的時間控制
  175.                 {
  176.                         n=0;fs();
  177.                 }
  178.                 else
  179.                 {
  180.                         if(n< 100)
  181.                                 n++;
  182.                         else
  183.                                 n=100;
  184.                 }
  185.                 delay5ms();delay5ms();
  186.         }//主循環;
  187. }  //主程序結束;
  188. //////////////////////////////延時程序延時5ms; 1s要調用200次///////////////////////////////////////////////////
  189. void delay5ms() reentrant
  190. {
  191.         unsigned int i;
  192.         for(i=0;i<877;i++)
  193.                 ;
  194. }
  195. //一般小延時//
  196. void dlm() reentrant
  197. {
  198.         uchar i=200;
  199.         while(i--)
  200.         {
  201.                 ;
  202.         }
  203. }
  204. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  205. void chushihua()
  206. {
  207.         char i;
  208.         //P1=0; P3&=0x43;      //01 00 00 11 I/O口的初始話;
  209.         //P3=0; P1&=0xF3;      //11 11 00 11
  210.         cuankou();             //串口初始化
  211.         ad_power();            //ad轉換上電
  212.         for(i=0;i<10;i++)
  213.         {
  214.                 rdata_tmp[i]=0;       //
  215.                 sdata_tmp[i]=0;       //
  216.                 if(i<7)              //
  217.                         data_tmp[i]=0;        //
  218.                 //send_date(i);           //應用的
  219.         }                     //
  220.         wd_con=0x3f;          //
  221. }
  222. //串口初始化。設置接收的波特率。
  223. void cuankou()
  224. {  
  225.         SCON=0x50;
  226.         //PCON=0x80;          //波特率加倍
  227.     TMOD=0x21;
  228.     TH1=0xfd;
  229.     TL1=0xfd;
  230.     //AUXR|=0X40;
  231.     TR1=1;ES=1;EA=1;TI=0;RI=0;
  232. }
  233. //上電起動A/D轉換芯片。
  234. void ad_power()
  235. { //ES=0;
  236.      adc_contr=0x80;
  237.      dlm();dlm();dlm();dlm();dlm();dlm();
  238.   //ES=1;
  239. }
  240. /////////////////////////////////////////////////////////////////////////////////////////////
  241. //讀取濾波片的值
  242. void dukou1()
  243.   {
  244.    dlm();
  245.    P2|=0x03;
  246.    bb=P2&0x03;
  247.    }
  248. ////////////////////////////////////////////////////////////////////////////////////////////
  249. void send_date( uchar datew)
  250.    {
  251.     ES=0;
  252.     SBUF=datew;
  253.     while(TI==0);
  254.     TI=0;
  255.     //ES=1;
  256.     }
  257. /////////////////////////////////////////////////////////////////////////////////////////////
  258. //啟動AD轉換;
  259. void adc()
  260. {
  261.   uchar i;
  262.   set_open();
  263.   for(i=0;i<4;i++)
  264.     {
  265.      get_ad(i);
  266.     }
  267.   set_off();
  268. }
  269. void set_open()
  270. {
  271.   uchar i=0xF0;
  272.   p1m0|=i;
  273.   p1m1|=i;
  274. }
  275. void get_ad(uchar k)
  276.   {
  277.     uchar i=0x08;
  278.     adc_data=0x00;
  279.     adc_low2=0x00;
  280.     adc_contr=adc_channel[k];
  281.     adc_contr|=i;
  282.     do
  283.     {
  284.      i=0x10;i&=adc_contr;
  285.      }while(i==0);
  286.      i=adc_channel[k];
  287.      adc_contr&=i;
  288.      ad[k][0]=adc_data;
  289.      ad[k][1]=adc_low2;
  290.    }
  291. void set_off()
  292. {
  293.   uchar i=0x0f;
  294.   p1m0&=i;
  295.   p1m1&=i;
  296.   }
  297. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  298. //堵轉的比較;
  299. void duzhpd()
  300. { uchar i,j;
  301.    for(i=0;i<4;i++)
  302.      { switch(i)
  303.         { case 0:{if(ad[i][0]>=DZHZj)     //P1.7聚焦電動機+12V。
  304.                     {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();}
  305.                   break;}
  306.           case 1:{if(ad[i][0]>=DZHZb)     //P1.6變焦電動機+12V。
  307.                     {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();slg=0;}
  308.                   break;}
  309.           case 3:{if(ad[i][0]>=DZHZg)     //P1.4光圈電動機+5V。
  310.                     {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();}
  311.                   break;}
  312.           default: ;
  313.          }
  314.       }
  315. }

  316. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  317. //四個電動機的控制矩陣
  318. void kongzhi()
  319. { uchar i,j,k,m=0;
  320.   for(i=0;i<4;i++,m=0 )
  321.   for(j=0;j<3&&m==0;j++)
  322.    if(kk[i][j]!=0x00)
  323.     {m=1;
  324.      switch(i)
  325.       { case 0:{ switch(j)                                  //C5 第一個聚焦電機的控制:停轉,正轉,反轉。只能用一個為真;
  326.                  {case 0: {P3_5=0;P3_4=0;dlm();delay5ms();break;}
  327.                   case 1: {P3_5=0;P3_4=1;dlm();delay5ms();break;}
  328.                   case 2: {P3_5=1;P3_4=0;dlm();delay5ms();break;}
  329.                   default:{P3_5=1;P3_4=1;dlm();delay5ms();}
  330.                   }
  331.                }break;
  332.         case 1:{ switch(j)                                  //C4 第二個變焦電機的控制:停轉,正轉,反轉。只能用一個為真;
  333.                  {case 0: {P3_3=0;P3_2=0;dlm();delay5ms();break;}
  334.                   case 1: {P3_3=0;P3_2=1;dlm();delay5ms();break;}
  335.                   case 2: {P3_3=1;P3_2=0;dlm();delay5ms();break;}
  336.                   default:{P3_3=1;P3_2=1;dlm();delay5ms();}
  337.                   }
  338.                }break;
  339.         case 2:{ switch(j)                                 //C2 第一個光圈電機的控制:停轉,正轉,反轉。只能用一個為真;
  340.                  {case 0: {P1_3=0;P1_2=0;dlm();delay5ms();break;}
  341.                   case 1: {P1_3=0;P1_2=1;dlm();delay5ms();break;}
  342.                   case 2: {P1_3=1;P1_2=0;dlm();delay5ms();break;}
  343.                   default:{P1_3=1;P1_2=1;dlm();delay5ms();}
  344.                   }
  345.                }break;
  346.         case 3:{ switch(j)                                 //C3 第一個濾光電機的控制:停轉,正轉,停轉。只能用一個為真; 延時1s;后清除控制位解除自鎖;
  347.                  {case 0: {key=1;        dlm();delay5ms();break;}
  348.                   case 1: {dukou1();     dlm();
  349.                            key=0;
  350.                            for(k=0;k<200;k++)
  351.                                 delay5ms();
  352.                            key=1;
  353.                            kk[i][j]=0x00;dlm();delay5ms();break;}
  354.                   case 2: {dukou1();     dlm();delay5ms();break;}
  355.                   default:{key=1;        dlm();delay5ms();}
  356.                   }
  357.                }break;
  358.        default:{ i=4;j=3;}
  359.      }
  360.    }
  361. }
  362. void guan_kongzi()                    //出錯處理程序   3處。
  363. { uchar i,j;
  364.   for(i=0;i<4;i++)
  365.   for(j=0;j<3;j++)
  366.   kk[i][j]=0x00;
  367. }
  368. /////////////////////////////////
  369. void qingli()
  370. {
  371.    uchar i;
  372.    xx=0;
  373.    for(i=0;i<10;i++)
  374.    {
  375.     rdata_tmp[i]=0;
  376.     sdata_tmp[i]=0;
  377.      if(i<7)
  378.      data_tmp[i]=0;
  379.    }
  380. }
  381. //時刻發送的數據
  382. void fs()
  383. {
  384.   //dukou1();
  385.   //data_tmp[1]=0xC3;                    //發送濾光片的代號.
  386.   //shuj_chuli();
  387.   //delay5ms();delay5ms();delay5ms();delay5ms();
  388.   //delay5ms();delay5ms();delay5ms();delay5ms();
  389.   //delay5ms();delay5ms();delay5ms();delay5ms();
  390.   //delay5ms();delay5ms();delay5ms();delay5ms();
  391.   adc();
  392.   //jj=((int)(((int)(ad[2][0]))<<2+((int)(ad[2][1]))));
  393.   //jjub[0]=jiaoju1024[jj][0];
  394.   //jjub[1]=jiaoju1024[jj][1];
  395.   jisuan();
  396.   data_tmp[1]=0xC0;                    //發送焦距的數值.
  397.   shuj_chuli();
  398. }
  399. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  400. //串口中斷調用的接收程序?
  401. uchar rc()
  402. { uint   ch=0;
  403.   uchar  count=0;
  404.   if(flg==0)
  405.   {   RI=0;ch=0;
  406.       for( count=0;count<10;count++ )
  407.        {
  408.          rdata_tmp[count]=SBUF;
  409.          if(rdata_tmp[0]==0x02)
  410.            {
  411.               if(rdata_tmp[count]==0x03)
  412.               {rdata_tmp[9]=count+1;return(1);}
  413.            }
  414.          else return(0);
  415.          while(RI==0){if((++ch)>1000)return(0);}
  416.          RI=0;
  417.          ch=0;
  418.        }
  419.   }
  420.   return(0);
  421. }
  422. //接收數據校驗碼錯誤;
  423. void weiyi()
  424. {uchar i=0,ch;
  425.    for(i=0,data_tmp[6]=0;i<rdata_tmp[9];i++,data_tmp[6]++)
  426.        {  data_tmp[data_tmp[6]]=rdata_tmp[i];
  427.           if(i>1&&i<rdata_tmp[9])
  428.            {if(rdata_tmp[i]==0x1B)
  429.              {data_tmp[data_tmp[6]]=(rdata_tmp[i+1]&0x7F);i++;}
  430.            }
  431.        }
  432.    for(i=1,ch=0;i<(data_tmp[6]-2);i++)
  433.              ch^=data_tmp[i];                         //驗證校驗和;
  434.       if(ch!=data_tmp[data_tmp[6]-2])
  435.       {data_tmp[1]=0xcf;xx=02;
  436.            guan_kongzi();                            //出錯處理4處
  437.            P3|=0x3C;P1|=0x0C;}
  438. }
  439. //對指令的判斷
  440. uchar zhilxy()
  441. {uchar n=0;
  442. if(data_tmp[0]==0x02||xx!=0x00)//對接收指令的判斷;
  443.    { switch(data_tmp[1])
  444.        {case 0xc0: n=4;break;                                             //判斷焦距指令的并求出指令長度
  445.         case 0xc1: n=6;break;                                             //焦距設定值;
  446.         case 0xc2: n=5;break;                                             //光圈控制;
  447.         case 0xc3: n=5;break;                                             //濾光片控制;
  448.         case 0xc4: n=5;break;                                             //變焦控制;
  449.         case 0xc5: n=5;break;                                             //聚焦控制;
  450.         case 0xcf: n=5;break;
  451.         default: {xx=01;return(0);}                                       //無效指令;
  452.        }
  453.      if(n!=data_tmp[6])
  454.        {xx=03;return(0);}                                                 //數據長度錯誤;03
  455.      switch(n)
  456.        {case 4: if(data_tmp[1]==data_tmp[2])return(1);break;
  457.         case 5: if((data_tmp[1]^data_tmp[2])==data_tmp[3])return(1);break;
  458.         case 6: if((data_tmp[1]^data_tmp[2]^data_tmp[3])==data_tmp[4])return(1);break;
  459.         default:;
  460.         }
  461.    }
  462. else xx=0x01;                                                            //無效指令;  01
  463. //   xx==0x02;                                                              //校驗碼錯誤;02
  464.    return (0);
  465. }
  466. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  467. //指令執行;
  468. void zhiling_yingda()
  469.     { uchar i=0,ky;
  470.       switch(data_tmp[1])
  471.        {//case 0xc0:{adc();dlm();jj=((int)(((int)(ad[2][0]))<<2+((int)(ad[2][1]))));jjub[0]=jiaoju1024[jj][0];jjub[1]=jiaoju1024[jj][1];}break;//查表jiaoju1024[][]表格取焦距數值;
  472.         //case 0xc0:{adc();dlm();jj=((int)(((int)(ad[2][0]))<<2+((int)(ad[2][1]))));jisuan();}break;                         //查表jiaoju[][]取焦距對應的數值;
  473.         case 0xc0:{adc();dlm();jisuan();}break;                       //通過計算求焦距的數 8位數值計算;
  474.         case 0xc1:{shedz=(uint)(gaodi8(data_tmp[2],data_tmp[3]));ffind();}break;  //shedz==((((int)(data_tmp[2]))<<8)+((int)(data_tmp[3]))); //焦距設定值=取焦距數值;
  475.         case 0xc2:{ky=data_tmp[2];for(i=0;i<3;i++)kk[2][i]=0x00;if(ky<0x03){kk[2][ky]=0x01;kongzhi();}else {data_tmp[1]=0xcf;xx=0x01;}break;}  //光圈控制;
  476.         case 0xc3:{ky=data_tmp[2];for(i=0;i<3;i++)kk[3][i]=0x00;if(ky<0x03){kk[3][ky]=0x01;kongzhi();}else {data_tmp[1]=0xcf;xx=0x01;}break;}  //濾光片控制;
  477.         case 0xc4:{slg=0;ky=data_tmp[2];for(i=0;i<3;i++)kk[1][i]=0x00;if(ky<0x03){kk[1][ky]=0x01;kongzhi();}else {data_tmp[1]=0xcf;xx=0x01;}break;}  //變焦控制;
  478.         case 0xc5:{ky=data_tmp[2];for(i=0;i<3;i++)kk[0][i]=0x00;if(ky<0x03){kk[0][ky]=0x01;kongzhi();}else {data_tmp[1]=0xcf;xx=0x01;}break;}  //聚焦控制;
  479.         default:  {data_tmp[1]=0xcf;if(xx==0)xx=0x01;}                                                                   //命令字出錯
  480.       }
  481.     }
  482. //////////////////////////////////////////////////////////////////////////////
  483. void jisuan()   //dy_changdu()
  484. {
  485.   uchar i;
  486.   int a,b,c,e,d,x;
  487.     for(i=1;i<Fwei;i++)                           //i  的范圍隨著采樣的數據要改
  488.       if(ceduib[i][0]>=ad[2][0]) break;
  489.    if(ceduib[i-1][0]<ad[2][0])    //判斷它的下限.
  490.      {a=low2(ceduib[i-1][0],ceduib[i-1][1]);
  491.       b=low2(ad[2][0],ad[2][1]);
  492.       c=low2(ceduib[i][0],ceduib[i][1]);
  493.       d=gaodi8(ceduib[i-1][2],ceduib[i-1][3]);
  494.       e=gaodi8(ceduib[i][2],ceduib[i][3]);
  495.       if(c!=a)
  496.         x=d+(b-a)*(e-d)/(c-a);  //求出測量值;
  497.       else
  498.                                 x=74;
  499.       jj=(uint)(x);
  500.       jjub[0]=(uchar)((jj>>8)&0x00ff);
  501.       jjub[1]=(uchar)(jj&0x00ff);
  502.      }
  503.    else
  504.      { x=74;
  505.       jj=(uint)(x);
  506.       jjub[0]=(uchar)(jj>>8);
  507.       jjub[1]=(uchar)(jj&0x00ff);
  508.      }
  509. //中間變量為jj;
  510.   }
  511. //根據設定值和采樣值比較進行判斷比較
  512. void ffind()
  513.     {  uchar k;
  514.        adc();jisuan();delay5ms();
  515.        for(k=0;k<3;k++) kk[1][k]=0x00;
  516.        if(shedz<3)  {for(k=0;k<3;k++)kk[1][k]=0x00;kk[1][0]=0x01;slg=0;shedz=0;kongzhi();}
  517.        if(shedz>1400){for(k=0;k<3;k++)kk[1][k]=0x00;kk[1][0]=0x01;slg=0;shedz=0;kongzhi();data_tmp[1]=0xfc;xx=0x01;}
  518.        else
  519.          if((jj>=(shedz-2))&&((shedz+2)>=jj)){for(k=0;k<3;k++)kk[1][k]=0x00;kk[1][0]=0x01; slg=0;shedz=0;kongzhi();dlm();}
  520.          else   {  if((shedz-2)>=jj)                    {for(k=0;k<3;k++)kk[1][k]=0x00; kk[1][1]=0x01;kongzhi();dlm();
  521.                                                          if((shedz-2)>jj)slg=1;for(k=0;k<3;k++)kk[1][k]=0x00;kongzhi();}      //焦距電機正傳;  調試?
  522.                     else
  523.                     {for(k=0;k<3;k++)kk[1][k]=0x00; kk[1][2]=0x01;kongzhi();dlm();if((shedz+2)<jj)slg=1;for(k=0;k<3;k++)kk[1][k]=0x00;kongzhi();}      //焦距電機反轉;
  524.                 }
  525.       }
  526. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  527. //指令的返回處理和輸出
  528. void shuj_chuli()
  529.   {uchar i; sdata_tmp[0]=0x06;
  530.    switch(data_tmp[1])
  531.       {case 0xc0:{
  532.                    sdata_tmp[1]=data_tmp[1];
  533.                    i=sdata_tmp[1]^jjub[0]^jjub[1];
  534.                    if(jjub[0]==0x02||jjub[0]==0x03||jjub[0]==0x06||jjub[0]==0x15||jjub[0]==0x1B)
  535.                        {
  536.                         sdata_tmp[2]=0x1B;sdata_tmp[3]=jjub[0]|0x80;
  537.                         if(jjub[1]==0x02||jjub[1]==0x03||jjub[1]==0x06||jjub[1]==0x15||jjub[1]==0x1B)
  538.                            {
  539.                             sdata_tmp[4]=0x1B;sdata_tmp[5]=jjub[1]|0x80;
  540.                             sdata_tmp[6]=i;
  541.                             if(sdata_tmp[6]==0x02||sdata_tmp[6]==0x03||sdata_tmp[6]==0x06||sdata_tmp[6]==0x15||sdata_tmp[6]==0x1B)
  542.                                {
  543.                                 sdata_tmp[7]=sdata_tmp[6]+0x80;sdata_tmp[6]=0x1B;sdata_tmp[8]=0x03;sdata_tmp[9]=0x09;
  544.                                 delay5ms();
  545.                                                                 }   //九位指令
  546.                             else
  547.                                {
  548.                                 sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
  549.                                 delay5ms();
  550.                                                                 }                                                         //八位指令
  551.                            }
  552.                      else
  553.                            {
  554.                             sdata_tmp[4]=jjub[1];
  555.                             sdata_tmp[5]=i;
  556.                             if(sdata_tmp[5]==0x02||sdata_tmp[5]==0x03||sdata_tmp[5]==0x06||sdata_tmp[5]==0x15||sdata_tmp[5]==0x1B)
  557.                                {
  558.                                 sdata_tmp[6]=sdata_tmp[5]+0x80;sdata_tmp[5]=0x1B;sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
  559.                                 delay5ms();
  560.                                                                 }                                                                                    //八位指令
  561.                             else
  562.                                {
  563.                                 sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
  564.                                 delay5ms();
  565.                                                                 }                                                                                         //七位指令
  566.                            }
  567.                      }
  568.                     else
  569.                      {      sdata_tmp[2]=jjub[0];
  570.                        if(jjub[1]==0x02||jjub[1]==0x03||jjub[1]==0x06||jjub[1]==0x15||jjub[1]==0x1B)
  571.                            {
  572.                             sdata_tmp[3]=0x1B;sdata_tmp[4]=jjub[1]|0x80;
  573.                             sdata_tmp[5]=i;
  574.                             if(sdata_tmp[5]==0x02||sdata_tmp[5]==0x03||sdata_tmp[5]==0x06||sdata_tmp[5]==0x15||sdata_tmp[5]==0x1B)
  575.                                {
  576.                                 sdata_tmp[6]=sdata_tmp[5]+0x80;sdata_tmp[5]=0x1B;sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
  577.                                 delay5ms();
  578.                                                                 }                                                                                     //八位指令
  579.                             else
  580.                                {
  581.                                 sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
  582.                                delay5ms();
  583.                                                            }
  584.                            }                                                                                                  //七位指令
  585.                        else
  586.                            {
  587.                             sdata_tmp[3]=jjub[1];
  588.                             sdata_tmp[4]=i;
  589.                             if(sdata_tmp[4]==0x02||sdata_tmp[4]==0x03||sdata_tmp[4]==0x06||sdata_tmp[4]==0x15||sdata_tmp[4]==0x1B)
  590.                                {
  591.                                 sdata_tmp[5]=sdata_tmp[4]+0x80;sdata_tmp[4]=0x1B;sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
  592.                                delay5ms();
  593.                                                            }                                                                                              //七位指令
  594.                             else
  595.                                {
  596.                                 sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;
  597.                                delay5ms();
  598.                                                            }                                                         //六位指令
  599.                        }
  600.                       }
  601.                      delay5ms();
  602.                                          }break;
  603.         case 0xc1: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:設定值;
  604.         case 0xc2: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:光圈控制;
  605.         case 0xc3:{sdata_tmp[1]=0xc3;                               //輸出濾波片的編碼指令編寫;
  606.                    if(flg==0)dukou1();i=sdata_tmp[1]^bb;                                                //沒有進中斷讀口求bb;
  607.                    if(bb==0x02||bb==0x03)
  608.                         {sdata_tmp[2]=0x1b;sdata_tmp[3]=bb|0x80;
  609.                          sdata_tmp[4]=i;
  610.                          if(sdata_tmp[4]==0x02||sdata_tmp[4]==0x03||sdata_tmp[4]==0x06||sdata_tmp[4]==0x15||sdata_tmp[4]==0x1B)
  611.                                {sdata_tmp[5]=sdata_tmp[4]+0x80;sdata_tmp[4]=0x1B;sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;}        //七位指令
  612.                             else
  613.                                {sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;}                                                         //六位指令
  614.                         }
  615.                   else {sdata_tmp[2]=bb;sdata_tmp[3]=i;
  616.                         if(sdata_tmp[3]==0x02||sdata_tmp[3]==0x03||sdata_tmp[3]==0x06||sdata_tmp[3]==0x15||sdata_tmp[3]==0x1B)
  617.                                {sdata_tmp[4]=sdata_tmp[3]+0x80;sdata_tmp[3]=0x1B;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;}        //六位指令
  618.                             else
  619.                                {sdata_tmp[4]=0x03;sdata_tmp[9]=0x05;}                                                         //五位指令
  620.                         }
  621.                   }break;
  622.                                                                                                                               //濾光片控制;
  623.         case 0xc4: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:變焦控制;
  624.         case 0xc5: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:聚焦控制;
  625.         default: { sdata_tmp[1]=0xcf;
  626.                    switch(xx)                                                                                                         //指令、校驗位和數據長度出錯輸出;
  627.                         {case 0x02: sdata_tmp[2]=0x1b;sdata_tmp[3]=0x82;sdata_tmp[4]=0xcd;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;break;  //校驗碼錯
  628.                          case 0x03: sdata_tmp[2]=0x1b;sdata_tmp[3]=0x83;sdata_tmp[4]=0xcc;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;break;  //數據長度錯
  629.                          default  : sdata_tmp[2]=0x01;sdata_tmp[3]=0xce;sdata_tmp[4]=0x03;sdata_tmp[9]=0x05;                          //無效命令
  630.                          }
  631.                    guan_kongzi();
  632.                    P3|=0x3C;P1|=0x0C;
  633.                   }
  634.       xx=0;data_tmp[1]=0x00;
  635.       }
  636.    for(i=0;i<sdata_tmp[9]&&i<10;i++)
  637.      send_date(sdata_tmp[i]);
  638.    }
  639. //The end。
復制代碼

HLM75375.zip

6.31 KB, 下載次數: 3

點C文件

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

使用道具 舉報

沙發
ID:752974 發表于 2022-9-28 08:47 | 只看該作者
485是單雙工,注意收發不能同時工作。
回復

使用道具 舉報

板凳
ID:123289 發表于 2022-9-28 09:56 | 只看該作者
串行通訊發行沖突是常態。
設計者的任務就是如何防止沖突,解決沖突,使用通訊不受沖突影響。
為此,最常規的方案是,制定一個合理的協議!通訊的各方嚴格按協議通訊。
回復

使用道具 舉報

地板
ID:624769 發表于 2022-9-28 13:50 | 只看該作者
但凡  串口中斷  只有 if(RI)   沒有 if(TI),  而整個程序中  有收有發。
提問時,又只發單片機的代碼,沒有對端設備的代碼/協議。

那么,都不用看完整的代碼,就能知道,出問題是必然的, 不出問題才是偶然的。
回復

使用道具 舉報

5#
ID:161164 發表于 2022-9-28 16:00 | 只看該作者
你的接收是靠串口中斷
但你發送時就把串口中斷關了
當然會收不到數據
C51的串口和422都是全雙工的
接收和發送互不干擾
只是你的發送邏輯寫的不好
不要用TI來等待,用busy


                       
       
                                                        
回復

使用道具 舉報

6#
ID:121859 發表于 2022-9-28 16:58 | 只看該作者
要想不沖突,可以開辟一個接收緩沖區來暫存接收數據,利用中斷每次接收一個數據暫存于緩沖區。當接收一段數據時再處理。處理程序不要放在中斷里面。現在的處理方式肯定會造成一些沖突的。中斷本身是用來處理隨機情況的,越簡單越好,你顯然違背了這個規律。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜精品 | 亚洲精品电影在线观看 | 中文字幕亚洲视频 | 亚洲成人黄色 | 91色在线 | 亚洲国产成人精品女人久久久 | www.成人.com| 天天操 夜夜操 | 国产黄色在线观看 | 欧美精品日韩 | 婷婷丁香综合网 | 欧美精品久久久 | 一区二区三区av | 91精品国产一区二区三区蜜臀 | 在线视频99 | 国产资源一区二区三区 | 91成人影院| 亚洲成人免费 | 亚洲一二三区免费 | 亚洲性人人天天夜夜摸 | www.日本三级 | 国产欧美一区二区在线观看 | 99久久婷婷国产综合精品首页 | 国产视频1区2区 | 午夜免费电影院 | 国产高清免费视频 | 激情一区二区三区 | 国产精品99久久久久久久vr | 玖玖国产 | 午夜影院视频 | 亚洲欧美视频 | 国产成人精品a视频一区www | 男女网站免费观看 | 一二三四av | 成人国产精品久久 | 日韩成人在线观看 | 欧美电影一区 | 欧美精品久久久久久久久久 | 欧美精品综合在线 | 欧美性网 | 一区二区三区观看视频 |