|
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。
复制代码 |
|