C51半雙工通訊程序

        現在工程中大多使用485半雙工通訊,今天有人問這樣的程序,我翻找了一下以前寫的程序,正好找到一個.這個程序控制燈的亮與閃爍,比較簡單,通訊方面在發送端可以兩種方式發送,接受端只是被動發送.具體工作方式看程序吧!
 
/*--------------------------------------
串口半雙工發送程序
錦州硬盤之家

---------------------------------------*/

#include <reg51.h>
#include <intrins.h>

unsigned char data cn,s[7],f[7],intcount,*tp,sj,comcount;
bit done,sc,JSSS,BCS,TCS,JSSF,BCF,TCF,fkon,fkoff,halfms,rt,xyjss,xybc,spjss,spbc;

sbit LedJP=P0^3;
sbit LedJSS=P0^4;
sbit LedTC=P0^5;
sbit LedBC=P0^6;
sbit SPOUT=P0^7;

sbit SY=P3^2;
sbit XY=P1^3;
sbit JSS=P1^4;
sbit BC=P1^5;
sbit TC=P1^6;
sbit JP=P1^7;

sbit ComT=P3^3;

sbit Leden=P2^0;
sbit Ledcp=P3^6;

/*顯示,報警程序*/
void display(void)
{
  if(JSSS!=JSSF)
  {
    if(halfms)
    {
      if(JSSF) {LedJSS=0;LedJP=1;}
      else {LedJSS=1;LedJP=0;}
    }
    else
    {
      LedJSS=0;
      LedJP=0;
    }
    if(JSSS) LedJP=1;
    else LedJSS=1;
    spjss=1;    
  }
  else
  {
    if(JSSS) { LedJSS=0;LedJP=1;}
    else {LedJSS=1;LedJP=0;}
    spjss=0;
    xyjss=0;
  }
  if(BCF!=BCS || TCF!=TCS)
  {
    if(halfms)
    {
      if(TCF) {LedTC=1;LedBC=0;}
      if(BCF) {LedBC=1;LedTC=0;}
    }
    else
    {
      LedTC=0;
      LedBC=0;
    }
    if(BCS) LedBC=1;
    if(TCS) LedTC=1;
    spbc=1;

  }
  else
  {
    LedBC=0;LedTC=0;
    if(BCS) {LedBC=1;LedTC=0;}
    if(TCS) {LedTC=1;LedBC=0;}
    spbc=0;
    xybc=0;        
  }
    if((spjss && (!xyjss)) || (spbc && (!xybc)))
  {
    SPOUT=1;
  }
  else
  {
    SPOUT=0;
  }
  if(!SY)
  {
    LedJSS=1;
    LedJP=1;
    LedTC=1;
    LedBC=1;
    SPOUT=1;    
  }
  Ledcp=1;
  _nop_();_nop_();_nop_();
  Ledcp=0;
}

/*鍵盤識別程序*/
void kexe(void)
{
if(!JSS) JSSF=0;
if(!JP) JSSF=1;
if(!BC) {BCF=1;TCF=0;}
if(!TC) {BCF=0;TCF=1;}
if(!XY) { xyjss=1;xybc=1;}
}

/* 鍵盤抗干擾程序 */
void key(void)
{
P1=0xfC;
_nop_();_nop_();
if (P1!=0xfC)
    {
     if (fkon)
        {
         if (!fkoff)
            {
             kexe();fkoff=1;
            }
        }
     else
        fkon=1;
    }
else
    {
     fkon=0;fkoff=0;
    }
}

/*發送一個字節*/
void send(unsigned char c)
{
TI=0;
SBUF=c;
while(!TI);
TI=0;
}
/*接收一個字節*/
unsigned char receive(void)
{
/*while(!RI);*/
RI=0;
return SBUF;
}
/*時間中斷0中斷程序*/        
void Dogtime() interrupt 1 /*using 1*/
{
    TR0=0;
    intcount++;
    if(intcount>=6)
    {
     halfms=!halfms;
     intcount=0;
    }
    comcount++;
    if(comcount>=39)
    {
     rt=1;
     ComT=1;
     comcount=0;
    }
    

    done=1;
    TH0=0x4B;TL0=0xFF;TR0=1;/*50mS*/
}

/*串口接收中斷程序*/
void recom(void) interrupt 4 /*using 3*/
{
  if(RI)
  {
    unsigned char c;
    c=receive();
    if(!sc)
    {
      if(c=='$')
      {
        sc=1;
        cn=0;
      }
    }
    else
    {
      if(cn<=3)
      {
        s[cn]=c;
        cn++;
      }
      else
      {
        if(s[1]==',')
        {
          if(s[0]=='1') JSSS=0;
          if(s[0]=='0')  JSSS=1;
          if(s[2]=='0') BCS=0;    
          if(s[2]=='1') BCS=1;    
          if(s[3]=='0') TCS=0;
          if(s[3]=='1') TCS=1;
        }
        sc=0;
        rt=1;
        ComT=1;_nop_();_nop_();_nop_();_nop_();_nop_();
        comcount=0;
      }
      }
  }
}

/*初始化51寄存器*/
void _init51()
{
/*波特率4800--11.0592*,可以串行中斷,串行中斷優先*/
TMOD=0x21;TL1=0xFA;TH1=0xFA;PCON=0x00;TR1=1;SCON=0x50;ES=1;IP=0x10;
/*50mS--11.0592*/
EA=1;ET0=1;/*TMOD=0x01;*/TH0=0x4B;TL0=0xFF;TR0=1;
}

/* 初始化變量*/
void _initdata()
{
f[0]='$';
f[1]='0';
f[2]=',';
f[3]='0';
f[4]='0';
f[5]=0x0d;
f[6]=0x0a;
P1=0xFC;
halfms=0;
Leden=0;
Ledcp=0;
LedBC=0;
LedTC=0;
ComT=1;
JSSF=1;
JSSS=1;
}

/*主程序*/
void main(void)
{
_initdata();
_init51();
while(1)
{
     while(!done){};
     done=0;
     key();
     display();
        /*操車位置系統*/
     if(rt)
     {
        if(JSSF) f[1]='1';
        else f[1]='0';
        /*發動機系統*/
        if(BCF) f[3]='1';
        else f[3]='0';
        if(TCF) f[4]='1';
        else f[4]='0';
        for(sj=0;sj<7;sj++)
        {
         send(f[sj]);
         }
    rt=0;
    ComT=0;
  }
}
}
/*--------------------------------------
串口半雙工接收程序
錦州硬盤之家

---------------------------------------*/

#include <reg51.h>
#include <intrins.h>

unsigned char data cn,s[7],f[7],intcount,*tp,sj;
bit done,sc,JSSS,BCS,TCS,JSSF,BCF,TCF,fkon,fkoff,halfms,rt,xyjss,xybc,spjss,spbc;

sbit LedJP=P0^3;
sbit LedJSS=P0^4;
sbit LedTC=P0^5;
sbit LedBC=P0^6;
sbit SPOUT=P0^7;

sbit SY=P1^2;
sbit XY=P1^3;
sbit JSS=P1^4;
sbit BC=P1^6;
sbit TC=P1^5;
sbit JP=P1^0;

sbit ComT=P3^3;

sbit Leden=P2^0;
sbit Ledcp=P3^6;

/*顯示,報警程序*/
void display(void)
{
  if(JSSS!=JSSF)
  {
    if(halfms)
    {
      if(JSSF) {LedJSS=0;LedJP=1;}
      else {LedJSS=1;LedJP=0;}
    }
    else
    {
      LedJSS=0;
      LedJP=0;
    }
    if(JSSS) LedJP=1;
    else LedJSS=1;
    spjss=1;        
  }
  else
  {
    if(JSSS) { LedJSS=0;LedJP=1;}
    else {LedJSS=1;LedJP=0;}
    spjss=0;
    xyjss=0;
  }
  if(BCF!=BCS || TCF!=TCS)
  {
    if(halfms)
    {
      if(TCF) {LedTC=1;LedBC=0;}
      if(BCF) {LedBC=1;LedTC=0;}
    }
    else
    {
      LedTC=0;
      LedBC=0;
    }
    if(BCS) LedBC=1;
    if(TCS) LedTC=1;
    spbc=1;        
  }
  else
  {
    LedBC=0;LedTC=0;
    if(BCS) {LedBC=1;LedTC=0;}    
    if(TCS) {LedTC=1;LedBC=0;}
    spbc=0;
    xybc=0;        
  }
    if((spjss && (!xyjss)) || (spbc && (!xybc)))
  {
    SPOUT=1;
  }
  else
  {
    SPOUT=0;
  }
  if(!SY)
  {
    LedJSS=1;
    LedJP=1;
    LedTC=1;
    LedBC=1;
    SPOUT=1;    
  }
  Ledcp=1;
  _nop_();_nop_();_nop_();
  Ledcp=0;
}

/*鍵盤識別程序*/
void kexe(void)
{
if(!JSS) JSSS=0;
if(!JP) JSSS=1;
if(!BC) {BCS=1;TCS=0;}
if(!TC) {BCS=0;TCS=1;}
if(!XY) { xyjss=1;xybc=1;}    
}

/* 鍵盤抗干擾程序 */
void key(void)
{
P1=0x7D;
_nop_();_nop_();
if (P1!=0x7D)
    {
     if (fkon)
        {
         if (!fkoff)
            {
             kexe();fkoff=1;
            }
        }
     else
        fkon=1;
    }
else
    {
     fkon=0;fkoff=0;
    }
}

/*發送一個字節*/
void send(unsigned char c)
{
TI=0;
SBUF=c;
while(!TI);
TI=0;
}

/*接收一個字節*/
unsigned char receive(void)
{
/*while(!RI);*/
RI=0;
return SBUF;
}
/*時間中斷0中斷程序*/        
void Dogtime() interrupt 1 using 1
{
    TR0=0;
    intcount++;
    if(intcount>=6)
    {
     halfms=!halfms;
     intcount=0;
    }
    done=1;
    TH0=0x4B;TL0=0xFF;TR0=1;/*50mS*/
}

/*串口接收中斷程序*/
void recom(void) interrupt 4 using 3
{
if(RI)
{
unsigned char c;
c=receive();
if(!sc)
{
    if(c=='$')
    {
     sc=1;
     cn=0;
    }
}
else
{
     if(cn<=3)
     {
        f[cn]=c;
        cn++;
     }
     else
     {
        if(f[1]==',')
        {
         /*if((check(&s[0],0x08))==((uchange(s[9]))*0x10+(uchange(s[10]))))
         {*/
            if(f[0]=='1') JSSF=1;
     if(f[0]=='0')  JSSF=0;
     if(f[2]=='1') BCF=1;    
     if(f[2]=='0') BCF=0;    
     if(f[3]=='1') TCF=1;    
     if(f[3]=='0') TCF=0;
            
        }
        sc=0;
  rt=1;
  ComT=1;_nop_();_nop_();_nop_();_nop_();_nop_();
     }
}
}
}

/*初始化51寄存器*/
void _init51()
{
/*波特率4800--11.0592*,可以串行中斷,串行中斷優先*/
TMOD=0x21;TL1=0xFA;TH1=0xFA;PCON=0x00;TR1=1;SCON=0x50;ES=1;IP=0x10;
/*50mS--11.0592*/
EA=1;ET0=1;/*TMOD=0x01;*/TH0=0x4B;TL0=0xFF;TR0=1;
}

/* 初始化變量*/
void _initdata()
{
s[0]='$';
s[1]='0';
s[2]=',';
s[3]='0';
s[4]='0';
s[5]=0x0d;
s[6]=0x0a;
P1=0x7D;
halfms=0;
Leden=0;
Ledcp=0;
LedBC=0;
LedTC=0;
ComT=0;
JSSS=1;
JSSF=1;
}

/*主程序*/
void main(void)
{
_initdata();
_init51();
while(1)
{
     while(!done){};
     done=0;
     key();
     display();
        /*操車位置系統*/
     if(rt)
     {
        if(JSSS) s[1]='0';
        else s[1]='1';
        /*發動機系統*/
        if(BCS) s[3]='1';
        else s[3]='0';
        if(TCS) s[4]='1';
        else s[4]='0';
        /*發送報文*/
        for(sj=0;sj<7;sj++)
        {
         send(s[sj]);
         }
    rt=0;
    ComT=0;
  }
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章