51单片机接收到指令后的控制问题

[复制链接]
 楼主| wy82099589 发表于 2015-1-9 18:03 | 显示全部楼层 |阅读模式
我最近在做套用AT89S52开发的控制柜的板子, 是利用RS485的方式从上位机通过单片机控制40个接口。
      协议、通信、控制功能都已经实现了,现在为了加强协议的抗干扰性,在协议里面加了一位“01”和“04”命令标识,例如我发送 68 01 01 06 01 00 00 00 8C,单片机接收到这串指令后,只是通过译码器识别40个接口的高低电平的状态,而不通过译码器发送这串指令去控制任何一个接口的高低电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;我要是发送68 01 04 06 01 00 00 00 8C,单片机接收到这串指令后,通过译码器将1号接口置为高电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;
      目前程序流程就是上位机发一组指令,单片机返回一组指令,我现在在协议里加上命令标示后(“04”好说,保存原状就行)当单片机收到带“01”的指令后,怎么样不向译码器发送这串指令去控制接口,并且读一遍所有接口的状态返回给上位机?怎么样通过程序控制单片机如何处理接收到的指令?
      下面是我写得这部分功能代码,那位专家帮忙指导下,如做过类此的东西,能直接附上代码让我学习下最好了!!!!谢谢
  1. void main(void)
  2. {
  3. unsigned char i;
  4. UART_init();        //初始化串口

  5. LED=0;                  //red lamp   
  6. RS485E=0;                  //green lamp   
  7.      
  8. //  addr_re();
  9. (*((void (*)())(addr_re)))();  // 执行上一行代码,将rst数组当函数调用
  10. (*((void (*)())(rq)))();


  11. //UART_init();        //初始化串口
  12. for(i = 0;i < 10 ;i++)
  13. {
  14.          //首先发送一次数据作为测试用
  15.    (*((void (*)())(COM_send)))();
  16. }

  17. while(1)   
  18.         {
  19.        
  20.         WDI=0;
  21.           
  22.         if(read_flag==1)  //如果取数标志已置位,就将读到的数从串口发出
  23.                 {
  24.                
  25.                         RS485E=1;
  26.                          (*((void (*)())(COM_send)))();
  27.                         _nop_();
  28.                         read_flag=0; //取数标志清0
  29.                 }
  30.         else
  31.                 {
  32.                         RS485E=0;               
  33.                 }
  34.                  
  35.         WDI=1;
  36. //;_nop();
  37.        
  38.         }  
  39. }
下面是协议定义部分内容,协议写在中断里面了
  1. case 2: //命令标示
  2.                 if(temp==0x01)  
  3.                         {
  4.                                 cmd_order=temp;
  5.                                 state=3;
  6.                         }
  7.                         else if(temp==0x04)  
  8.                         {
  9.                                 cmd_order=temp;
  10.                                 state=3;
  11.                         }
  12.                         else
  13.                         {
  14.                                 rc_index=0;
  15.                                 state=0;
  16.                                 MSG_LEN=0;
  17.                                 sum=0;
  18.                            }
  19.                 break;
  20.                 case 3: //接收数据长度
  21.                         if(temp<=7)
  22.                         {
  23.                                 MSG_LEN=temp;
  24.                                 prar_len=MSG_LEN-1;
  25.                                 state=4;
  26.                         }
  27.                         else
  28.                         {
  29.                                 rc_index=0;
  30.                                 state=0;
  31.                                 MSG_LEN=0;
  32.                                 sum=0;
  33.                         }
  34.                 break;       
  35.                 case 4: //获取命令参数
  36.                         rbut[rc_index]=temp;
  37.                         sum=sum+temp;
  38.                         rc_index=rc_index+1;
  39.                         if(rc_index>=prar_len)  state=5;
  40.                 break;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部