現在工程中大多使用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,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;
}
}
}
串口半雙工接收程序
錦州硬盤之家
---------------------------------------*/
#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;
}
}
}