打印

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

[复制链接]
604|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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”的指令后,怎么样不向译码器发送这串指令去控制接口,并且读一遍所有接口的状态返回给上位机?怎么样通过程序控制单片机如何处理接收到的指令?
      下面是我写得这部分功能代码,那位专家帮忙指导下,如做过类此的东西,能直接附上代码让我学习下最好了!!!!谢谢
void main(void)
{
unsigned char i;
UART_init();        //初始化串口

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


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

while(1)   
        {
       
        WDI=0;
          
        if(read_flag==1)  //如果取数标志已置位,就将读到的数从串口发出
                {
               
                        RS485E=1;
                         (*((void (*)())(COM_send)))();
                        _nop_();
                        read_flag=0; //取数标志清0
                }
        else
                {
                        RS485E=0;               
                }
                 
        WDI=1;
//;_nop();
       
        }  
}
下面是协议定义部分内容,协议写在中断里面了
case 2: //命令标示
                if(temp==0x01)  
                        {
                                cmd_order=temp;
                                state=3;
                        }
                        else if(temp==0x04)  
                        {
                                cmd_order=temp;
                                state=3;
                        }
                        else
                        {
                                rc_index=0;
                                state=0;
                                MSG_LEN=0;
                                sum=0;
                           }
                break;
                case 3: //接收数据长度
                        if(temp<=7)
                        {
                                MSG_LEN=temp;
                                prar_len=MSG_LEN-1;
                                state=4;
                        }
                        else
                        {
                                rc_index=0;
                                state=0;
                                MSG_LEN=0;
                                sum=0;
                        }
                break;       
                case 4: //获取命令参数
                        rbut[rc_index]=temp;
                        sum=sum+temp;
                        rc_index=rc_index+1;
                        if(rc_index>=prar_len)  state=5;
                break;

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝