⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 红外.txt

📁 红外通信程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	uchar data  i,time,x_data,ma;
 	uchar data  j,s,len,h,RD;
 	uchar xdata *pm;
 	uint  data  c,cj,n,cc;
	if(int3==0)
    {int3=0;int2=0;}    							// 设置为红外接收状态
    else return;
  	ledst(0xf7);
  	P1=0xf1;
  	buf_ptr=(HBUF xdata *)BUF_ADD;
  	i=0;j=0;
  	ysrxd=240;time=0;x_data=0;
  	while(1)
    {
		P1=0xf4;P1=0xf1;                  			// 清狗
       	ledst(0xf7);
       	if(ysrxd==0){ysrxd=240;time++;}
       	if(time>=5)break;               			// 1分钟退出
       	if(x_data>180)break;
       	if(RI==0)continue;
       	RI=0;RD=SBUF;
       	if(RD!='R'){x_data++; continue;}
       	x_data=0;
       	buf_ptr->buf0[0]=buf_ptr->buf0[1]=buf_ptr->buf0[2]=0xff;
       	ysrxd=40;
       	while(ysrxd)
	  	{
			if(RI==1)								 // 接收长度
	       	{
            	RI=0;RD=SBUF;
                buf_ptr->buf0[0]=RD;len=RD;break;
			}
	      	else if(ysrxd==0) break;
            P1=0xf4; P1=0xff;
		}
       	if(!ysrxd) continue;                      	// 延时到 退出
       	if(len==0){ysrxd=240;time=0;continue;} 		// 长度为0 继续等待接收
       	if(len>=0x60){ysrxd=240;time=0;continue;}   // 长度超界 继续等待接收
       	ledst(0xe7);
       	len--;
       	for(i=1;i<=len;i++)
	  	{
			for(ysrxd=20;ysrxd;)
	      	{
            	if(RI==1)
		    	{
                	RI=0;RD=SBUF;
                    buf_ptr->buf0[i]=RD;  			// 接收数据
		      		ysrxd=10; break;
		    	}
		 		P1=0xf4; P1=0xf1;  					// 清狗
		 		if(ysrxd==0) break;
	      	}
			if(!ysrxd){i=0;goto RETFORL;}
	  	}
       	P1=0xf4;P1=0xff;s=0;
       	for(i=0;i<len;i++)
		{s=s+buf_ptr->buf0[i];}    				// 判校验和
       	if(s==buf_ptr->buf0[i])
	   	{ysrxd=240;i=1;}
	  	else i=0;
RETFORL:
		ledst(0xf7);
       	ysrxd=240;
       	if(i==0){i=0;continue;}
       	buf_ptr=(HBUF xdata *)BUF_ADD;
       	if(buf_ptr->buf0[1]==3) break;
       	if(buf_ptr->buf0[1]==1)					// 协议配置请求(Code=1)
	   	{
			ledst(0xd7);
            P1=0xf1;
			buf_ptr=(HBUF xdata *)BUF_ADD;
	     	len=buf_ptr->buf0[0]-3;s=0;
	       	for(i=0;i<len;i++)
		 	{
				h=0;
		   		for(j=1;j<0x0e;j++)
			 		if(buf_ptr->buf0[i+2]==j){h=1;break;}
		   		if(h==0){buf_ptr->buf0[s]=buf_ptr->buf0[i+2];s++;}
		 	}
	     	j=0;
	     	if(s!=0)
	       	{
				txdbyte('A'); txdbyte(s+3); txdbyte(0);
		  		for(i=0;i<s;i++)
		    	{txdbyte(buf_ptr->buf0[i]);j=j+buf_ptr->buf0[i];}
		  		txdbyte(j);
			}
	       	else
			{
				txdbyte('A');  txdbyte(13);    // 长度
			 	txdbyte(2);
			 	txdbyte(4);  txdbyte(5);  txdbyte(6);  txdbyte(7);
			 	txdbyte(8);  txdbyte(9);  txdbyte(0x0a);  txdbyte(0x0b);
                txdbyte(0x0c);  txdbyte(0x0d);
			 	txdbyte(11+2+4+5+6+7+8+9+0x0a+0x0b+0x0c+0x0d);   // 累加和
			}
	     	ysrxd=240; time=0; continue;
		}
		if(buf_ptr->buf0[1]>0x0d)				// 本次通讯未定义(code>0x0D)
		{
			txdbyte('A'); txdbyte(4);  txdbyte(0);
            txdbyte(buf_ptr->buf0[1]);
            P1=0xf1;
            s=buf_ptr->buf0[1]+4;
            txdbyte(s);
            P1=0xff;
            ysrxd=240; time=0; continue;
		}
		if(buf_ptr->buf0[1]==0x0d)				// 确认集中器密码(code=0x0D)
		{
			ledst(0xd7);
            for(i=0;i<9;i++)
            	if(buf_ptr->buf0[i+6]!=mima[i]) goto mimaerpd1;
            ma=1;
            txdbyte('A');txdbyte(0);
            ysrxd=240; time=0; continue;
mimaerpd1:
			for(i=0;i<9;i++)
            	if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i]) goto mimaerpd2;
            ma=1;
            for(i=0;i<9;i++)
			{mima[i]=buf_ptr->buf0[i+6];}
			txdbyte('A');txdbyte(0);
            ysrxd=240;time=0;continue;
mimaerpd2:
			for(i=0;i<9;i++)
            	if(buf_ptr->buf0[i+6]!=buf_ptr->buf3[i+100]) goto mimaerpd;
            ma=1;
            for(i=0;i<9;i++)
			{
				mima[i]=buf_ptr->buf0[i+6];
				buf_ptr->buf3[i]=buf_ptr->buf0[i+6];
			}
            txdbyte('A');  txdbyte(0);
            ysrxd=240; time=0; continue;
            mimaerpd:
            ma=0;
            txdbyte('A');
            for(i=0;i<16;i++)
            	txdbyte(buf_ptr->buf0[i]);       // 实用时加上
            ysrxd=240; time=0; continue;
		}
       	if(buf_ptr->buf0[1]==0x0c)				// 设置集中器密码(code=0x0C)
	{
		// 52 10 0C 00 00 00 02 30 30 30 30 30 30 30 30 30 CE
        	ledst(0xd7);
            	if(ma==1)
		{
			for(i=0;i<9;i++)
			{
				mima[i]=buf_ptr->buf0[i+6];
                    		buf_ptr->buf3[i]=buf_ptr->buf0[i+6];
                    		buf_ptr->buf3[i+100]=buf_ptr->buf0[i+6];
			}
                	miyao[0]='M';miyao[1]='I';miyao[2]='Y';
                	miyao[3]='A';miyao[4]='O';
                	txdbyte('A');txdbyte(0);
                	ysrxd=240;time=0;continue;
		}
		txdbyte('E');txdbyte(0);
		ysrxd=240;time=0;continue;
	}
	if(ma==1) goto mimastpd;
	else
	{
		if(buf_ptr->buf0[1]==5) goto mimastpd;
		if(buf_ptr->buf0[1]==7)
		if(buf_ptr->buf0[0]==3) goto mimastpd;
		ma=0;
		ysrxd=240; time=0; continue;  		// 实用时加上
	}
mimastpd:
		if(buf_ptr->buf0[1]==4)					// 数据库下载(code=4)
	   	{
			ledst(0xd7);
            P1=0xf1;buf_ptr = (HBUF xdata *)BUF_ADD;
	     	c=256*(unsigned)buf_ptr->buf0[2]+(unsigned)buf_ptr->buf0[3]; //取地址
	     	if((c>=0)&&(c<=447)){P1=0xf1; h=0; goto XXXL4;}
	     	if((c>447)&&(c<895)){P1=0xf9; h=1; c=c-447; goto XXXL4;}
	     	if((c>894)&&(c<1341)){P1=0xf2; h=2; c=c-894;}
	       	else {P1=0xf2; h=2; c=1341-894;}
XXXL4:
			pm=(unsigned char xdata *)(JZQ_ADD+0x80*c);  // 取指针地址
	     	dat_ptr=(DAT_ITEM xdata *)pm;
	     	len=buf_ptr->buf0[0]-1;
	     	for(i=0,len-=5;i<len;i++) *pm++=buf_ptr->buf0[i+4];
	     		for(;i<0x80;i++) *pm++=0;
	     			if(c)								// 未抄计次
					{
						dat_ptr->e_cnt=255;
		      			if(h==0) dat_ptr->zjq_len=c;
		      			if(h==1) dat_ptr->zjq_len=c+447;
		      			if(h==2) dat_ptr->zjq_len=c+894;
					}
	     	P1=0xff;
            c_zb=1;loop_l=0;loop_z=0;c_zbpo=0;
	     	txdbyte('A');txdbyte(0);
	     	ysrxd=240; time=0; continue;
		}
       	if(buf_ptr->buf0[1]==5)					// 抄录集中器的下载参数数据库(code=5)
	   	{
			ledst(0xd7);
            P1=0xf1;buf_ptr = (HBUF xdata *)BUF_ADD;
	     	c=256*(unsigned)buf_ptr->buf0[2]+(unsigned)buf_ptr->buf0[3]; 	//取地址
	     	c=comp1(c);
	     	pm=(unsigned char xdata *)(JZQ_ADD+0x80*c);
            dat_ptr=(DAT_ITEM xdata *)pm;
	     	if(c) len=0x18;    												// 电表库长度
	      	else len=28;    												// 集中器库长度
	     	txdbyte('A');  txdbyte(len);  txdbyte(5);
	     	s=0;
	     	if(c!=0)
			{
				txdbyte(buf_ptr->buf0[2]);txdbyte(buf_ptr->buf0[3]);
				s=buf_ptr->buf0[2]+buf_ptr->buf0[3];
			}
	    	else s=0;
		    s=s+len+5;
		    if(len==0x18) //len=len-2;
	        {
				if(dat_ptr->pre_sno!=0){len=len-2; goto fashpd;}
				if(dat_ptr->s_xh==0){len=len-2; goto fashpd;}
	            len=len-7;
	            for(i=0;i<len;i++)
	            {
					txdbyte(*pm);
			        s+=*pm++;
				}
				i=dat_ptr->s_xh>>8;
	            s+=i; txdbyte(i);
	            i=(char)dat_ptr->s_xh;
	            s+=i; txdbyte(i);
			}
	        else 
			{
fashpd:
				for(len-=3,i=0;i<len;i++)
		        {
					txdbyte(*pm);
			        s+=*pm++;
				}
			}
		    txdbyte(s);
		    ysrxd=240;time=0; continue;
		}
		if(buf_ptr->buf0[1]==6)					// 点抄单块表(code=6)
		{
			ledst(0xd7);
	        	ys1(0xff);
	        	ledst(0xf7);
	        	P1=0xf1;  buf_ptr  = (HBUF xdata *)BUF_ADD;
		    	if((buf_ptr->buf0[2]&0x01)==0x0)    			// 无 中继标志
			{
				if(PLM_snd_rcv2())
				{
					ledst(0xd7);
	                		txdbyte('A');
				    	len=buf_ptr->buf0[3]+3; txdbyte(len); txdbyte(6); s=len+6;
				    	len=len-3;
				    	for(i=0;i<len;i++)
				    	{
						txdbyte(buf_ptr->buf0[i+4]);
					 	s+=buf_ptr->buf0[i+4];
				    	}
				    	txdbyte(s);
	                		ledst(0xf7);
				}
				else
				{txdbyte('A');txdbyte(0);}
			}
			else		  // 有中继标志
			{
				if(PLM_snd_rcv1())
				{
					ledst(0xd7);
	                		txdbyte('A');
				    	len=buf_ptr->buf0[3]+3; txdbyte(len); txdbyte(6); s=len+6;
				    	len=len-3;
				    	for(i=0;i<len;i++)
				    	{
						txdbyte(buf_ptr->buf0[i+4]);
					 	s+=buf_ptr->buf0[i+4];
					}
				    	txdbyte(s);
	                		ledst(0xf7);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -