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

📄 485.c

📁 本程序为C8051F020与PC机进行485串口通讯中下位机的通讯程序
💻 C
字号:
void slave_rs485(void) interrupt 4 using 3
{  
	unsigned char idata s;  // 
	bit flag = 0;           // 两次数据符合标志
 	if(TI)       //发送中断
	{ 
    	TI = 0;
	}
 	if(RI)         //接收上位机命令、地址或数据
 	{
     	s = SBUF;
     	RI = 0;
     	if(((local_bz == 1) || (local_bz == 2)) && (s > 0xbf))
        {            		
           	rnum++;
     		if(rnum == 1) s1 = s;
     		if(rnum == 2)
     		{
     			if(s == s1) flag = 1; // 标志置1
     			s1 = 0;
     			rnum = 0;
     		}
     	}
     	if(task_list == 0xff)     //上次命令处理完毕则接收,否则不接收
     	{   // 判断数据类型
        	if(((s & 0xf0) == 0xa0) || ((s & 0xf0) == 0xb0))  // 收到的是呼叫地址类信号(设备号)
           	{
				if(s == slave)	  // 呼叫本机
               	{ 
               		local_bz = 1; // 置标记                
                 	RE_DE = 1;    // 485发送状态
                 	SBUF = slave; // 返回本机地址
                 	while(TI == 0);            
					TI = 0;
                	RE_DE = 0;    // 485接收状态
                }	
                else {if(s == 0xa0)	local_bz = 2; // 通用设备号,置标记
                	 else local_bz = 0;}	// 非本机
          	} 
         	else                  // 收命令类信号,数据以后再收
            { 
     			if(flag == 1)             // 
     			{
     				flag = 0;
            		if((local_bz == 1) && (s > 0xbf))
               		{ 
                 		if((s == 0xc1) || (s == 0xc2) || (s == 0xc3))
                 		{
                 			if((s == 0xc1) && ((test_bz == 0) || (tick1_bz == 1)))// 停机状态或单次测量状态时响应c1命令
                 			{
                 				test_bz = 1;
                 				RE_DE = 1;
         		     	  		SBUF = s;         // 返回接受的命令
          	 	      			while(TI == 0);            
								TI = 0;
              		  	 		RE_DE = 0;
                	  			task_list = s;    // 接收命令,设置任务 
                 			}
                 			if((s == 0xc2) && ((test_bz == 1) || (tick1_bz == 1)))// 连续测量状态或单次测量状态时响应c2命令
                 			{
                 				test_bz = 0;
                 				RE_DE = 1;
         		       			SBUF = s;         // 返回接受的命令
          	 	      			while(TI == 0);            
								TI = 0;
              		   			RE_DE = 0;
                	  			task_list = s;    // 接收命令,设置任务 
                 			}
                 			if(s == 0xc3)
                 			{
                 				RE_DE = 1;
         		       			SBUF = s;         // 返回接受的命令
          	 	      			while(TI == 0);            
								TI = 0;
              		   			RE_DE = 0;
                	  			task_list = s;    // 接收命令,设置任务 
                 			}
         	        	
                  		}
                  		else 
                  		{
                  			if(cons_bz == 1)  // 连续测量中,其它命令非法
                  			{
                  			//	RE_DE = 1;
         		       		//	SBUF = 0xee;  // 返回错误标志
          	 	      		//	while(TI == 0);            
							//	TI = 0;
              		   		//	RE_DE = 0;
                  			}
                  			else 
                  			{
                  				if(s == 0xc0)
                  				{
                  					RE_DE = 1;
         		       				SBUF = s;      // 返回接受的命令
          	 	      				while(TI == 0);            
									TI = 0;
              		   				RE_DE = 0;
                	  				task_list = s; // 接收命令,设置任务 
                  				}
                  				if(s == 0xc6)
                  				{
                  					RE_DE = 1;
         		       				SBUF = s;      // 返回接受的命令
          	 	      				while(TI == 0);            
									TI = 0;
              		   				RE_DE = 0;
                	  				task_list = s; // 接收命令,设置任务 
                  				}
                  
                  			}
                  		}	
                	}
                	if((local_bz == 2) && ((s == 0xc1) || (s == 0xc2) || (s == 0xc4) || (s == 0xc5)))   // 设备号是A0时不可向主机返回信号
                	{ 
                	  	if((s == 0xc1) && ((test_bz == 0) || (tick1_bz == 1)))// 停机状态或单次测量状态时响应c1命令
                  		{task_list = s; test_bz =1;}// 接收命令,设置任务 
                  		if((s == 0xc2) && ((test_bz == 1) || (tick1_bz == 1)))// 连续测量状态或单次测量状态时响应c2命令
                  		{task_list = s; test_bz =0;}// 接收命令,设置任务 
                  		if((s == 0xc4) || (s == 0xc5)) task_list = s;
                	}
            	}
            }
    	}

⌨️ 快捷键说明

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