现在工程中大多使用485半双工通讯,今天有人问这样的程序,我翻找了一下以前写的程序,正好找到一个.这个程序控制灯的亮与闪烁,比较简单,通讯方面在发送端可以两种方式发送,接受端只是被动发送.具体工作方式看程序吧!
/*--------------------------------------
串口半双工发送程序
锦州硬盘之家
---------------------------------------*/
#include #include 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 #include 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;
推荐阅读最新更新时间:2024-11-13 13:59
设计资源 培训 开发板 精华推荐
- 具有可编程控制功能的 LTC3623EUDD LED 驱动器的典型应用电路
- LT1171IT、5V/2.5A 正向转换器的典型应用
- 【毕设】STM32F103C8T6核心板
- ADP1046 12V/8A 全桥转换器,输入电压为 36 至 60VDC
- 使用 Semtech 的 SC1633 的参考设计
- 具有迟滞功能的 LMV324DTBR2G 比较器的典型应用电路
- LT8570EMS8E 700kHz、-15V 输出反相转换器的典型应用接受 5V 至 35V 输入
- PCA9635 16位LED驱动器典型应用电路
- 简易FM调频广播发射器
- LT8609AEMSE 3.3V/2A 降压型稳压器的典型应用电路