导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:大家帮我看看通讯!!!

* 12828: C51编程:大家帮我看看通讯!!!

   Jerrycjt 
Jerrycjt发表的帖子 

 C51编程:大家帮我看看通讯!!!
485通讯 CTR485 为控制线 偶校验、累加和校验
格式: FE FE FE FE 68 X X X X X X 68 X  L  X .... CRC 16 

 #include        <c:\comp51\reg52.h>
#include     <c:\comp51\intrins.h>
typedef        unsigned char         uchar;
typedef        unsigned int        uint;
typedef        unsigned long        ulong;

struct    ByteDcr
{
    uchar     ByteHI;
    uchar     ByteLO;
};
union        WordDcr
{
    uint    Word;
    struct    ByteDcr    ByteWord;
};
union        WordDcr        idata        DDWord;
uchar        idata        MeterNO[6],InBuff[20];
uchar        idata        ControlNO,LengthNO,SystemError;
bit    fgDataEnable=0;
sbit        CTR485=P1^7;

void  answer_com(uchar ctr,uchar *str1,uint strlen1,uchar *str2,uint strlen2);
unsigned char receive_char_com(void);
bit  GetParity(unsigned char Datavalue);
void init_serialcomm(void);
void send_char_com(unsigned char ch);
void serial (void);
void main(void)
{
    init_serialcomm();  //初始化串口
    while(1)
    {
                        send_char_com(0x12);
                        if(fgDataEnable)
            {
                fgDataEnable=0;
                answer_com(0x81,MeterNO,0,MeterNO,0);

            }

    }
}
void  answer_com(uchar ctr,uchar *str1,uint strlen1,uchar *str2,uint strlen2)
{
        uchar check,k;
        send_char_com(0xfe);
        send_char_com(0xfe);
        send_char_com(0xfe);
        send_char_com(0xfe);
        send_char_com(0x68);
        check=0x68;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x00);
        check+=0x00;
        send_char_com(0x68);
        check+=0x68;
        send_char_com(ctr);
        check+=ctr;
        //send_char_com((DDWord.ByteWord.ByteLO+0x33));
        check+=(DDWord.ByteWord.ByteLO+0x33);
        //send_char_com((DDWord.ByteWord.ByteHI+0x33));
        check+=(DDWord.ByteWord.ByteHI+0x33);
        do
       {
        check+=*(str1+k);
        send_char_com(*(str1 + k));
        k++;
       } while(k < strlen1);
        do
       {
        check+=*(str2+k);
        send_char_com(*(str2 + k));
        k++;
       } while(k < strlen2);
        send_char_com(check);
        send_char_com(0x16);

}
bit GetParity(unsigned char Datavalue)
{
        ACC=Datavalue;
        if(P==1) return 1;
        else
        return 0;
}
void init_serialcomm(void)
{
    SCON  = 0xd0;       //SCON: serail mode 1, 8-bit UART, enable ucvr
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
    PCON |= 0x80;       //SMOD=1;
    TH1   = 0xFa;       //Baud:9600  fosc=11.05MHz
    ES=1;
    EA=1;            //Enable Serial Interrupt
        TR1=1;          // timer 1 run
}
unsigned char receive_char_com(void)
{
    unsigned int  Count=400;
   do{
    Count--;
    if(RI)
        {
        RI=0;
        if(RB8=GetParity(SBUF))  return SBUF;
        }
    }while(Count!=0);
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
        CTR485=0;
        TB8=GetParity(ch);
    SBUF=ch;
    while(TI==0);
    TI=0;
}

//串口接收中断函数
void serial () interrupt 4 using 1
{
    unsigned char i,CheckSum,Chal,ch;
    if(RI)
    {
        ES=0;
        RI=0;
        if(RB8==GetParity(SBUF))
        {
            if(SBUF==0x68)
            {
                Chal=0;
                CheckSum=0x68;
                for(i=0;i<6;i++)
                {
                    ch=receive_char_com();
                    CheckSum+=ch;
                         if(ch!=0)  Chal++;
                }
                if(Chal==0)
                {
                    if(receive_char_com()
==0x68)
                    {
                        CheckSum+=0x68;
                    
    ControlNO=receive_char_com();
                    
    CheckSum+=ControlNO;
                    
    LengthNO=receive_char_com();
                    
    CheckSum+=LengthNO;
                    
    DDWord.ByteWord.ByteLO=receive_char_com();
                    
    CheckSum+=DDWord.ByteWord.ByteLO;
                    
    DDWord.ByteWord.ByteHI=receive_char_com();
                    
    CheckSum+=DDWord.ByteWord.ByteHI;
                    
    DDWord.ByteWord.ByteHI-=0x33;
                  DDWord.ByteWord.ByteLO-=0x33;
                        if(LengthNO>2)
                  {
                             for(i=0;i<
(LengthNO-2);i++)
                       {

                        InBuff[i]=receive_char_com();
                        CheckSum+=InBuff[i];
                        }
                  }
                    
    i=receive_char_com();
                    
    ch=receive_char_com();
                        if((i==CheckSum)
&&(ch==0x16))   fgDataEnable=1;
                        ES=1;
                    }
                    else
                    {
                    ES=1;
                    }
                }
                else
                {
                ES=1;
                }
            }
            else
            {
            ES=1;
            }
        }
                _nop_();
    }
}


发表时间:2002年10月24日15:18:00

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:求教C高手,界面问题求教C高手,我用C编写了一个工业控制的程序,现在运行不错,但是后来要产品化,采用
[下一篇帖子]:硬件:16位单片机请教各位高手,当用C编写16位单片机程序时,如何更方便地定义、操作字节/位变量,同