汇编语言实现双机通信
单片机双机通讯(汇编)
甲机程序RS BIT P3.5 ;RS为寄存器选择RW BIT P3.4 ;RW为读写信号线E BIT P3.3 ;E端为使能端ORG 0HAJMP MAINORG 30HMAIN:ACALL INIT_SCREENACALL INITIME; ACALL READTABACALL READ; ACALL SENDSJMP $READ: MOV A,#00HMOV R7,#15RED:MOV SBUF,APUSH ACJNE A,#10,NEXT NEXT:JB CY,NEXT1ADD A,#7NEXT1: ADD A,#30H; ORL A,#30HACALL WR_DATAPOP AJNB TI,$CLR TIINC ADJNZ R7,REDJMP READREADTAB:PUSH AMOV R7,#16MOV R0,#60HMOV R6,#0MOV DPTR,#TAB RREAD: MOV A,R6MOVC A,@A+DPTRMOV @R0,AINC R6INC R0DJNZ R7,RREADPOP ARETINITIME:MOV TMOD,#20H ;T1初始化MOV TH1,#0FAHMOV TL1,#0FAHSETB TR1MOV SCON,#0C0H ;串行口初始化MOV PCON,#0H ;SMOD=0RETSEND:MOV R0,#60HMOV R7,#15TRS: MOV A,@R0MOV C,PMOV TB8,CMOV SBUF,AACALL WR_DATAWAIT: JNB TI,$CLR TIINC R0DJNZ R7,TRSRET;*********************************************************************** ; 初始化屏幕子程序;*********************************************************************** INIT_SCREEN:MOV P0,#01H ;清屏并光标复位LCALL WR_CODE ;调用写入命令子程序MOV P0,#02H ;光标返回LCALL WR_CODE ;调用写入命令子程序MOV P0,#038H ;5x7的点阵字符LCALL WR_CODE ;调用写入命令子程序MOV P0,#06H; ;输入方式,光标随字符右移LCALL WR_CODE ;调用写入命令子程序MOV P0,#0FH ;开显示,光标闪烁LCALL WR_CODE ;调用写入命令子程序RET;;*********************************************************************** ; 写数据子程序;*********************************************************************** WR_DATA:MOV P0,ASETB RS ;RS=1CLR RW ;RW=0 ;准备写入数据CLR E ;E=0 ;执行显示命令LCALL BUSY ;判断液晶模块是否忙?SETB E ;E=1 ;显示完成,程序停车RET;*********************************************************************** ; 写命令子程序;*********************************************************************** WR_CODE:CLR RS ;写入控制命令的子程序CLR RWCLR ELCALL BUSYSETB ERET;*********************************************************************** ; 判断忙碌子程序;*********************************************************************** BUSY:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,BUSY ;如果P1.7为高电平表示忙就循环等待RETTAB:DB "0123456789ABCDEF"END乙机程序RS BIT P3.5 ;RS为寄存器选择RW BIT P3.4 ;RW为读写信号线E BIT P3.3 ;E端为使能端ORG 0HAJMP MAINORG 30HMAIN:ACALL INIT_SCREENACALL INITIME; ACALL RPTACALL MYSJMP $INITIME:MOV TMOD,#20H ;T1初始化MOV TH1,#0FAHMOV TL1,#0FAHSETB TR1MOV SCON,#0C0H ;串行口初始化MOV PCON,#00H ;SMOD=0RETRPT: MOV R0,#60HMOV R7,#15SETB RENWAIT: JNB RI,$CLR RIMOV A,SBUFMOV P1,AACALL WR_DATA; JNB PSW.0,PZ; JNB RB8,ERR; SJMP YES;PZ: JB RB8,ERR;YES: MOV @R0,A; INC R0; DJNZ R7,W AIT; CLR PSW.5; RET;ERR:; SETB PSW.5RETMY: MOV R7,#15MY1: SETB RENJNB RI,$CLR RIMOV A,SBUFMOV P1,APUSH ACJNE A,#10,NEXTNEXT:JB CY,NEXT1ADD A,#7NEXT1: ADD A,#30H; ORL A,#30HACALL WR_DATAPOP AJMP MY1RET;*********************************************************************** ; 初始化屏幕子程序;*********************************************************************** INIT_SCREEN:MOV P0,#01H ;清屏并光标复位LCALL WR_CODE ;调用写入命令子程序MOV P0,#02H ;光标返回LCALL WR_CODE ;调用写入命令子程序MOV P0,#038H ;5x7的点阵字符LCALL WR_CODE ;调用写入命令子程序MOV P0,#06H; ;输入方式,光标随字符右移LCALL WR_CODE ;调用写入命令子程序MOV P0,#0FH ;开显示,光标闪烁LCALL WR_CODE ;调用写入命令子程序RET;;*********************************************************************** ; 写数据子程序;*********************************************************************** WR_DATA:MOV P0,ASETB RS ;RS=1CLR RW ;RW=0 ;准备写入数据CLR E ;E=0 ;执行显示命令LCALL BUSY ;判断液晶模块是否忙?SETB E ;E=1 ;显示完成,程序停车RET;*********************************************************************** ; 写命令子程序;*********************************************************************** WR_CODE:CLR RS ;写入控制命令的子程序CLR RWCLR ELCALL BUSYSETB ERET;*********************************************************************** ; 判断忙碌子程序;*********************************************************************** BUSY:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,BUSY ;如果P1.7为高电平表示忙就循环等待RETEND电路图。
双机异步串行通信例子8251
• • • • • • • • • • • • • • • • • • • • • •
mov al,27h ;向8251送控制字允许其发送和接收 out dx,al lds dx,mes2 ;显示提示信息 mov ah,09 int 21h waiti: mov dx,io8251b in al,dx test al,01 ;发送是否准备好 jz waiti mov ah,01 ;是,从键盘上读一字符 int 21h cmp al,27 ;若为ESC,结束 jz exit mov dx,io8251a out dx,al ;发送 mov cx,40h s51: loop s51 ;延时 jmp waiti exit: mov ah,4ch ;退出 int 21h code ends end start
2.接收程序 • • • • • • • • • • • • • • • • • • • • • code segment assume cs:code,ds:data start: mov dx,io8251b ;初始化8251 mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 out dx,al mov al,27h ;向8251送控制字允许其发送和接收 out dx,al next: mov dx,io8251b in al,dx test al,02 ;检查接收是否准备好 jz next ;没有,等待 mov dx,io8251a in al,dx ;准备好,接收 mov dl,al mov ah,02 ;将接收到的字符显示在屏幕上 int 21h jmp next exit: mov ah,4ch ;退出 int 21h code ends end start双ຫໍສະໝຸດ 异步串行通信例子1.发送程序
双机通信汇编程序
双机通信汇编程序:ORG 0000H ;分析= A - 程序框架LJMP STARTORG 0023HLJMP UARTInterruptSTART:MOV SP,#60HLCALL InitUARTD1: MOV R3,#00HMOV A, 44H ;MOV A,43H ;数值分解1===MOV B,#0AHDIV ABMOV 31H,AMOV 30H,BCALL DISPLAY ;显示程序42H中的数-分解个位+十位MOV P0,#0FH ;判断有无按键按下MOV A,P0CJNE A,#0FH,D5 ;有按键按下JMP D1D5: MOV 40H,A ;有按键按下将值放入40H中MOV P0,#0F0H ;再次判断另一个值MOV A,P0MOV 41H,A ;将另一个值放入41H中D6: MOV P0, 0F0H ;消抖- 按键放开没有?CALL DISPLAY ;休息一下MOV A, P0 ;放开没有?CJNE A, 41H, D7 ;消抖- 按键已放开CALL DISPLAYJMP D6 ;消抖- 按键还没放开,再等待!D7: MOV A,41HADD A,40HMOV 42H,A ;将结果放入42H中D8: MOV A,R3MOV DPTR,#TABMOVC A,@A+DPTRCJNE A,42H,D9INC R3MOV 43H,R3MOV A,43H ;将43H中的数值发送出去! 2== ACALL SendOneByte ;发送=OKJMP D1D9: CJNE R3,#16,D10JMP D1D10:INC R3JMP D8InitUART:MOV TMOD,#20H ;启用定时器T1,方式2MOV SCON,#50H ;串口采用方式1,且允许接收:REN=1MOV TH1,#17H ;波特率=134b/s 误差最小=0.09%MOV TL1,TH1 ;因定时器T1为方式2:8位自动重装,TH1为备用值MOV PCON,#00H ;倍增位SMOD=0SETB EA ;开总中断IESETB ES ;开串口IESETB TR1 ;定时器T1 IERETUARTInterrupt:JB RI,IsUART_ReceiveCLR TIRETIIsUART_Receive:CLR RIPUSH ACCMOV A,SBUFMOV 44H,APOP ACCRETISendOneByte:CLR ESCLR TIMOV SBUF,AWaitSendFinish:JNB TI,WaitSendFinishCLR TISETB ESRETDisplay:MOV A,31H ;显示十位数=31HADD A,#10H ;加上位选MOV P1,AACALL DELAYMOV A,30H ;显示个位数=30HMOV P1,AACALL DELAYRETdelay:mov r7,#01hdl1:mov r6,#26hdl0:mov r5,#82hdjnz r5,$djnz r6,dl0djnz r7,dl1retdelay1:mov r6,#26hdl3:mov r5,#82hdjnz r5,$djnz r6,dl3retTAB:DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH DB 0EBH,0DBH,0BBH,07BH,0E7H,0D7H,0B7H,77HEND。
双机间的串口双向通信.
单片机原理与应用课程设计任务书单片机原理与应用学年设计说明书学院名称:计算机与信息工程学院班级名称:学生姓名:学号:2012211369 题目:双机间的串口双向通信指导教师姓名:起止日期:2014.12.29至2015.1.4一、绪论随着电子技术的飞速发展,单片机也步如一个新的时代,越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路。
对于一些场合,比如:复杂的后台运算及通信与高实时性前台控制系统、软件资源消耗大的系统、功能强大的低消耗系统、加密系统等等。
如果合理使用多种不同类型的单片机组合设计,可以得到极高灵活性与性能价格比,因此,多种异型单片机系统设计渐渐成为一种新的思路,单片机技术作为计算机技术的一个重要分支,由于单片机体积小,系统运行可靠,数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
但在一些相对复杂的单片机应用系统中,仅仅一个单片机资源是不够的,往往需要两个或多个单片机系统协同工作。
这就对单片机通信提出了更高要求。
单片机之间的通信可以分为两大类:并行通信和串行通信。
串行通信传输线少,长距离传输时成本低,且可以利用数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
所以本系统采用串行通信来实现单片机之间可靠的,有效的数据交换。
二、相关知识2.1 双机通信介绍两台机器的通信方式可分为单工通信、半双工通信、双工通信,他们的通信原理及通信方式为:单工通信:是指消息只能单方向传输的工作方式。
单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。
通信双方采用单工通信属于点到点的通信。
根据收发频率的异同,单工通信可分为同频通信和异频通信。
半双工通信:这种通信方式可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。
也就是说,通信信道的每一段都可以是发送端,也可以是接端。
甲乙两机串口通信双向控制系统软件设计与系统仿真课案
case 0: transfer('D');
led1=1; led2=1;
break;
case 1: transfer('A');
led1=0; led2=1;
break;
case 2: transfer('B');
led1=1; led2=0;
break;
case 3: transfer('C');
1.
题目设计要求:
甲乙两机串口双向通信设计
要求:利用51单片机,RS232芯片,LED灯,数码管进行双机通信设计。甲机可按键控制乙机的LED显示;乙机可按键控制甲机的数码管显示。完成以下设计环节:
1)使用Altium Desinger开发工具,设计电路原理图。
2)使用Uvision2开发平台,采用C语言或汇编语言设计软件程序。
TMOD=0x20;//定时器T1工作在方式2
PCON=0x00;
TH1=(256-253)/32;
TL1=(256-253)%32;
RI=0;
TI=0;
TR1=1;
IE=0x90;//串行口中断打开
while(1)
{
if(key==0)
{
while(key==0);
num=(num+1)%4;
}
switch(num)
图2.1总体框图
双机通信系统通过甲乙单片机的串行口来实现数据的收发。
甲单片机通过开关电路来启动发送程序,甲机当开关按下时向乙机发送一个数据,乙机上蜂咛器发出声音提示有数据发送过来,乙机通过接收中断来接收和开关判断是否接收甲机发送过来的数据,并通过编写好的数据代码在8个发光二极管上显示主机发送过来的数据。
双机通讯汇编程序(带流程图)
双机通讯实验要求:甲乙双机通讯。
通讯协议由甲乙双方自由制定,协议中要具有简单的数据校验功能。
要求每台仪器都具有发送和接收的功能。
实验原理:采用两根线进行连接,先由A机发送,发送后调用延时,延时结束后改由B 机发送。
实验硬件图:实验流程图:实验程序:ORG 0000HAJMP MAINORG 0020H MAIN: MOV 40H,#0F0HMOV 41H,#0FHMOV 42H,#00HMOV 43H,#0FFHMOV 44H,#0F0HMOV 45H,#0FHMOV 46H,#00HMOV 47H,#0FFHMOV SP,#60HLCALL REVBLCALL XSLCALL SENDASJMP $ORG 3000H SENDA:MOV TMOD,#20H MOV TH1,#0E8HMOV TL1,#0E8HMOV PCON,#00HSETB TR1MOV SCON,#50H T1A: MOV SBUF,#0AAH S1A: JBC TI,R1ASJMP S1AR1A: JBC RI,R2ASJMP R1AR2A: MOV A,SBUFXRL A,#55HJNZ T1AT2A: MOV SBUF,#8JNB TI,$CLR TIMOV R0,#40HMOV R7,#8MOV R6,#00HT3A: MOV SBUF,@R0MOV A,R6ADD A,@R0MOV R6,AINC R0S2A: JBC TI,T4ASJMP S2AT4A: DJNZ R7,T3AMOV SBUF,R6S4A: JBC TI,R3ASJMP S4AR3A: JBC RI,R4ASJMP R3AR4A: MOV A,SBUFJNZ T2ARETREVB: MOV TMOD,#20H MOV TH1,#0E8HMOV TL1,#0E8HMOV PCON,#00HSETB TR1MOV SCON,#50H R1B: JBC RI,R2BSJMP R1BR2B: MOV A,SBUFXRL A,#0AAHJZ T1BMOV SBUF,#0AAHSJMP R1BT1B: MOV SBUF,#55HS1B: JBC TI,R3BSJMP S1BR3B: JNB RI,$CLR RIMOV A,SBUFMOV R7,AMOV R0,#50HMOV R6,#00HR4B: JBC RI,R5BSJMP R4BR5B: MOV A,SBUFMOV @R0,AINC R0ADD A,R6MOV R6,ADJNZ R7,R4BR6B: JBC RI,R7BSJMP R6BR7B: MOV A,SBUFXRL A,R6JZ ENDBMOV SBUF,#0FFH S3B: JBC TI,R3BSJMP S3BENDB: MOV SBUF,#00H ENDB1:JBC TI,STOPSJMP ENDB1 STOP: RETXS: MOV R3,#08HMOV R1,#50H XS1: MOV P1,@R1LCALL DLAYNOPINC R1DJNZ R3,XS1RETDLAY: MOV R4,#20 XH: MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HSETB TR0YS: JBC TF0,LPSJMP YSLP: DJNZ R4,XHRETEND。
单片机双击串行通信MS51汇编代码
石家庄铁道大学四方学院集中实践报告书课题名称 双机串行通信设计姓 名 邢志杰学 号 系、 部 电气工程系 专业班级 方1210-4 指导教师马丽2015年 7 月 3 日※※※※※※※※※ ※※※※※※※※※※※※※※※2012级单片机接口课程设计目录第1章设计目的·······················错误!未定义书签。
第2章设计要求·······················错误!未定义书签。
第3章硬件电路设计·····················错误!未定义书签。
系统框图 (1)STC89C52单片机最小系统 (2)按键电路 (3)主电路设计.......................错误!未定义书签。
第4章软件程序设计.. (4)主程序流程图 (4)键盘扫描子程序流程图 (5)从机主程序流程图 (6)从机中断子程序流程图 (7)程序调试 (8)双机串行通信源程序 (9)第5章结论 (13)参考文献 (13)第1章设计目的设计目的(1)掌握单片机实际系统的开发步骤。
(2)了解串行通信的原理;了解数码管显示的工作原理;了解键盘扫描的工作原理;对双机串行通信软件编程、调试、相关硬件设备的使用技能等方面得到真正的实践机会,把软硬件结合,克服其中的种种问题,提高编程能力。
UDP协议实现慢启动和拥塞控制的双机双向通信网络编程
15 (必做题)用C语言编写一对在互联网中发送和接收数据帧的应用,采用Socket 的UDP协议端口,并用自己的代码实现TCP协议的慢启动、拥塞避免,并实时显示平均发送窗口的大小。
必须提供软件设计方案和流程图,软件代码的每一行都必须加注中文注释说明设计意图,不得抄袭。
解答:本次程序设计依然使用服务器/客户机模式,发送方占据主动,所以先分析发送方的程序设计,首先主程序使用的是socket的UDP接口协议,其实我觉得对于使用者来说用何种协议接口都无所谓,只不过我是接触这中间具体细节编程,才计较一下。
之前写过UDP的简单的双机通信,但是那个程序只能实现单向的发送和接受,本题中发送方不但要发送,还要接受反馈信息,而接收方不但要接收数据,还要发送回馈信息确认一下,所以是双向的收发,我在之前的程序基础上首先将之改成为可以双向收发,这费了我不少事,不过这下子对sendto和recvfrom熟悉多了,这个做好后在来实现慢启动和拥塞控制就容易多了其实模拟堵塞是很困难的,因为本机与自己通信速率是很快的,既然老师说模拟一下这中间的过程,那我就尽量简化了一下,本程序假设的条件如下【1】窗口从1开始,以以2为底数的指数上涨【2】假设当窗口达到16的时候,过了计时时间没收到回复,因此必须进行拥塞控制【3】实行快速恢复的方法,窗口为指数上涨最后一个的一半,本程序里面也就是8【4】第一次拥塞控制后窗口线性增长,本程序简化为逐次加1【5】假设窗口为10找到均衡窗口大小,一直维持此窗口(实际情况肯定要比这个复杂,这里要都考虑到这程序会很复杂的)【6】这里再假设窗口大小是双方约定好了的,就是说不用接收方通知下次接受的窗口大小,滑动窗口啥的去死吧,返回确认的信息唯一的作用就是告知发送方数据报已经正确接受,可以发送下一个以上为假设的简化条件,(由于是面向非连接的UDP协议,所以发送端上来就会发送数据,不会管你收不收的,因此得先运行接收端的程序,但是发送端是主动方,所以先写它)下面是发送端的程序设计流程【1】首先窗口大小为1,向对方发送一个数据报【2】收到回复,窗口指数增加,继续发送【3】假设条件是窗口为16时候出现报文丢失,因此窗口减半,此部分报文重发【4】进入拥塞控制后,新的窗口为8,然后窗口线性加1,假设增大到10结束写的比较简单了,通信的细节之前报告里都做过了,所以这次也就不纠结这些了,下面是完整程序和注释发送端程序t.c#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<netdb.h>#include<sys/socket.h>#include<sys/wait.h>#define MYPORT 4950 头文件int main(int argc,char *argv[]) 主函数{char fei[100]; 定义它是为了存放要发送的数据int i=0;for(i=0;i<=100;i++){fei[i]=argv[2][i];} 其实用argv[2]也行,看着不舒服,就都复制到我自己这个数组里了,不然后面看着更乱一些声明和定义,这是之前的内容了int sockfd;struct hostent *he;struct sockaddr_in their_addr;int numbytes;if(argc != 3) 函数参数检验{fprintf(stderr,"usage:client hostname message\n");exit(1);}if((he=gethostbyname(argv[1]))==NULL) ip地址合理性检验{herror("gethostbyname");exit(1);}获得socket接口if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket");exit(1);}初始化此接口their_addr.sin_family=AF_INET;their_addr.sin_port=htons(MYPORT);their_addr.sin_addr=*((struct in_addr *)he->h_addr);bzero(&(their_addr.sin_zero), 8);int j;char send[100]={'\0'}; fei[]数组存放的是所有的数据,而定义这个send[]是装每一次发送的数据,我得把它都给赋初值,不然后面调试的时候老是胡乱出一些数据,这样子当我给send重新赋值的时候最后一个自动是结束符,而剩下的也都是结束符,不用担心有乱值i=0; 刚才有个循环用到了i,所以这里得再次置0,一开始忘记了这一步,费了我好大的事才搞明白,粗心啊下面这部分的循环实现的是慢启动,只要不发生拥塞(也就是假设条件窗口大于16),就会一直循环下去,如果拥塞,则跳出,下面有拥塞控制do{if (i==0){send[0]=fei[0];} 如果是第一次发送,就只发送第一个数据else{for(j=0;j<=i;j++) 如果不是第一次发送,就发送从fei[i]开始到fei[i+i]的i+1个数据,而i+1恰好就是此次发送的窗口大小,所以后面实时显示的就是它{send[j]=fei[j+i];}}发送数据,调用sendtonumbytes=sendto(sockfd,send,strlen(send),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));发送完了数据,下面就要等着对方确认接收的信号了,因此这里调用recvfrom 接收到的确认信息交给buf[]来显示,就是后面将会看到的ok,message received! int num,addr_len;char buf[100];addr_len=sizeof(struct sockaddr);if((num=recvfrom(sockfd,buf,100,0,(struct sockaddr *)&their_addr,&addr_len))==-1) {perror("recvfrom");exit(1);}buf[20]='\0'; 这里也是我知道返回确认信息就20个,其实就是num,字符串最后一个要加停止符的printf("%s\n",buf); 输出确认收到提示printf("the length of windows is %d\n",i+1); 输出实时窗口大小i=2*i+1; 实现指数增长的慢启动控制,我一开始还很傻逼的用2^i这个表达式,哈哈,还在那傻傻的调了好久,这式子根本不好使,后来想用pow()函数,家了头文件math.h也不给用,没办法才这样子写sleep(1);模拟咱就形象点,给个一秒延时,代表一次传输用时,然后一次收发结束printf("\n"); 为了调试时便于区分各次发送结果,加个换行}while(i<=8); 注意这个限制条件好了,上面是慢启动部分,如果程序走到这里,说明已经发生拥塞了,下面将是拥塞控制和快速恢复部分虽然下面有些参数跟上面名字一样,但是没事的,i=(i-1)/2; 窗口变成原来的一半int s=0; 这个s用来标记下次轮到发送fei[]里面第几个数据了循环来了,其实这个跟上面差不多do{for(j=0;j<=i;j++){send[j]=fei[j+s+16]; 给每次要发送的send[]填充数据,这地方看起来就一步,其实大多数时间我都在调这一步,程序整体是可以运行的,就是发送或是接受的数据跟预期的不一样,调一些小细节费我不少时间}开始发送numbytes=sendto(sockfd,send,strlen(send),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));int num,addr_len;char buf[100];addr_len=sizeof(struct sockaddr);同样的,发完了,等着确认回复的信号if((num=recvfrom(sockfd,buf,100,0,(struct sockaddr *)&their_addr,&addr_len))==-1) {perror("recvfrom");exit(1);}接收到回复后把确认信号显示出来buf[20]='\0';printf("%s\n",buf);printf("the length of windows is %d\n",i+1); 这里实时输出窗口大小s=s+i+1; 每次发送一个窗口大小的数据,下一次的起始发送点就是所有之前窗口累加后的那个i=i+1; 别小看这一句啊,这可是窗口线性加1 啊sleep(1);printf("\n");}while(i<=9);跳出来后就认为结束了,我就设计成窗口从8加大到10,我觉得这样子已经达到模拟的目的了,所以下面关掉端口,结束close(sockfd);return 0;}上面是发送端的,继续接收端接收端作为被动接受,可以不关心过来的窗口有多大,来多少接受多少就好,所以相对而言简单一些,设计流程【1】打开一个端口接收【2】接收到信号后要立即发送一个确认的信息【3】然后继续等待接受【4】接收完毕,关闭端口这里接收端不需要反馈给发送端信用窗口大小,因此比较简单,实现了双向的收发应该就差不多了,程序和详细注释如下给出接收端完整l.c#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#define MYPORT 4950#define maxbuflen 100头文件main() 主函数{int sockfd; 定义和声明struct sockaddr_in my_addr;struct sockaddr_in their_addr;int addr_len,numbytes;char buf[maxbuflen];if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) 打开一个socket端口,获得文件描述符{perror("socket");exit(1);}初始化端口my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bzero(&(my_addr.sin_zero),8);绑定if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){perror("bind");exit(1);}int i,num;addr_len=sizeof(struct sockaddr);这里其实就是有点偷懒了,我是知道了发送方慢启动阶段的发送次数的,一共四次,窗口依次为1 2 4 8 ,也知道了拥塞控制的发送次数,共3次,窗口依次为8 9 10,下面的,7次循环就是用来接收这7次发送过来的数据报的for(i=0;i<7;i++){接收数据if((num=recvfrom(sockfd,buf,maxbuflen,0,(struct sockaddr *)&their_addr,&addr_len))==-1) {perror("recvfrom");exit(1);}printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr)); 输出连接信息buf[num]='\0';printf("packet contains %s\n",buf); 输出接收到的数据立即发送确认收到信号numbytes=sendto(sockfd,"ok,message received!",20,0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("\n");}接收完毕关闭端口close(sockfd);}其实上周就在思考这个编程题了,只是还不确定到底做成什么样子,特别是我不知道怎么才能把计算机弄堵塞了,后来课堂上问了一下才知道原来就是模拟一下,这样子就简单多了,明天得补课,也不是我找借口,不然我觉得我还能把这程序给调的更好,比如说实现多次拥塞,怎么控制好了,本程序链接编译,调试成功,输出如下先是运行接收端,键入./l然后运行发送端,键入fei@ubuntu:~$ ./t abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg怕不够用的,所以多敲了些,下面是运行的结果前面虽然是完整程序,但是被我加注释了,这里把完整源码也贴上吧发送端t.c#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<netdb.h>#include<sys/socket.h>#include<sys/wait.h>#define MYPORT 4950int main(int argc,char *argv[]){char fei[100];int i=0;for(i=0;i<=100;i++){fei[i]=argv[2][i];}int sockfd;struct hostent *he;struct sockaddr_in their_addr;int numbytes;if(argc != 3){fprintf(stderr,"usage:client hostname message\n");exit(1);}if((he=gethostbyname(argv[1]))==NULL){herror("gethostbyname");exit(1);}if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket");exit(1);}their_addr.sin_family=AF_INET;their_addr.sin_port=htons(MYPORT);their_addr.sin_addr=*((struct in_addr *)he->h_addr);bzero(&(their_addr.sin_zero), 8);int j;char send[100]={'\0'};i=0;int k;do{if (i==0){send[0]=fei[0];}else{for(j=0;j<=i;j++){send[j]=fei[j+i];}}numbytes=sendto(sockfd,send,strlen(send),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));int num,addr_len;char buf[100];addr_len=sizeof(struct sockaddr);if((num=recvfrom(sockfd,buf,100,0,(struct sockaddr *)&their_addr,&addr_len))==-1){perror("recvfrom");exit(1);}buf[20]='\0';printf("%s\n",buf);printf("the length of windows is %d\n",i+1);i=2*i+1;sleep(1);printf("\n");}while(i<=8);i=(i-1)/2;int s=0;do{for(j=0;j<=i;j++){send[j]=fei[j+s+16];}numbytes=sendto(sockfd,send,strlen(send),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));int num,addr_len;char buf[100];addr_len=sizeof(struct sockaddr);if((num=recvfrom(sockfd,buf,100,0,(struct sockaddr *)&their_addr,&addr_len))==-1) {perror("recvfrom");exit(1);}buf[20]='\0';printf("%s\n",buf);printf("the length of windows is %d\n",i+1);s=s+i+1;i=i+1;sleep(1);printf("\n");}while(i<=9);close(sockfd);return 0;}接收端l.c完整源码#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#define MYPORT 4950#define maxbuflen 100main(){int sockfd;struct sockaddr_in my_addr;struct sockaddr_in their_addr;int addr_len,numbytes;char buf[maxbuflen];if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket");exit(1);}my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT);my_addr.sin_addr.s_addr=INADDR_ANY;bzero(&(my_addr.sin_zero),8);if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){perror("bind");exit(1);}int i,num;addr_len=sizeof(struct sockaddr);for(i=0;i<7;i++){if((num=recvfrom(sockfd,buf,maxbuflen,0,(struct sockaddr *)&their_addr,&addr_len))==-1) {perror("recvfrom");exit(1);}printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));buf[num]='\0';printf("packet contains %s\n",buf);文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.numbytes=sendto(sockfd,"ok,message received!",20,0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));printf("\n");}close(sockfd);}11。
单片机双机通信(C51程序)
单片机双机通信(C51程序)/*发送程序连线:两个单片机用3 根线连起来,要共地,rxd,txd 要交叉连接程序效果:通过主机发送,从机接收在主机中通过记下按键按下的次数,主机中显示最后按下的六个数值,并发送给从机,从机也显示这六个数值*/#includereg52.h //头文件#includeintrins.h //循环移位文件#define uchar unsigned char//宏定义#define uint unsigned intsbit key1=P3 ; //位声明uchar code table[] ={0X00,0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar table_tr[6];//暂存最后按下的六个数值uchar count,cnt;//延时子函数,用于数码管显示void delay(uchar i){ uchar x,y; for(x=i;x0;x--) for(y=110;y0;y--);}//初始化子函数void init(){ TMOD=0x20;//T1 工作在方式2 TH1=0XF4;//波特率为4.8kbit/s TL1=0XF4; TR1=1;//启动定时器1 SCON=0X50;//串口工作在方式1,允许接收}//显示子函数void display(){ uchar i,j;//定义局部变量j=0x7f; //赋初值for(i=0;i6;i++) { P2=j; //点亮最右边的数码管P0=table[table_tr[i]]; //显示该数值delay(10); //延时,便于眼睛看清j=_cror_(j,1);//循环右移一位}}//按键扫描子函数void key_scan(){ if(key1==0) //判断是否有按键按下{ while(!key1) //等待按键松手{ display();//防止掉显} cnt++; //加1,用于显示SBUF=cnt;//送给缓冲区,发送while(!TI); //等待发送完TI=0; //发送完了,标志位清零for(count=0;count5;count++) //用于保存最后按下的六个按键数值{ table_tr[count] =table_tr[count+1]; } table_tr[5]=cnt; //把最后按下的按键数值赋给table_tr【5】if(cnt==10) //按键按下的次数有没有等于10 cnt=0;//等于,则清零}}void main() { init(); //调用初始化子函数P0=0x00; while(1) { key_scan(); //调用键盘扫描子函数display();//调用显示子函数} }tips:感谢大家的阅读,本文由我司收集整编。
汇编语言实现双机通信
西安邮电大学单片机课程设计报告题目: 单片机之间的通信综合设计班级:测控1002班学生姓名:仵俊娇(06102048)朱凌萱(06102053)刘俊廷(06102038)刘宇(06102043)****:***实习时间:12-12-03-----12-12-13单片机之间的通信综合设计一、设计要求:1.A机,B机进行全双工通信,并用2位一体的数码管显示发送的数据和接收的数据。
2.加扩展功能。
二、实验步骤:1.根据单片机原理,分析实验要求,编写程序。
2.设计硬件电路,并且在Proteus中进行模拟仿真。
3.仿真成功后,合理布线,进行焊接。
4.进行检查调试。
三、所需元器件:四、主要功能描述:双机通讯系统实现A机指定数据段对B机指定数据段循环发送数据,建立通信时A机与B机进行一次握手确认,在接收过程中由B机对A机发送的数据进行校验,并可对错误字节进行重新接收。
A机数码管显示A机发送的数据,B机数码管显示B机接收的数据。
五、实验电路图:六、实验源程序及流程图:A机程序:ORG 0000HLJMP AMAINORG 0040HAMAIN: MOV SP,#5FHMOV TMOD,#20H ;定时器1置为方式2MOV TH1,#0F4H ;装载定时器初值,波特率2400MOV TL1,#0F4HMOV SCON,#50H ;串口工作在方式2MOV PCON,#00H ;SMOD=0SETB TR1 ;启动定时器SETB ET1 ; 开定时器1SETB ES ; 允许串行口中断CLR TI ;发送中断标志位清零MOV P2,#00H ;MAIN: JNB P3.6,KEY2 ;判断按键是否按下LJMP MAINKEY2: LCALL D10MS ;延时,消抖JB P3.6,MAIN; 再判断按键是否真的按下WAIT: JNB P3.6,WAIT ; 等待按键松手CALL INIT ;调试用数据产生DIALOG: MOV A,#0E1HCALL TXBYTE ;发送“E1”联络信号CALL RXBYTECJNE A,#0E2H,DIALOG ;B机允许发送RETX: CALL TXDATA ;发送数据块CALL RXBYTECJNE A,#00H,RETX ;B机接受正确?LJMP DIALOGTXBYTE: MOV SBUF,A ;发送字节子程序CALL TRANS ;调用显示MOV A,SBUFJNB TI,$CLR TIRETRXBYTE: JNB RI,$ ;接受字节子程序MOV A,SBUFCLR RIRETTXDATA: MOV R7,#15 ;发送数据块子程序MOV R0,#40HMOV R6,#00HLDATA: MOV A,@R0CALL TXBYTEMOV A,R6ADD A,@R0 ;求校验和MOV R6,A ;保存校验和INC R0DJNZ R7,LDATA ;整个数据块是否发送完毕MOV A,R6 ;发送校验和CALL TXBYTERETINIT: MOV R0,#40H ;调试用数据产生子程序MOV R7,#15MOV A,#36HL0: MOV @R0,AINC AINC R0DJNZ R7,L0RET;延时消抖程序D1S: MOV R6,#100D10: CALL D10MSDJNZ R6,D10RETD10MS: MOV R5,#10D1MS: MOV R4,#249DL: NOPNOPDJNZ R4,DLDJNZ R5,D1MSRET;显示子程序TRANS:MOV B, #16 ;采用16进制显示DIV ABMOV R1, BMOV R2, AMOV R3,#17DISP:MOV A,R2SETB P2.0ACALL DISPLAYACALL D10MSCLR P2.0MOV A,R1SETB P2.1ACALL DISPLAYACALL D10MSCLR P2.1DJNZ R3,DISPRETDISPLAY:MOV DPTR, #TABLE1 ;设置数据指针地址初值MOVC A,@A+DPTR ;根据有效地址查询MOV P1, A ; 结果传送到输出口P1RET;共阳TABLE1:DB 0C0H, 0F9H, 0A4H, 0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH;共阴TABLE2:DB 3FH, 06H, 5BH, 4FHDB 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CHDB 39H, 5DH, 79H, 71HENDB机程序:ORG 0000HLJMP BMAINORG 0040HBMAIN: MOV SP,#5FHMOV TMOD,#20H ;定时器1置为方式2MOV TH1,#0F4H ;装载定时器初值,波特率2400MOV TL1,#0F4HMOV SCON,#50HMOV PCON,#00H ;SMOD=0SETB TR1 ;启动定时器WDIALOG: CALL RXBYTECJNE A,#0E1H,WDIALOG ;等待联络信号MOV A,#0E2HCALL TXBYTE ;发送“E2”联络信号RERX: CALL RXDATA ;接受校验块XRL A,R6 ;校验和正确?JNZ NO ;不正确,转NOMOV A,#00H ;正确CALL TXBYTELJMP WDIALOGNO: MOV A,#0FFHCALL TXBYTELJMP RERXTXBYTE: MOV SBUF,A ;发送字节子程序JNB TI,$CLR TIRETRXBYTE: JNB RI,$;接受字节子程序MOV A,SBUFCLR RIRETRXDATA: MOV R7,#15 ;接受数据块子程序MOV R0,#40HMOV R6,#00HLDATA: CALL RXBYTEMOV @R0,ACALL TRANS ;调用显示MOV A,@R0MOV A,R6ADD A,@R0 ;求校验和.................MOV R6,A ;保存校验和INC R0DJNZ R7,LDATA ;整个数据块是否接受完毕CALL RXBYTERETD1S: MOV R6,#100D10: CALL D10MSDJNZ R6,D10RETD10MS: MOV R5,#10D1MS: MOV R4,#249DL: NOPNOPDJNZ R4,DLDJNZ R5,D1MSRETTRANS:MOV B, #16 ;采用16进制显示DIV ABMOV R1, BMOV R2, AMOV R3,#17DISP:MOV A,R2SETB P2.0ACALL DISPLAYACALL D10MSCLR P2.0MOV A,R1SETB P2.1ACALL DISPLAYACALL D10MSCLR P2.1DJNZ R3,DISPRETDISPLAY:MOV DPTR, #TABLE1 ;设置数据指针地址初值MOVC A,@A+DPTR ;根据有效地址查询MOV P1, A ; 结果传送到输出口P0RET;共阳TABLE1:DB 0C0H, 0F9H, 0A4H, 0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH;共阴TABLE2:DB 3FH, 06H, 5BH, 4FHDB 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CHDB 39H, 5DH, 79H, 71HENDA,B机通信流程图(省略按键与显示流程):A机流程图B机流程图七、设计原理:本次课程设计的主要原理有:1.串行口通信,通过简单的握手验证,在定时器控制下实现字节接收:如果两个单片机应用系统相距很近,将他们的串行口直接相连即可实现双机通信。
汇编语言实现串口通信(PC和单片机间)
8.用C语言或汇编语言实现串口通信(PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。
由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。
单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示1 硬件电路的设计MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。
所以单片机和PC机之间可以方便地进行串口通讯。
单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。
因此在通信距离较短时可采用零MODEM方式,简单三连线结构。
IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。
电路如图1所示。
硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。
接口电路如图3.5所示。
总体设计按照整体设计思路方案绘制原理图如下所示:2 系统软件设计软件设计分上位机软件设计和下位机软件设计。
这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。
为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。
现约定通信协议如下:PC机和单片机都可以发送和接收。
上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。
采用RS-232串口异步通信,1上位PC机与下位单片机异步串行通信的通信协议其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。
双机并行通讯程序设计
双机并行通讯程序设计1 问题的描述与分析题目要求由甲乙两台微机之间并行传送1K字节数据。
先甲机发送,乙机接收,后乙机发送,甲机接收。
甲乙双方的8255A均采用方式2工作。
8255A控制口地址为303。
本题属于双机并行通讯问题,应分为发送和接收两方面分别来进行研究。
由于程序需要对地址进行直接操作,所以选择汇编语言来编写较为简单方便。
在写程序的过程中,由于要用8255A芯片作为并行传输芯片,所以要熟练掌握8255A的控制方法;此外,程序多处还要用到DOS功能调用,所以还要对DOS的各种功能进行系统的学习。
两台PC各与一个8255A芯片相连,程序分为两部分,分别运行与两台PC机上以实现并行传输。
连接图如下:图1-1双机通讯的连接图程序分为两个部分,分别在甲机和乙机上面运行。
甲机运行的程序是先发送后接收,乙机上运行的程序时先接收后发送,实现先从甲机到乙机传输1KB的数据,后从乙机到甲机传输1KB的数据的功能。
我们在两台微机的内存中各开辟一个1KB的字符区BUF1,象征性的输入少许字符,来模拟要传输的1KB的数据。
再各开辟一个1KB的字符区BUF2用来存储接收到的1KB数据。
2 8255A芯片的介绍2.1 8255A的引脚功能8255A的芯片引脚图见图2-1:图2-1 8255A的芯片引脚图RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。
PB0~PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。
端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。
双机通信代码(接收方和发送方)
{
TH1=0xe8;//设置波特率为1200bps
TL1=0xe8;
}
void init_S_2400()
{
TH1=0xf4;//设置波特率为2400bps
TL1=0xf4;
}
void S_4800(ucharnumx)
{
TH1=0xfa;//设置波特率为4800bps
/*按下矩阵键盘第一行时以1200bps发送0,1,2,3;按下第二行时以2400bps发送4,5,6,7;
按下第三行时以4800bps发送8,9,10,11;按下第四行时以9600pbs发送12,13,14,15.
*/
/*接收方在接收到第一行的任意键值时,8个发光二极管形成流水灯;
在接收到第二行的任意键值时,显示在数码管上;
}
voidinit_S()
{
TMOD=0x20;//设置定时器1为方式2
TR1=1;
EA=1;
ES=1;
/*SMOD=0*/
/*设置SCON寄存器*/
SM0=0;//采用串口方式1进行双机通信
SM1=1;
REN=0;
}
void S_1200()
{
TH1=0xe8;//设置波特率为1200bps
TL1=0xe8;
temp=temp&0xf0;
}
init_S_2400();
send(num);
}
P3=0xfb;
/*按键过程*/
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)//表明键被按下
{
temp=P3;
switch(temp)
基于AT89C51的双机串行通信设计
基于AT89C51的双机串行通信设计摘要本文利用ATMEL公司的两片单片机AT89C51,采用RS232,通过KEIL软件汇编编程和PROTUES软件仿真,最终完成双机的串行通信。
设计要求为:两片单片机之间进行串行通信,发送端通过串行口TXD将0~F循环发送到接收端,完成后在接收端的LED灯亮。
软件部分设计:通过通信协议进行发送接收,主机收到从机的接收信号后,向从机发送16个数据与校验和,从机接收数据并与校验和比较,若相同则灯亮。
关键词:AT89C51单片机;汇编程序;接口技术;仿真及封装The design of the Dual Serial Communications system based onthe AT89C51 ABSTRACTThis paper uses two pieces of microcontroller AT89C51 made by ATMEL Corporation, using RS232, programming by KEIL software compilation and simulatting by PROTUES software, then carries out the final completion of the serial communication double machine. Design requirements: serial communication between two microcontrollers, the sender sends 0 ~ F to the receiver by via serial port TXD, at the receiving end after the completion of LED lights. Software part of the design: transmitting and receiving via the communication protocol, the host machine after receiving a signal from the slave machine ,sends 16 datas and the checksum, then the slave machine receives datas and compares with the checksum ,if the same is lights.Key words: AT89C51 sngle chip microcomputer; Assemble program; Interface technology; Encapsulation and simulation1引言 (1)2总体设计 (2)3硬件系统设计 (3)3.1AT89C51简介 (3)3.2整体电路设计 (4)4软件系统设计 (5)4.1串行通信软件实现 (5)4.2程序流程图 (6)4.3源程序 (7)4.4系统调试 (10)5设计总结 (11)参考文献 ....................................... (12)计算机与计算机的数据传送可以采用串行通讯和并行通讯两种方式。
单片机双机串行通信多数据传输汇编语言编程实现
• 178•串口是单片机与其他单片机或计算机系统进行异步串行通信的标准I/O 接口,在系统设计中应用非常广泛。
以教学中使用的CPU 字长是8位的51单片机为例,实现双机间多数据串行传输,在多数据发送时为每个数据增加特征值,接收的时候通过特征值判断接收的数据,此方法最多可以实现双机间16个数据的传送,适用于5-8个通道的数据采集系统。
将此设计思想应用在0-999s 的秒表系统设计中,系统运行稳定,实现预期效果。
单片机串口是异步串行通信,发送方发送数据并不考虑接收方什么时候接收,如果是传送1个数据比较好处理,串口无论工作在查询方式下还是中断方式下,接收方的CPU 只要检测RI =1,就可以接收数据。
如果发送方发送的是多个数据,接收方接收的是发送方发送的多个数据的哪一个?发送方发送的多个数据是动态变化的,尽管发送方发送多个数据的顺序在编程中是固定不变的,但是串口通信是异步的,接收方接收时,无法知道此次接收的数据是发送方发送的哪一个数据,所以接收方必须有能力判断接收到的是哪一个数据才能真正实现异步串行通信多数据的正确传送。
1 发送数据的加密原理及编程实现要想让接收方有能力判断接收的数据是哪一个数据,可以对要发送的数据做加密处理,数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性。
本设计借用数据加密的思想,对要发送的数据采用增加特征值的加密处理方法,乙机接收数据后,通过解密获取特征值,就可以知道接收的是哪一个数据了。
特征值的选取要视发送数据的范围,本文以发送压缩BCD 码说明数据加密的原理及编程实现。
1.1 发送数据的加密原理压缩BCD 码是用4位二进制表示1位十进制,由于设计中使用的单片机CPU 的字长是8位的,所以一次可以处理1个字节数据,用字节表示1位BCD 码的时候,高4位一定是“0”,低4位是”0-9”中的1个数字,这样用高4位的“0”就可以实现对数据加密处理。
双机通讯设计
Science and Technology & Innovation ┃科技与创新·13·文章编号:2095-6835(2015)01-0013-03双机通讯设计李槐生(太原理工大学,山西 太原 030024)摘 要:用汇编语言编写了一个双机通讯程序,即用中断的方式实现从发送方键盘上输入一个字符,接收方收到该字符后,将其显示在微机屏幕上的过程。
关键词:双机通讯程序;双机串行通讯;8250芯片;Modem中图分类号:TP273+.5 文献标识码:A DOI :10.15913/ki.kjycx.2015.01.013 1 双机通讯双机串行通讯如图1所示。
图1 双机串行通讯双机通信时,通常采用串行方式。
串行通讯是指只需要1条数据线就可以传送数据,且数据各数位按照规定顺序传送的通讯方式。
从图1中看以看出,用串行通信线将2台计算机连接起来,再调用BIOS 中断指令,可利用中断方式实现串行通信。
在串行方式中,通信接口每次由CPU 中获得8位数据,并串行通过1条线路,每次发送1位数据。
2 8250芯片和接口电缆2.1 可编程串行通讯接口82508250芯片是各种微机系统和计算机网络中被使用最多的一种异步通信接口芯片,是异步通信卡的核心部件。
该芯片主要包括总线缓冲器、芯片内部选择控制逻辑、接收控制电路、发送控制电路、传输速度控制电路、调制解调控制电路和中断控制电路。
该芯片具有以下6种性能:①仅适用于异步串行通信方式,可选择每字符的数据位数为5~8位;②内装可编程波特率发生器,允许数据传输的波特率为50~9 600 bps ,且具有独立的接收器时钟信号输入;③接收和发送均具有双重缓冲;④具有优先权中断管理系统,可对发送、接收、错误和通信线路状态进行中断检测;⑤可提供通信线路和Modem 的全部运行状态;⑥能检测假起始位,产生和检测终止符,且具有自诊断测试功能。
2.2 8250引脚2.2.1 数据总线D0~D7CPU 与8250之间的信息通过数据总线D0~D7交换。
用汇编语言编写程序,实现两台计算机之间的通信
学号:0120911360104课程设计题目串行通信程序设计学院自动化学院专业自动化专业班级自动化0901姓名冯成强指导教师李志俊2012 年 1 月13 日课程设计任务书学生姓名:冯成强专业班级:自动化0901指导教师:李志俊工作单位武汉理工大学自动化学院题目: 串行通信程序设计初始条件:用汇编语言编写程序,实现两台计算机之间的通信。
要求完成的主要任务:要求:①制作RS-232通信线,并用它连接两台计算机;②在计算机上用不同的颜色设置接收、发送区域;③能设置发送、接收的数据长度、通信速率,并能显示接收的数据;④可以将接收的数据作为文件保存起来;⑤编制完整的程序并调试;⑥撰写设计说明书及调试心得。
时间安排:2012年元月4日~2012年元月13日下午17:30 指导教师签名:年月日系主任(或责任教师)签名:年月日摘要汇编语言是面向计算机的程序设计语言。
在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。
这样用符号代替及其语言的二进制代码,就把机器语言变成了汇编语言。
作为最基本的编程语言之一,汇编语言的重要性毋庸置疑,因为它能够完成许多其它语言所无法完成的功能。
尤其在硬件关系非常密切的程序或要提高运算速度的程序,即使是C语言也会有些力不从心,而汇编语言能够很好的扬长避短,最大限度地发挥硬件的性能。
本次课程设计的题目是用汇编语言编写程序,实现两台计算机之间的通信,要实现许多的功能,通过RS-232C通信线实现两台计算机之间的数据传输。
同时,可以传输数字,在传输数字的时候能够发声,对于接收到的东西,可以保存在指定的文件中。
程序还能够选择通信校验方式。
关键字:汇编语言计算机通信串行通信程序设计1设计任务和要求①制作RS-232通信线,并用它连接两台计算机;②在计算机上用不同的颜色设置接收、发送区域;③能设置发送、接收的数据长度、通信速率,并能显示接收的数据;④可以将接收的数据作为文件保存起来;⑤编制完整的程序并调试;⑥撰写设计说明书及调试心得2设计思路2.1设计思路编写程序,运行程序之后,进入界面之后,界面分为两个部分,左边为接受对方机子传输过来的文件和其他的信息,右边部分显示本台机子传输的文件及数字等信息,界面顶部有提示信息,可以根据提示信息操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电大学单片机课程设计报告题目: 单片机之间的通信综合设计班级:测控1002班学生姓名:仵俊娇(06102048)朱凌萱(06102053)刘俊廷(06102038)刘宇(06102043)指导老师:赵广元实习时间:12-12-03-----12-12-13单片机之间的通信综合设计一、设计要求:1.A机,B机进行全双工通信,并用2位一体的数码管显示发送的数据和接收的数据。
2.加扩展功能。
二、实验步骤:1.根据单片机原理,分析实验要求,编写程序。
2.设计硬件电路,并且在Proteus中进行模拟仿真。
3.仿真成功后,合理布线,进行焊接。
4.进行检查调试。
三、所需元器件:四、主要功能描述:双机通讯系统实现A机指定数据段对B机指定数据段循环发送数据,建立通信时A机与B机进行一次握手确认,在接收过程中由B机对A机发送的数据进行校验,并可对错误字节进行重新接收。
A机数码管显示A机发送的数据,B机数码管显示B机接收的数据。
五、实验电路图:六、实验源程序及流程图:A机程序:ORG 0000HLJMP AMAINORG 0040HAMAIN: MOV SP,#5FHMOV TMOD,#20H ;定时器1置为方式2MOV TH1,#0F4H ;装载定时器初值,波特率2400MOV TL1,#0F4HMOV SCON,#50H ;串口工作在方式2MOV PCON,#00H ;SMOD=0SETB TR1 ;启动定时器SETB ET1 ; 开定时器1SETB ES ; 允许串行口中断CLR TI ;发送中断标志位清零MOV P2,#00H ;MAIN: JNB ,KEY2 ;判断按键是否按下LJMP MAINKEY2: LCALL D10MS ;延时,消抖JB ,MAIN; 再判断按键是否真的按下WAIT: JNB ,WAIT ; 等待按键松手CALL INIT ;调试用数据产生DIALOG: MOV A,#0E1HCALL TXBYTE ;发送“E1”联络信号CALL RXBYTECJNE A,#0E2H,DIALOG ;B机允许发送RETX: CALL TXDATA ;发送数据块CALL RXBYTECJNE A,#00H,RETX ;B机接受正确LJMP DIALOGTXBYTE: MOV SBUF,A ;发送字节子程序CALL TRANS ;调用显示MOV A,SBUFJNB TI,$CLR TIRETRXBYTE: JNB RI,$ ;接受字节子程序MOV A,SBUFCLR RIRETTXDATA: MOV R7,#15 ;发送数据块子程序MOV R0,#40HMOV R6,#00HLDATA: MOV A,@R0CALL TXBYTEMOV A,R6ADD A,@R0 ;求校验和MOV R6,A ;保存校验和INC R0DJNZ R7,LDATA ;整个数据块是否发送完毕MOV A,R6 ;发送校验和CALL TXBYTERETINIT: MOV R0,#40H ;调试用数据产生子程序MOV R7,#15MOV A,#36HL0: MOV @R0,AINC AINC R0DJNZ R7,L0RET;延时消抖程序D1S: MOV R6,#100D10: CALL D10MSDJNZ R6,D10RETD10MS: MOV R5,#10D1MS: MOV R4,#249DL: NOPNOPDJNZ R4,DLDJNZ R5,D1MSRET;显示子程序TRANS:MOV B, #16 ;采用16进制显示DIV ABMOV R1, BMOV R2, AMOV R3,#17DISP:MOV A,R2SETBACALL DISPLAYACALL D10MSCLRMOV A,R1SETBACALL DISPLAYACALL D10MSCLRDJNZ R3,DISPRETDISPLAY:MOV DPTR, #TABLE1 ;设置数据指针地址初值MOVC A,@A+DPTR ;根据有效地址查询MOV P1, A ; 结果传送到输出口P1RET;共阳TABLE1:DB 0C0H, 0F9H, 0A4H, 0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH;共阴TABLE2:DB 3FH, 06H, 5BH, 4FHDB 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CHDB 39H, 5DH, 79H, 71HENDB机程序:ORG 0000HLJMP BMAINORG 0040HBMAIN: MOV SP,#5FHMOV TMOD,#20H ;定时器1置为方式2MOV TH1,#0F4H ;装载定时器初值,波特率2400MOV TL1,#0F4HMOV SCON,#50HMOV PCON,#00H ;SMOD=0SETB TR1 ;启动定时器WDIALOG: CALL RXBYTECJNE A,#0E1H,WDIALOG ;等待联络信号MOV A,#0E2HCALL TXBYTE ;发送“E2”联络信号RERX: CALL RXDATA ;接受校验块XRL A,R6 ;校验和正确JNZ NO ;不正确,转NOMOV A,#00H ;正确CALL TXBYTELJMP WDIALOGNO: MOV A,#0FFHCALL TXBYTELJMP RERXTXBYTE: MOV SBUF,A ;发送字节子程序JNB TI,$CLR TIRETRXBYTE: JNB RI,$;接受字节子程序MOV A,SBUFCLR RIRETRXDATA: MOV R7,#15 ;接受数据块子程序MOV R0,#40HMOV R6,#00HLDATA: CALL RXBYTEMOV @R0,ACALL TRANS ;调用显示MOV A,@R0MOV A,R6ADD A,@R0 ;求校验和.................MOV R6,A ;保存校验和INC R0DJNZ R7,LDATA ;整个数据块是否接受完毕CALL RXBYTERETD1S: MOV R6,#100D10: CALL D10MSDJNZ R6,D10RETD10MS: MOV R5,#10D1MS: MOV R4,#249DL: NOPNOPDJNZ R4,DLDJNZ R5,D1MSRETTRANS:MOV B, #16 ;采用16进制显示DIV ABMOV R1, BMOV R2, AMOV R3,#17DISP:MOV A,R2SETBACALL DISPLAYACALL D10MSCLRMOV A,R1SETBACALL DISPLAYACALL D10MSCLRDJNZ R3,DISPRETDISPLAY:MOV DPTR, #TABLE1 ;设置数据指针地址初值MOVC A,@A+DPTR ;根据有效地址查询MOV P1, A ; 结果传送到输出口P0RET;共阳TABLE1:DB 0C0H, 0F9H, 0A4H, 0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH;共阴TABLE2:DB 3FH, 06H, 5BH, 4FHDB 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CHDB 39H, 5DH, 79H, 71HENDA,B机通信流程图(省略按键与显示流程):A机流程图B机流程图七、设计原理:本次课程设计的主要原理有:1.串行口通信,通过简单的握手验证,在定时器控制下实现字节接收:如果两个单片机应用系统相距很近,将他们的串行口直接相连即可实现双机通信。
通信时首先A机发送“E1”请求传送数据。
B机收到后发送应答数据“E2”(因此时E2未放入B机数据缓冲区所以B机数码管不显示),表示同意接收。
当A机收到应答信号“E2”后开始发送数据(此时“E2”为A机接收的数据,不显示),每发送一个数据字节都要计算“校验和”,然后B机接收数据并转存到数据缓冲区,接收一个次数据字节便计算一次“校验和”,再接收A机发送的校验和,进行比较若不相等请求A机重发。
2.数码管的动态显示:数码管的abcdefgh与单片机数据输出端相连,将和和数码管使能端相连,通过控和的高低电平对数码管的高低位进行位选通控制,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms 由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
3.按键的检测与软件去抖:作为一个按键,从没有按下到按下以及释放是一个完整的过程,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不可避免会产生干扰,这些干扰可能造成误触发过程。
为了防止这种现象的产生,需要在按键按下的时候把各种干扰信号滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但会增加硬件成本及硬件电路的体积。
对于实时性要求不高的系统,可以采用软件滤波的方法去除干扰信号:一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。
从按键被识别按下之后,延时4ms以上,可以避开了干扰信号区域,此时再检测一次按键是否真得已经按下,若真的已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明之前是由于干扰信号引起的误触发,处理单元便会舍弃本次的按键识别过程。
从而提高了系统的可靠性。
八、实验分析及检测:在数码管阳极未连接放大电路时,用仿真软件对电路和程序进行仿真,结果正确功能正常。
但查询网络和参考资料后,了解到P1口输出电流(10mA 左右)不足以正常驱动数码管(30~40mA)。
为了使数码管正常工作,小组讨论决定增加放大电路。
程序烧录和电路焊接完成后试运行,A机数码管高位不能点亮,用万用表检查放大电路的各脚电压后确定为管脚虚焊,重新焊接后解决问题,双机通讯系统最终正常工作。
九、实验心得:仵俊娇:在最后加电源的环节,B组数码管只显示一边,通过检查,是因为控制他的放大电路三极管虚焊导致,补修之后问题就解决了。
朱凌萱:实验开始时编写的程序略有问题无法很好的运行,后经过查阅资料、课本以及询问咨询解决了这个小问题,能够正常的运行。
做实验一定要先把理论知识弄清楚做实验才能顺利。
刘俊廷:实验中调试时会有接触不良的情况出现,时焊接时出现了些许地方没有焊好。