双机串口通信
来源:互联网 发布:linux 进程网络流量 编辑:程序博客网 时间:2024/05/22 01:37
内容描述:
有A.B两个机,以方式一进行串口通信,其中A机发送信息,B机接收信息。双方的晶振频率为11.0592MHZ,通信波特率为9600。通信协议:通信开始时,A机首先发送一个启动信号AA,B机接收到后发送一个应答信号BB表示同意接收。
附仿真电路图:
C语言:
#include <reg52.h>#define uchar unsigned charvoid time(unsigned int _time); //延时函数void InitArray(); //初始化数组void SendData(); //发送数据void Receive(); //接收数据sbit P10=P1^0;sbit P17=P1^7;uchar databuff[32] _at_ 0x30;uchar bufR[32] _at_ 0x50;void InitArray(){ uchar i; for(i=0;i<32;i++) databuff[i]=i;}void init(){ SCON=0X50; //串口工作在方式1 PCON=0; //波特率不加倍 TMOD=0X20; TH1=0XFd; TL1=0XFd; TCON=0X40;}void SendData(){ uchar jiaoyan; //校验和 uchar i; leap: P2=0XAA; //显示AA,表示就绪,等待它机 SBUF=0XAA; while(TI==0); TI=0; while(RI==0); RI=0; if(SBUF!=0xbb) goto leap; P2=0XBB; time(20); leap1:jiaoyan=0; //发送数据 for(i=0;i<32;i++) { P2=databuff[i]; time(200); SBUF=databuff[i]; jiaoyan+=databuff[i]; while(TI==0); TI=0; } if(P17) { P2=jiaoyan; time(200); SBUF=jiaoyan; } else { jiaoyan++; P2=jiaoyan; time(200); SBUF=jiaoyan; } while(TI==0); TI=0; while(RI==0); RI=0; P2=SBUF; time(200); //校验是否正确 if(SBUF==0) goto leap1;}void Receive(){ uchar i,pf; do{ //等待接收数据 while(RI==0);RI=0; P2=SBUF; time(200); }while((SBUF^0XAA)!=0); P2=0XBB; time(200); SBUF=0XBB; while(TI==0);TI=0; while(1) { pf=0; for(i=0;i<32;i++) { //接收所有传递过来的数据 while(RI==0); RI=0; bufR[i]=SBUF; P2=bufR[i]; time(200); pf+=bufR[i]; } P2=SBUF; //判断接收数据是否等于校验和 if((SBUF^pf)==0) { P2=0; time(200); SBUF=0X00; while(TI==0);TI=0; } else { P2=0XFF; time(200); SBUF=0XFF; while(TI==0);TI=0; }} }void main(){ uchar count=0; time(1); init(); InitArray(); if(P10) { SendData(); //传送端 } else { Recive(); //接收端 } while(1);}void time(unsigned int _time){ uchar ucCounter,i; for(ucCounter=0;ucCounter<110;ucCounter++) for(i=0;i<_time;i++);}
汇编:
ORG 0000HBUFS EQU 30HBUFR EQU 50HNUMB EQU 10HSUMS EQU 7EHSUMR EQU 7FHMAIN: LCALL InitArray LCALL DELAY LCALL InitUart MAIN2: JB P1.0,SEND LCALL RECEIVE HERE: SJMP HERESEND: LCALL SEND1HERE1: SJMP HERE1InitArray: MOV R2,#NUMB MOV R0,#BUFS MOV A,#00HLOOP: MOV @R0,A INC R0 INC A DJNZ R2,LOOP RET InitUart: MOV SCON,#50H MOV TMOD,#20H; MOV PCON,#00H; MOV TH1,#0FDH MOV TCON,#40H; RETSEND1: MOV P2,#0AAH MOV SBUF,#0AAH LOOP1: JNB TI,LOOP1 CLR TILOOP2: JNB RI,LOOP2 CLR RI MOV A,SBUF CJNE A,#0BBH,LOOP2 MOV P2,#0BBH LCALL DELAYSEND2: MOV SUMS,#00H MOV R0,#BUFS MOV R2,#NUMBLOOP3: MOV A,@R0 MOV P2,A LCALL DELAY MOV SBUF,ALOOP4: JNB TI,LOOP4 CLR TI ADD A,SUMS MOV SUMS,A INC R0 DJNZ R2,LOOP3LOOP5: JB P1.7,LOOP6 ADD A,#01H MOV SUMS,ALOOP6: MOV P2,A LCALL DELAY MOV SBUF,ALOOP7: JNB TI,LOOP7 CLR TI LOOP8: JNB RI,LOOP8 CLR RI MOV P2,SBUF LCALL DELAY MOV A,SBUF CJNE A,#00H,LOOP9ENDS: RETLOOP9: LJMP SEND2RECEIVE: JNB RI,RECEIVE CLR RI MOV P2,SBUF LCALL DELAY MOV A,SBUF CJNE A,#0AAH,RECEIVE MOV P2,#0BBH LCALL DELAY MOV SBUF,#0BBH LOOP11: JNB TI,LOOP11 CLR TILOOP12: MOV SUMR,#00H MOV R1,#BUFR MOV R3,#NUMBLOOP13: JNB RI,LOOP13 CLR RI MOV P2,SBUF LCALL DELAY MOV A,SBUF MOV @R1,A ADD A,SUMR MOV SUMR,A INC R1 DJNZ R3,LOOP13 MOV P2,SUMRLOOP14: JNB RI,LOOP14 CLR RI MOV P2,SBUF LCALL DELAY MOV A,SBUF CJNE A,SUMR,LOOP16 MOV P2,#00H LCALL DELAY MOV SBUF,#00HLOOP15: JNB TI,LOOP15 CLR TI RET LOOP16: MOV P2,#0FFH LCALL DELAY MOV SBUF,#0FFHLOOP17: JNB TI,LOOP17 CLR TI LJMP LOOP12DELAY: MOV R7,#04H DL: MOV R5,#0FFH DL1: MOV R5,#0FFH DL5: DJNZ R5,DL5 DJNZ R6,DL1 DJNZ R7,DL RET END
效果图:
阅读全文
0 0
- Arduino 双机串口通信
- 双机串口通信
- VirtualBox中双机之间的串口通信
- STM32串口实现485双机通信原理
- 高效FIFO串口双机通信在ARM7上的实现
- 高效FIFO串口双机通信在ARM7上的实现 .
- 高效FIFO串口双机通信在ARM7上的实现
- STM32 基于串口RS485双机通信原理浅析
- STM32 基于串口RS485双机通信原理浅析
- 双机通信
- 高效FIFO串口双机通信在ARM7上的实…
- stm32f407 spi 双机通信
- 单片的双机通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- AngularJS 2 中如何实现ng-bind-html
- openlayers坐标转换
- java类
- AdvancedInstaller打包工具使用(六)
- 字符串处理工具类
- 双机串口通信
- Response下載文件亂碼問題處理
- 定时及延时命令操作
- matlab常用函数总结
- 关于构造快执行顺序
- calc()的应用
- H
- 关于ftp用户的授权
- jsp常用动作列表