双击串行通讯实验
实验四、双击串行通讯实验
一、实验目的
该实验需要两套MPC100B配合完成。
1.掌握单片机串行口工作方式;
2.掌握双机通讯的接口电路设计及程序设计。
二、实验设备
1.仿真器;
2.单片机最小系统教学实验模块;
3.外部数据存储器模块;
三、实验要求
由两套单片机试验装置(两个实验小组)共同完成该实验。我们称装置1为甲机,装置2为乙机。甲机发送一个字节的呼叫信号给乙机,乙机正确地收到该呼叫信号后,返回一个字节的应答信号。当甲机收到正确的应答信号后,再发送规定格式的数据帧。数据帧必须包括以下内容:
数据长度(1字节)+数据(n字节)+校验和(1字节)
乙机收到完整的数据帧后,发送一个表明接收正确或错误的应答字节。
要求每个字节的发送帧格式为:起始位(1bit)+数据位(8bit)+停止位(1bit)。
要求通讯波特率为4800bps,二以上个信号和数据帧的具体数据内容,可以自行规定。
四、实验原理
4.1 串行通讯的方式
在串行通讯中,有两种基本的通讯方式:异步通讯,同步通讯。
异步串行通讯规定了字符数据的传送方式,即每个数据以相同的帧格式发送。每个帧信息由起始位、数据位、奇偶校验位和停止位组成。本实验主要学习异步通讯的实现方法。
按照通讯方式,又可以将数据传输线路分成三种:单工方式、半双工方式、全双工方式。
4.2 单片机串行口工作方式
单片机串行口工作方式一共4种,从方式1到方式3均用于串行异步通讯。在异步串行通讯的一个字节的传送中,必须包括了起始位(0)和停止位(1)。除此之外,方式1具有8位(1个字节)的数据位(低位在先),方式2、3则除这8位之外,还具有一个课编程的第9位,这个第9位编程通常被编程为奇偶校验位。本实验采用方式1,利用MOV SCON,#50H来设置SCON。
4.3 波特率的设置
在异步串口通讯中,一个很重要的工作就是进行串口波特率的设置。波特率是指串口通讯中每秒传送的位数,单位为bps,它反应了串口通讯的速度;同时,通讯双方的速度必须一致,才能够顺利进行通讯。
在双机通讯中,只要双方的波特率一致就能够完成通讯了;但是,在标准的异步通讯协议中,
只有几种波特率是适用的。例如,1200bps,2400bps,4800bps,9600bps,……等等。
而通用这个公式可以看出,并不是所有的晶振频率都能够得到准确的上述波特率。比如采用12MHz晶振,带入公式进行计算,就无法得到4800bps 的准确波特率。在这种情况下,过去人们都适用软件补偿的方法,尽量得到准确的波特率;而现在,市场上有很多通讯专用的晶振,例如3.6864MHz,11.0592MHz……晶振,都能够直接得到准确的波特率。因此在进行本实验时,必须只用通讯专用晶振。
当波特率已经确定,就可以反向推导出TH1 的取值。例如在本次实验中,我们要求波特率为4800bps,在晶振采用11.0592MHz的情况下,推出TH1=0F4H。
双机通讯接口设计
在本次实验中,主要讨论单片机系统之间的一部串行通讯的实现。
51单片机具有一个全双工的串行口,主要因为单片机内部有独立的发送器和接收器。但由于串口缓存太少,只有1字节,在相互传送大量数据时,软件上实际采用的还是半双工的工作方式。
如果两个51单片机应用系统相距很近,可以将他们的串行口用导线直接连起来,就构成了双机通讯,请注意两个单片机系统要共地
发送程序流程图
开始
定时器,串行口初始化
地址指针dptr,长度计数器
r7,校验寄存器r6置初值
发送呼叫信号06H 等待乙机回答
发送字节长度数
发送校验和等待乙机回答发送数据
是00H?
发送完否
转送正确
结束
N N
N
Y
Y Y
为确保通讯成功,通讯双方鼻息在软件上有一系列的约定,通常称为软件协议,本例规定的软件协议如下:
通讯双方均采用4800bps 的波特率进行传送,甲机发送数据,乙机接受数据。双机开始通讯时,甲机发送一个呼叫信号“06H”,询问乙机是否可以接收数据;乙机收到呼叫信号后,若同意接收数据则发回“00H”作为应答,否则发送“15H”表示暂不能接受数据,甲机只有收到乙机的应答信号“00H”后才可把存放在外部数据存储器的字节内容发送给乙机,否则继续向乙机呼叫,知道乙机同意接受。呼叫成功以后甲机一次发送长度字节(1字节)、数据字节(n字节)和校验和字节(1字节),其中校验和为长度字节和数据字节的“累加和”。乙机在成功收到甲机的数据以后,发送“0FH”作为成功应答,否则发送“F0H”作为应答失败。
甲机发送程序清单:
ORG 0000H
AJMP FMT_T_S
ORG 0030H
FMT_T_S:
MOV 30H,#12H
MOV 31H,#32H
MOV 32H,#56H
MOV 33H,#43H
MOV TMOD,#20H
MOV TH1,#0F4H
MOV TL1,#0F4H
SETB TR1
MOV SCON,#50H
MOV PCON,#80H
FMT_RAM:MOV R0,#30H MOV R7,2FH
MOV R6,#00H
TX_ACK: MOV A,#06H MOV SBUF,A
WAIT1: JBC TI,RX_YES SJMP WAIT1
RX_YES: JBC RI,NEXT1 SJMP RX_YES
NEXT1: MOV A,SBUF CJNE A,#00H,TX_ACK TX_BYTES:MOV A,R7 MOV SBUF,A
ADD A,R6
MOV R6,A
WAIT2: JBC TI,TX_NEWS SJMP WAIT2
ORG 0000H
AJMP FMT_T_S
ORG 0030H
FMT_T_S:
MOV 30H,#12H MOV 31H,#32H
MOV 32H,#56H
MOV 33H,#43H
MOV TMOD,#20H MOV TH1,#0F4H
MOV TL1,#0F4H
SETB TR1
MOV SCON,#50H
MOV PCON,#80H
FMT_RAM:MOV R0,#30H MOV R7,2FH
MOV R6,#00H
TX_ACK: MOV A,#06H MOV SBUF,A
WAIT1: JBC TI,RX_YES SJMP WAIT1
RX_YES: JBC RI,NEXT1 SJMP RX_YES
NEXT1: MOV A,SBUF
CJNE A,#00H,TX_ACK
TX_BYTES:MOV A,R7
MOV SBUF,A
ADD A,R6
MOV R6,A
WAIT2: JBC TI,TX_NEWS SJMP WAIT2
TX_NEWS:MOV A,@R0
MOV SBUF,A
ADD A,R6
MOV R6,A
INC R0
WAIT3: JBC TI,NEXT2 SJMP WAIT3
NEXT2: DJNZ R7,TX_NEWS TX_SUM: MOV A,R6
MOV SBUF,A
WAIT4: JBC TI,RX_0FH SJMP WAIT4
RX_0FH: JBC RI,IF_0FH SJMP RX_0FH
IF_0FH: MOV A,SBUF
CJNE A,#0FH,FMT_RAM SJMP $
乙机接受程序清单:
ORG 0000H
AJMP FMT_T_S
ORG 0030H
FMT_T_S: MOV TMOD,#20H MOV TH1,#0F4H
MOV TL1,#0F4H
SETB TR1
MOV SCON,#50H
MOV PCON,#80H
FMT_RAM:
MOV R0,#30H
MOV R6,#00H
RX_ACK:
JBC TI,RX_BYTES
SJMP WAIT1
TX_15H:
MOV A,#15H
MOV SBUF,A
WAIT2:JBC TI,HA VE1 SJMP WAIT2
HA VE1:LJMP RX_ACK
RX_BYTES: JBC RI,HA VE2 SJMP RX_BYTES
HA VE2:MOV A,SBUF
MOV R6,A
RX_NEWS: JBC RI,HA VE3 SJMP RX_NEWS
HA VE3:MOV A,SBUF
MOV @R0,A
INC R0
ADD A,R6
MOV R6,A
RX_SUM: JBC RI,HA VE4 SJMP RX_SUM
HA VE4:MOV A,SBUF
CJNE A,06H,TX_ERR
TX_RIGHT: MOV A,#0FH MOV SBUF,A
WAIT3:
JBC TI,OKEND
SJMP WAIT3
TX_ERR: MOV A,#0F0H
MOV SBUF,A
WAIT4:JBC TI,AGAIN
SJMP WAIT4
AGAIN: LJMP FMT_RAM OKEND: SJMP OKEND
实验总结:
c语言串口通信范例
一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include
static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);
8251串行通讯实验
安徽师范大学数计学院实验报告 专业名称11计科 课程微机原理 实验名称串行通信实验姓名 学号110704012
8251 可编程串行口与PC 机通讯实验 一、实验目的 (1) 掌握8251 芯片的结构和编程,掌握微机通讯的编制。 (2) 学习有关串行通讯的知识。 (3) 学习PC 机串口的操作方法。 二、实验说明 1、8251 信号线 8251 是CPU 与外设或Mode 之间的接口芯片,所以它的信号线分为两组:一组是用于与CPU 接口 的信号线,另一组用于与外设或Mode 接口。 (1)与CPU 相连的信号线: 除了双向三态数据总线(D7~D0)、读(RD)、写(WR)、片选(CS)之外,还有: RESET:复位。通常与系统复位相连。 CLK:时钟。由外部时钟发生器提供。 C/D:控制/数据引脚。 TxRDY:发送器准备好,高电平有效。
TxE:发送器空,高电平有效。 RxRDY:接收器准备好,高电平有效。 SYNDET/BRKDET:同步/中止检测,双功能引脚。 (2)与外设或Mode 相连的信号线: DTR:数据终端准备好,输出,低电平有效。 DSR:数据装置准备好,输入,低电平有效。 RTS:请求发送,输出,低电平有效。 CTS:准许传送,输入,低电平有效。 TxD:发送数据线。 RxD:接收数据线。 TxC:发送时钟,控制发送数据的速率。 RxC:接收时钟,控制接收数据的速率。 2、8251 的初始化编程和状态字 8251 是一个可编程的多功能串行通信接口芯片,在使用前必须对它进行初始化编程。初始化编 程包括CPU 写方式控制字和操作命令字到8251 同一控制口,在初始化编程时必须按一定的顺序。如 下面的流程图:
VC++_串口上位机编程实例
VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转
换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,
2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按
串口通信实验讲解
课程名称:Zigbee技术及应用实验项目:串口通信实验指导教师: 专业班级:姓名:学号:成绩: 一、实验目的: (1)认识串口通信的概念; (2)学习单片机串口通信的开发过程; (3)编写程序,使单片机与PC通过串口进行通信。 二、实验过程: (1)根据实验目的分析实验原理; (2)根据实验原理编写C程序; (3)编译下载C程序,并在实验箱上观察实验结果。 三、实验原理: 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干条控制信号线。因为一次只能传送一位,所以对于一个字节的数据,至少要分8位才能传送完毕,如图3-1所示。 图2-1串行通信过程 串行通信制式: (1)单工制式 这种制式是指甲乙双方通信时只能单向传送数据,发送方和接收方固定。 (2)半双工制式 这种制式是指通信双方都具有发送器和接收器,即可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送。
(3)全双工制式 这种制式是指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,因此全双工制式可实现甲乙双方同时发送和接收数据,发送时能接收,接收时能发送。 三种制式分别如图3-2所示 图3-2串行通信制式 3.1硬件设计原理 CC2530有两个串行通信接口USART0和USART1,两个USART具有同样的功能,可已分别运行于UART模式和同步SPI模式。 CC2530的两个串行通信接口引脚图分布如表3-1所示 表3-1 CC2530串行通信口引脚图分布 本实验CC2530模块使用的是USART1的位置2,P1_6和P1_7。
单片机串口通信C程序及应用实例
一、程序代码 #include
TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }
单片机串行通信实验
单片机实验报告 实验名称:串行通信实验 姓名:高知明 学号:110404320 班级:通信3 实验时间:2014-6-11 南京理工大学紫金学院电光系
一、实验目的(四号+黑体) 1、理解单片机串行口的工作原理; 2、学习使用单片机的TXD\RXD口; 3、了解MAX232芯片的作用; 二、实验原理 MCS-51单片机内部集成有一个UART,用于全双工方式的串行通信,可以发送、接收数据。他有两个相互独立的接收、发送缓冲器,这两个缓冲器同名(SBUF),共用一个地址号(99H)。发送缓冲器只能写入,不能读出,接受缓冲器只能读出,不能写入。要发送的字节数据直接写入发送缓冲器。SBUF=a;当UART接收到数据后,CPU从接收缓冲器中读取数据,a=SBUF;串行口内部有两个移位寄存器,一个用于串行发送,一个用于串行接收。定时器T1作为波特率发生器,波特率发生器的溢出信号昨接受或发送移位寄存器的位移时钟。TI与RI分别为发送完数据的中断标志,用来想CPU发中断请求。 三、实验内容 1、发送信号 1)C51程序: #include