|
51單片機收發問題。C51單片機向外以1秒10次發送數據,會影響接收,偶爾收不到控制指令。RS422通信。我測試過,如果屏蔽掉單片機的發送,接收指令不會出問題。向外發送的頻率越低,接收指令丟失的問題概率也越低。
單片機源程序如下:- #include <reg52.h> //最新的版本,擁有新的不發送控制和防止出錯處理控制有四處。改為新的焦距表75-375mm 2013-09
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define low2(x,y) ((((int)(x))<<2)+((int)(y)))
- #define gaodi8(x,y) ((((int)(x))<<8)+((int)(y)))
- #define DZHZj 0x66 //聚焦堵轉值 c5 L298可調電流范圍-1~2.3V,需要時可以調整
- #define DZHZb 0x66 //變焦堵轉值 c4 07,08
- #define DZHZg 0x50 //光圈堵轉值 c2 01
- uchar data_tmp[7]; //
- uchar rdata_tmp[10]; //
- uchar sdata_tmp[10]; //
- sfr AUXR= 0x8e; //12倍頻
- sfr wd_con= 0xe1; //看門狗的控制字。
- bit idata flg=0; //中斷標志
- bit idata slg=0; //設定值指令標志;
- //uchar bdata data1=0; //數據的位操作;與第二種方法都數值函數連用:dukou2();
- //sbit x0=data1^0;
- //sbit x1=data1^1;
- ////////////////////////////////////////ad的轉換的頭文件////////////////////////////////////////////////////////
- sfr adc_contr=0xc5; //
- sfr adc_data=0xc6; //
- sfr adc_low2=0xbe; //
- sfr p1m0=0x91; //
- sfr p1m1=0x92;
- uchar ad[4][2]={
- {0x00,0x00}, //7
- {0x00,0x00}, //6
- {0x00,0x00}, //5
- {0x00,0x00}}; //4 //
- uchar code adc_channel[4]={0xe7,0xe6,0xe5,0xe4};
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //
- sbit P1_2 = P1^2; //
- sbit P1_3 = P1^3; //
- sbit ad4 = P1^4; //
- //
- sbit key=P3^7; //
- sbit P1_0=P1^0; //
- sbit P1_1=P1^1; //
- //第二個電機控制 變焦電動機;指令: C4 驅動電壓為+12V。 指令過后鎖定控制
- sbit P3_2=P3^2; //
- sbit P3_3=P3^3; //
- sbit ad6=P1^6; //
- sbit ad5=P1^5; //
- //第一個電機控制 聚焦電動機;指令:C5 驅動電壓為+12V。 指令過后鎖定控制
- sbit P3_4=P3^4; //
- sbit P3_5=P3^5; //
- sbit ad7=P1^7; //
- //uchar ky; //
- uchar kk[4][3]= //電機正反轉控制量;
- {{0x00,0x00,0x00}, //
- {0x00,0x00,0x00}, //
- {0x00,0x00,0x00}, //
- {0x00,0x00,0x00}}; //
- uchar bb=0; //
- uchar xx=0; //
- uint jj=0; //查表的序號;
- uint shedz=0;
- uchar jjub[2]={0x00,0x00}; //查表緩沖數組;
- int Fwei=102; //Fwei=51-1;
- //20181213更新ceduib表格:
- //1、微調兩端電壓對應的焦距值,原來為75和375,改為74和379,留出裕量防止高低溫到不了75和375
- uchar code ceduib[103][4]=
- {
- {0x32,0xC0,0x00,0x4A},{0x32,0xC0,0x00,0x4A},{0x32,0x03,0x00,0x4E},{0x34,0x03,0x00,0x51},{0x37,0x01,0x00,0x54},
- {0xB3,0x02,0x01,0x75},{0xB4,0x01,0x01,0x78},{0xB4,0x01,0x01,0x78}
- }; //前兩個字節為對應的電壓值,后兩個為焦距值 (高位+低位) 2013-9-4 新的75375焦距表
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void delay5ms() reentrant;
- void dlm() reentrant;
- void chushihua();
- void cuankou();
- void send_date( uchar datew);
- void ad_power();
- void dukou1();
- void adc();
- void set_open();
- void get_ad(uchar k);
- void set_off();
- void duzhpd();
- void kongzhi();
- void qingli();
- void fs();
- uchar rc();
- void zhongduan();
- void weiyi();
- uchar zhilxy();
- void zhiling_yingda();
- void jisuan();
- //void dy_changdu();
- void ffind();
- void shuj_chuli();
- //void dianj();
- void guan_kongzi();
- ///////////////////////////////////////////////////////////////////
- //中斷進行接收數值。并且進行異或校驗。
- void serial_int() interrupt 4 using 3 //接收字符;
- {
- uchar i=0;
- ES=0;
- P3|=0x3C;
- P1|=0x0C;//P1|=0x0C;
- if(RI)
- i=rc();
- if(i)
- {
- flg=1;
- }
- else
- {
- rdata_tmp[1]=0xcf;
- xx=1;
- }
- }
- void zhongduan()
- {
- uchar i;
- weiyi();
- //delay5ms();delay5ms();
- i=zhilxy(); //指令進行校驗;包括:指令判斷和長度判斷.
- if(i)
- zhiling_yingda(); //測試指令和對電動機的控制函數;
- else
- { data_tmp[1]=0xcf;
- guan_kongzi();
- P3|=0x3C;P1|=0x0C;} //指令出現錯誤;一處
- shuj_chuli(); //發送指令函數;
- }
- /*
- void dianj()
- { uchar i=0;
- delay5ms();delay5ms();
- adc();
- delay5ms();delay5ms();
- for(i=0;i<8;i++)
- {send_date(ad[0][i]);delay5ms();delay5ms();delay5ms();}
- delay5ms();delay5ms();
- }*/
- ///////////////////////////////////////主程序//////
- void main()
- {
- uchar n=0;
- chushihua();
- while(1)
- {
- 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;
- key=1;
- ES=1;
- if(slg==1)
- {ffind(); }
- else kongzhi();
- adc();
- duzhpd();
- //P1_0=1; //調試用的按鍵;
- if(flg==1)
- {
- ES=0;
- if(xx==0)
- {
- zhongduan();
- }
- else
- {
- data_tmp[1]=0xcf; //接收指令的校驗碼錯誤.
- shuj_chuli();
- qingli();
- guan_kongzi(); //出錯處理2處。
- P3|=0x3C;P1|=0x0C;
- }
- flg=0;ES=1; n=0;
- } //中斷結束;
- qingli();
- if(n>=10) //發送數據的時間控制
- {
- n=0;fs();
- }
- else
- {
- if(n< 100)
- n++;
- else
- n=100;
- }
- delay5ms();delay5ms();
- }//主循環;
- } //主程序結束;
- //////////////////////////////延時程序延時5ms; 1s要調用200次///////////////////////////////////////////////////
- void delay5ms() reentrant
- {
- unsigned int i;
- for(i=0;i<877;i++)
- ;
- }
- //一般小延時//
- void dlm() reentrant
- {
- uchar i=200;
- while(i--)
- {
- ;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void chushihua()
- {
- char i;
- //P1=0; P3&=0x43; //01 00 00 11 I/O口的初始話;
- //P3=0; P1&=0xF3; //11 11 00 11
- cuankou(); //串口初始化
- ad_power(); //ad轉換上電
- for(i=0;i<10;i++)
- {
- rdata_tmp[i]=0; //
- sdata_tmp[i]=0; //
- if(i<7) //
- data_tmp[i]=0; //
- //send_date(i); //應用的
- } //
- wd_con=0x3f; //
- }
- //串口初始化。設置接收的波特率。
- void cuankou()
- {
- SCON=0x50;
- //PCON=0x80; //波特率加倍
- TMOD=0x21;
- TH1=0xfd;
- TL1=0xfd;
- //AUXR|=0X40;
- TR1=1;ES=1;EA=1;TI=0;RI=0;
- }
- //上電起動A/D轉換芯片。
- void ad_power()
- { //ES=0;
- adc_contr=0x80;
- dlm();dlm();dlm();dlm();dlm();dlm();
- //ES=1;
- }
- /////////////////////////////////////////////////////////////////////////////////////////////
- //讀取濾波片的值
- void dukou1()
- {
- dlm();
- P2|=0x03;
- bb=P2&0x03;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////
- void send_date( uchar datew)
- {
- ES=0;
- SBUF=datew;
- while(TI==0);
- TI=0;
- //ES=1;
- }
- /////////////////////////////////////////////////////////////////////////////////////////////
- //啟動AD轉換;
- void adc()
- {
- uchar i;
- set_open();
- for(i=0;i<4;i++)
- {
- get_ad(i);
- }
- set_off();
- }
- void set_open()
- {
- uchar i=0xF0;
- p1m0|=i;
- p1m1|=i;
- }
- void get_ad(uchar k)
- {
- uchar i=0x08;
- adc_data=0x00;
- adc_low2=0x00;
- adc_contr=adc_channel[k];
- adc_contr|=i;
- do
- {
- i=0x10;i&=adc_contr;
- }while(i==0);
- i=adc_channel[k];
- adc_contr&=i;
- ad[k][0]=adc_data;
- ad[k][1]=adc_low2;
- }
- void set_off()
- {
- uchar i=0x0f;
- p1m0&=i;
- p1m1&=i;
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //堵轉的比較;
- void duzhpd()
- { uchar i,j;
- for(i=0;i<4;i++)
- { switch(i)
- { case 0:{if(ad[i][0]>=DZHZj) //P1.7聚焦電動機+12V。
- {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();}
- break;}
- case 1:{if(ad[i][0]>=DZHZb) //P1.6變焦電動機+12V。
- {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();slg=0;}
- break;}
- case 3:{if(ad[i][0]>=DZHZg) //P1.4光圈電動機+5V。
- {for(j=0;j<3;j++)kk[i][j]=0x00;kk[i][0]=0x01;kongzhi();dlm();}
- break;}
- default: ;
- }
- }
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //四個電動機的控制矩陣
- void kongzhi()
- { uchar i,j,k,m=0;
- for(i=0;i<4;i++,m=0 )
- for(j=0;j<3&&m==0;j++)
- if(kk[i][j]!=0x00)
- {m=1;
- switch(i)
- { case 0:{ switch(j) //C5 第一個聚焦電機的控制:停轉,正轉,反轉。只能用一個為真;
- {case 0: {P3_5=0;P3_4=0;dlm();delay5ms();break;}
- case 1: {P3_5=0;P3_4=1;dlm();delay5ms();break;}
- case 2: {P3_5=1;P3_4=0;dlm();delay5ms();break;}
- default:{P3_5=1;P3_4=1;dlm();delay5ms();}
- }
- }break;
- case 1:{ switch(j) //C4 第二個變焦電機的控制:停轉,正轉,反轉。只能用一個為真;
- {case 0: {P3_3=0;P3_2=0;dlm();delay5ms();break;}
- case 1: {P3_3=0;P3_2=1;dlm();delay5ms();break;}
- case 2: {P3_3=1;P3_2=0;dlm();delay5ms();break;}
- default:{P3_3=1;P3_2=1;dlm();delay5ms();}
- }
- }break;
- case 2:{ switch(j) //C2 第一個光圈電機的控制:停轉,正轉,反轉。只能用一個為真;
- {case 0: {P1_3=0;P1_2=0;dlm();delay5ms();break;}
- case 1: {P1_3=0;P1_2=1;dlm();delay5ms();break;}
- case 2: {P1_3=1;P1_2=0;dlm();delay5ms();break;}
- default:{P1_3=1;P1_2=1;dlm();delay5ms();}
- }
- }break;
- case 3:{ switch(j) //C3 第一個濾光電機的控制:停轉,正轉,停轉。只能用一個為真; 延時1s;后清除控制位解除自鎖;
- {case 0: {key=1; dlm();delay5ms();break;}
- case 1: {dukou1(); dlm();
- key=0;
- for(k=0;k<200;k++)
- delay5ms();
- key=1;
- kk[i][j]=0x00;dlm();delay5ms();break;}
- case 2: {dukou1(); dlm();delay5ms();break;}
- default:{key=1; dlm();delay5ms();}
- }
- }break;
- default:{ i=4;j=3;}
- }
- }
- }
- void guan_kongzi() //出錯處理程序 3處。
- { uchar i,j;
- for(i=0;i<4;i++)
- for(j=0;j<3;j++)
- kk[i][j]=0x00;
- }
- /////////////////////////////////
- void qingli()
- {
- uchar i;
- xx=0;
- for(i=0;i<10;i++)
- {
- rdata_tmp[i]=0;
- sdata_tmp[i]=0;
- if(i<7)
- data_tmp[i]=0;
- }
- }
- //時刻發送的數據
- void fs()
- {
- //dukou1();
- //data_tmp[1]=0xC3; //發送濾光片的代號.
- //shuj_chuli();
- //delay5ms();delay5ms();delay5ms();delay5ms();
- //delay5ms();delay5ms();delay5ms();delay5ms();
- //delay5ms();delay5ms();delay5ms();delay5ms();
- //delay5ms();delay5ms();delay5ms();delay5ms();
- adc();
- //jj=((int)(((int)(ad[2][0]))<<2+((int)(ad[2][1]))));
- //jjub[0]=jiaoju1024[jj][0];
- //jjub[1]=jiaoju1024[jj][1];
- jisuan();
- data_tmp[1]=0xC0; //發送焦距的數值.
- shuj_chuli();
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //串口中斷調用的接收程序?
- uchar rc()
- { uint ch=0;
- uchar count=0;
- if(flg==0)
- { RI=0;ch=0;
- for( count=0;count<10;count++ )
- {
- rdata_tmp[count]=SBUF;
- if(rdata_tmp[0]==0x02)
- {
- if(rdata_tmp[count]==0x03)
- {rdata_tmp[9]=count+1;return(1);}
- }
- else return(0);
- while(RI==0){if((++ch)>1000)return(0);}
- RI=0;
- ch=0;
- }
- }
- return(0);
- }
- //接收數據校驗碼錯誤;
- void weiyi()
- {uchar i=0,ch;
- for(i=0,data_tmp[6]=0;i<rdata_tmp[9];i++,data_tmp[6]++)
- { data_tmp[data_tmp[6]]=rdata_tmp[i];
- if(i>1&&i<rdata_tmp[9])
- {if(rdata_tmp[i]==0x1B)
- {data_tmp[data_tmp[6]]=(rdata_tmp[i+1]&0x7F);i++;}
- }
- }
- for(i=1,ch=0;i<(data_tmp[6]-2);i++)
- ch^=data_tmp[i]; //驗證校驗和;
- if(ch!=data_tmp[data_tmp[6]-2])
- {data_tmp[1]=0xcf;xx=02;
- guan_kongzi(); //出錯處理4處
- P3|=0x3C;P1|=0x0C;}
- }
- //對指令的判斷
- uchar zhilxy()
- {uchar n=0;
- if(data_tmp[0]==0x02||xx!=0x00)//對接收指令的判斷;
- { switch(data_tmp[1])
- {case 0xc0: n=4;break; //判斷焦距指令的并求出指令長度
- case 0xc1: n=6;break; //焦距設定值;
- case 0xc2: n=5;break; //光圈控制;
- case 0xc3: n=5;break; //濾光片控制;
- case 0xc4: n=5;break; //變焦控制;
- case 0xc5: n=5;break; //聚焦控制;
- case 0xcf: n=5;break;
- default: {xx=01;return(0);} //無效指令;
- }
- if(n!=data_tmp[6])
- {xx=03;return(0);} //數據長度錯誤;03
- switch(n)
- {case 4: if(data_tmp[1]==data_tmp[2])return(1);break;
- case 5: if((data_tmp[1]^data_tmp[2])==data_tmp[3])return(1);break;
- case 6: if((data_tmp[1]^data_tmp[2]^data_tmp[3])==data_tmp[4])return(1);break;
- default:;
- }
- }
- else xx=0x01; //無效指令; 01
- // xx==0x02; //校驗碼錯誤;02
- return (0);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //指令執行;
- void zhiling_yingda()
- { uchar i=0,ky;
- switch(data_tmp[1])
- {//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[][]表格取焦距數值;
- //case 0xc0:{adc();dlm();jj=((int)(((int)(ad[2][0]))<<2+((int)(ad[2][1]))));jisuan();}break; //查表jiaoju[][]取焦距對應的數值;
- case 0xc0:{adc();dlm();jisuan();}break; //通過計算求焦距的數 8位數值計算;
- case 0xc1:{shedz=(uint)(gaodi8(data_tmp[2],data_tmp[3]));ffind();}break; //shedz==((((int)(data_tmp[2]))<<8)+((int)(data_tmp[3]))); //焦距設定值=取焦距數值;
- 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;} //光圈控制;
- 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;} //濾光片控制;
- 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;} //變焦控制;
- 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;} //聚焦控制;
- default: {data_tmp[1]=0xcf;if(xx==0)xx=0x01;} //命令字出錯
- }
- }
- //////////////////////////////////////////////////////////////////////////////
- void jisuan() //dy_changdu()
- {
- uchar i;
- int a,b,c,e,d,x;
- for(i=1;i<Fwei;i++) //i 的范圍隨著采樣的數據要改
- if(ceduib[i][0]>=ad[2][0]) break;
- if(ceduib[i-1][0]<ad[2][0]) //判斷它的下限.
- {a=low2(ceduib[i-1][0],ceduib[i-1][1]);
- b=low2(ad[2][0],ad[2][1]);
- c=low2(ceduib[i][0],ceduib[i][1]);
- d=gaodi8(ceduib[i-1][2],ceduib[i-1][3]);
- e=gaodi8(ceduib[i][2],ceduib[i][3]);
- if(c!=a)
- x=d+(b-a)*(e-d)/(c-a); //求出測量值;
- else
- x=74;
- jj=(uint)(x);
- jjub[0]=(uchar)((jj>>8)&0x00ff);
- jjub[1]=(uchar)(jj&0x00ff);
- }
- else
- { x=74;
- jj=(uint)(x);
- jjub[0]=(uchar)(jj>>8);
- jjub[1]=(uchar)(jj&0x00ff);
- }
- //中間變量為jj;
- }
- //根據設定值和采樣值比較進行判斷比較
- void ffind()
- { uchar k;
- adc();jisuan();delay5ms();
- for(k=0;k<3;k++) kk[1][k]=0x00;
- if(shedz<3) {for(k=0;k<3;k++)kk[1][k]=0x00;kk[1][0]=0x01;slg=0;shedz=0;kongzhi();}
- 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;}
- else
- 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();}
- else { if((shedz-2)>=jj) {for(k=0;k<3;k++)kk[1][k]=0x00; kk[1][1]=0x01;kongzhi();dlm();
- if((shedz-2)>jj)slg=1;for(k=0;k<3;k++)kk[1][k]=0x00;kongzhi();} //焦距電機正傳; 調試?
- else
- {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();} //焦距電機反轉;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //指令的返回處理和輸出
- void shuj_chuli()
- {uchar i; sdata_tmp[0]=0x06;
- switch(data_tmp[1])
- {case 0xc0:{
- sdata_tmp[1]=data_tmp[1];
- i=sdata_tmp[1]^jjub[0]^jjub[1];
- if(jjub[0]==0x02||jjub[0]==0x03||jjub[0]==0x06||jjub[0]==0x15||jjub[0]==0x1B)
- {
- sdata_tmp[2]=0x1B;sdata_tmp[3]=jjub[0]|0x80;
- if(jjub[1]==0x02||jjub[1]==0x03||jjub[1]==0x06||jjub[1]==0x15||jjub[1]==0x1B)
- {
- sdata_tmp[4]=0x1B;sdata_tmp[5]=jjub[1]|0x80;
- sdata_tmp[6]=i;
- if(sdata_tmp[6]==0x02||sdata_tmp[6]==0x03||sdata_tmp[6]==0x06||sdata_tmp[6]==0x15||sdata_tmp[6]==0x1B)
- {
- sdata_tmp[7]=sdata_tmp[6]+0x80;sdata_tmp[6]=0x1B;sdata_tmp[8]=0x03;sdata_tmp[9]=0x09;
- delay5ms();
- } //九位指令
- else
- {
- sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
- delay5ms();
- } //八位指令
- }
- else
- {
- sdata_tmp[4]=jjub[1];
- sdata_tmp[5]=i;
- if(sdata_tmp[5]==0x02||sdata_tmp[5]==0x03||sdata_tmp[5]==0x06||sdata_tmp[5]==0x15||sdata_tmp[5]==0x1B)
- {
- sdata_tmp[6]=sdata_tmp[5]+0x80;sdata_tmp[5]=0x1B;sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
- delay5ms();
- } //八位指令
- else
- {
- sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
- delay5ms();
- } //七位指令
- }
- }
- else
- { sdata_tmp[2]=jjub[0];
- if(jjub[1]==0x02||jjub[1]==0x03||jjub[1]==0x06||jjub[1]==0x15||jjub[1]==0x1B)
- {
- sdata_tmp[3]=0x1B;sdata_tmp[4]=jjub[1]|0x80;
- sdata_tmp[5]=i;
- if(sdata_tmp[5]==0x02||sdata_tmp[5]==0x03||sdata_tmp[5]==0x06||sdata_tmp[5]==0x15||sdata_tmp[5]==0x1B)
- {
- sdata_tmp[6]=sdata_tmp[5]+0x80;sdata_tmp[5]=0x1B;sdata_tmp[7]=0x03;sdata_tmp[9]=0x08;
- delay5ms();
- } //八位指令
- else
- {
- sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
- delay5ms();
- }
- } //七位指令
- else
- {
- sdata_tmp[3]=jjub[1];
- sdata_tmp[4]=i;
- if(sdata_tmp[4]==0x02||sdata_tmp[4]==0x03||sdata_tmp[4]==0x06||sdata_tmp[4]==0x15||sdata_tmp[4]==0x1B)
- {
- sdata_tmp[5]=sdata_tmp[4]+0x80;sdata_tmp[4]=0x1B;sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;
- delay5ms();
- } //七位指令
- else
- {
- sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;
- delay5ms();
- } //六位指令
- }
- }
- delay5ms();
- }break;
- case 0xc1: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:設定值;
- case 0xc2: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:光圈控制;
- case 0xc3:{sdata_tmp[1]=0xc3; //輸出濾波片的編碼指令編寫;
- if(flg==0)dukou1();i=sdata_tmp[1]^bb; //沒有進中斷讀口求bb;
- if(bb==0x02||bb==0x03)
- {sdata_tmp[2]=0x1b;sdata_tmp[3]=bb|0x80;
- sdata_tmp[4]=i;
- if(sdata_tmp[4]==0x02||sdata_tmp[4]==0x03||sdata_tmp[4]==0x06||sdata_tmp[4]==0x15||sdata_tmp[4]==0x1B)
- {sdata_tmp[5]=sdata_tmp[4]+0x80;sdata_tmp[4]=0x1B;sdata_tmp[6]=0x03;sdata_tmp[9]=0x07;} //七位指令
- else
- {sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;} //六位指令
- }
- else {sdata_tmp[2]=bb;sdata_tmp[3]=i;
- if(sdata_tmp[3]==0x02||sdata_tmp[3]==0x03||sdata_tmp[3]==0x06||sdata_tmp[3]==0x15||sdata_tmp[3]==0x1B)
- {sdata_tmp[4]=sdata_tmp[3]+0x80;sdata_tmp[3]=0x1B;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;} //六位指令
- else
- {sdata_tmp[4]=0x03;sdata_tmp[9]=0x05;} //五位指令
- }
- }break;
- //濾光片控制;
- case 0xc4: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:變焦控制;
- case 0xc5: for(i=1;i<10;i++)sdata_tmp[i]=rdata_tmp[i];break; //原樣返回指令:聚焦控制;
- default: { sdata_tmp[1]=0xcf;
- switch(xx) //指令、校驗位和數據長度出錯輸出;
- {case 0x02: sdata_tmp[2]=0x1b;sdata_tmp[3]=0x82;sdata_tmp[4]=0xcd;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;break; //校驗碼錯
- case 0x03: sdata_tmp[2]=0x1b;sdata_tmp[3]=0x83;sdata_tmp[4]=0xcc;sdata_tmp[5]=0x03;sdata_tmp[9]=0x06;break; //數據長度錯
- default : sdata_tmp[2]=0x01;sdata_tmp[3]=0xce;sdata_tmp[4]=0x03;sdata_tmp[9]=0x05; //無效命令
- }
- guan_kongzi();
- P3|=0x3C;P1|=0x0C;
- }
- xx=0;data_tmp[1]=0x00;
- }
- for(i=0;i<sdata_tmp[9]&&i<10;i++)
- send_date(sdata_tmp[i]);
- }
- //The end。
復制代碼 |
-
-
HLM75375.zip
2022-9-27 15:22 上傳
點擊文件名下載附件
6.31 KB, 下載次數: 3
點C文件
|