双机通信1
STM32IIC双机通信——HAL库硬件IIC版

STM32IIC双机通信——HAL库硬件IIC版 关于IIC的原理这⾥我就不多说了,⽹上有很多很好的解析,如果要看我个⼈对IIC的理解的话,,这⾥主要讲⼀下怎样利⽤STM32CubeMx实现IIC的通讯,经过个⼈实践,感觉HAL库的硬件IIC要⽐标准库的稳定。
好了,下⾯就从STM32CubeMx 配置开始⼀步步实现IIC通讯。
STM32CubeMx的配置,这⾥关于新建⼯程的步骤我就不细说了,如果还不会操作STM32CubeMx 的可以,这⾥主要对IIC的配置进⾏说明。
了解IIC的都知道,IIC通信有主从机之分,⽤两⽚STM32进⾏IIC通信当然也不例外,不过使⽤STM32CubeMx 配置有⼀个好处,就是不⽤分别配置主从机,在STM32CubeMx 配置⾥⾯,主从机的配置是⼀样,唯⼀不同的就是IIC的地址如上图,这个地址很重要,只要配置好了,基本就成功了。
还有⼀个要注意的,就是IIC的SDA、SCK引脚要配置成NPP模式,不然容易出现信号线忙,检测不到从机的情况。
配置配好后我们⽣成代码,就可以进⾏通信了,主从机核⼼代码如下: 下⾯是主机的重要代码:/* I2C2 init function IIC配置*/static void MX_I2C2_Init(void){hi2c2.Instance = I2C2;hi2c2.Init.Timing = 0x10805D88;hi2c2.Init.OwnAddress1 = 20; //⽤户⾃⼰配置的地址hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c2.Init.OwnAddress2 = 0;hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c2) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure Analogue filter*/if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure Digital filter*/if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}}while(HAL_I2C_Master_Transmit_IT(&hi2c2 ,0x0b,&BUFF[0], 1)!= HAL_OK){}//IIC主机发送函数,主要IIC配置好了,这个可以添加到main函数⾥⾯测试 关于STM32CubeMx的HAL库IIC收发有⼏种函数,⽤户可以根据⾃⼰不同的需求进⾏选择,以下就是主要的⼏个HAL库IIC收发函数:/* 第1个参数为I2C操作句柄第2个参数为从机设备地址第3个参数为从机寄存器地址第4个参数为从机寄存器地址长度第5个参数为发送的数据的起始地址第6个参数为传输数据的⼤⼩第7个参数为操作超时时间 */HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10);HAL_I2C_Mem_Write_IT();HAL_I2C_Mem_Read();HAL_I2C_Mem_Read_IT();HAL_I2C_Mem_Read_DMA();HAL_I2C_Mem_Write_DMA();/* 不需要⽤到寄存器地址的主机HAL库IIC收发函数 */HAL_I2C_Master_Receive(); //STM32 主机接收,不需要⽤到寄存器地址HAL_I2C_Master_Transmit();HAL_I2C_Master_Receive_IT(); //中断IIC接收HAL_I2C_Master_Receive_DMA(); //DMA ⽅式的IIC接收HAL_I2C_Master_Transmit_IT(); //中断IIC发送HAL_I2C_Master_Transmit_DMA(); //DMA ⽅式的IIC发送HAL_I2C_Master_Transmit(&hi2c2,0x0B,PA_BUFF,sizeof(PA_BUFF),0x10); //STM32 主机发送/* 不需要⽤到寄存器地址的从机HAL库IIC收发函数 */HAL_I2C_Slave_Receive(); //STM32 从机机接收,不需要⽤到寄存器地址HAL_I2C_Slave_Transmit(); //STM32 从机机发送,不需要⽤到寄存器地址HAL_I2C_Slave_Receive_IT();HAL_I2C_Slave_Receive_DMA();HAL_I2C_Slave_Transmit_IT();HAL_I2C_Slave_Transmit_DMA(); 我这⾥因为只是做两个STM32间的单向通⾏⽽已,不需要对寄存器进⾏写数据。
单片机单片机课程设计-双机串行通信

单片机单片机课程设计-双机串行通信单片机课程设计双机串行通信在当今的电子信息领域,单片机的应用无处不在。
而双机串行通信作为单片机系统中的一个重要环节,为实现设备之间的数据交换和协同工作提供了关键的技术支持。
一、双机串行通信的基本原理双机串行通信是指两个单片机之间通过串行接口进行数据传输的过程。
串行通信相较于并行通信,具有线路简单、成本低、抗干扰能力强等优点。
在串行通信中,数据是一位一位地按顺序传输的。
常见的串行通信协议有 UART(通用异步收发器)、SPI(串行外设接口)和 I2C(内部集成电路)等。
在本次课程设计中,我们主要采用 UART 协议来实现双机串行通信。
UART 协议包括起始位、数据位、奇偶校验位和停止位。
起始位用于标识数据传输的开始,通常为逻辑 0;数据位可以是 5 位、6 位、7 位或 8 位,具体取决于通信双方的约定;奇偶校验位用于检验数据传输的正确性,可选择奇校验、偶校验或无校验;停止位用于标识数据传输的结束,通常为逻辑 1。
二、硬件设计为了实现双机串行通信,我们需要搭建相应的硬件电路。
首先,每个单片机都需要有一个串行通信接口,通常可以使用单片机自带的UART 模块。
在硬件连接方面,我们将两个单片机的发送端(TXD)和接收端(RXD)交叉连接。
即单片机 A 的 TXD 连接到单片机 B 的 RXD,单片机 B 的 TXD 连接到单片机 A 的 RXD。
同时,还需要共地以保证信号的参考电平一致。
此外,为了提高通信的稳定性和可靠性,我们可以在通信线路上添加一些滤波电容和上拉电阻。
三、软件设计软件设计是实现双机串行通信的核心部分。
在本次课程设计中,我们使用 C 语言来编写单片机的程序。
对于发送方单片机,首先需要对 UART 模块进行初始化,设置波特率、数据位、奇偶校验位和停止位等参数。
然后,将要发送的数据放入发送缓冲区,并通过 UART 发送函数将数据一位一位地发送出去。
对于接收方单片机,同样需要对 UART 模块进行初始化。
双机通信实验报告.doc

双机通信实验报告。
单片机实验报告(自动化15级)实验名称:串行通信实验1.实验1的目的。
掌握单片机串口的工作模式;2.掌握双机通信的接口电路设计和程序设计。
2.实验设备1。
个人电脑;2.单片机最小系统教学实验模块:3.数码管显示模块三、实验内容1。
两套单片机测试装置(两个实验组)共同完成了实验。
我们U1是机器A,U2是机器B。
机器A将学生的学号后的8位数字发送到机器B。
机器B接收到这8位数字,并将其显示在8位数字的电子管上。
该电路如图1所示。
串行通信模式要求为模式1,波特率为2400位/秒,不是双倍,单片机外部晶振频率为11.0592米。
图1双机通信原理附加要求示意图:机器b收到后,该机器(机器b)的学生编号的最后8位数字被送回机器a,并显示在数码管上。
2.单片机与PC机之间的通信单片机向PC机发送数据。
单片机将本机的学生号(学生本人)反复发送到PC机,发送波特率为1200,采用模式1,单片机外部晶振频率为11.0592米四、实验原理4.1串行通信模式在串行通信中,有两种基本通信模式:异步通信。
异步串行通信规定了字符数据的传输格式,即每个数据以相同的帧格式传输。
每个帧信息由起始位、数据位、奇偶校验位和停止位组成。
本实验主要研究异步通信的实现方法。
在异步通信中,每个字符使用一个起始位和一个停止位作为字符开始和结束的符号,因此占用时间。
因此,为了提高传输数据块时的通信速度,这些标记通常被去除,并采用同步通信。
同步通信不像异步通信那样依赖起始位在每个字符数据的开头发送和接收同步。
相反,同步字符用于在每个数据块传输开始时同步发送方和接收方。
根据通信方式,数据传输线可分为三种类型:单工模式、半双工模式、全双工模式。
(1)单工模式在单工模式中,通信线路的一端连接到发射机,另一端连接到接收机,这形成单向连接,并且仅允许数据在固定方向上传输。
(2)半双工模式在半双工模式下,系统中的每个通信设备由一个发射机和一个接收机组成,它们通过收发器开关连接到通信线路,如图33所示-1.实验1的目的。
基于USB接口实现双机通信设计与实现

摘要:USB由于其速度快、支持热插拔、稳定性好、用户使用方便、支持即插即用等优点,现已成为PC机的标准总线接口。
本文介绍了一种利用USB总线接口来实现的双PC机互联的技术方案。
随着个人计算机对USB标准的支持,USB的各种应用应运而生。
从手持设备、桌面设备、家用设备甚至到工业、通讯、测控等领域,都出现了USB的便捷设备。
如常用的U盘、USB摄像头和USB鼠标键盘等。
它们的出现,极大的丰富了人们的生活,也渐渐的改变着人们的生活工作方式。
同时,随着计算机的普及和信息化进程的加快,家庭内出现两台电脑己不少见了。
对大多数家庭用户来说,利用计算机网卡的RJ45接口就能满足基本的数据传输和网络共享了。
但是要进行Internet连接共享就不行了,因为一台电脑一般只有一个网卡。
为了方便快捷高速的实现Internet连接共享,可以利用USB双机互联线进行连接。
基于此,本文就针对USB双机互联展开,逐步地讨论了USB双机互联的原理及其实现过程。
本文首先从USBI.1协议和TCP/IP着手,分析了互联所需的协议及WindowsXP 系统对其的支持情况,得出主机侧需要一个微端口USB虚拟网卡驱动支持。
随后,以系统的观点,把USB互联设备分成软件部分和硬件部分,并对它们分别进行可行性分析,并给出基本的实现细节和过程。
再者,在介绍S3C44BOX 开发板的基础上,扩展了一USB口作为USB机互联设备。
最后,专门对软件设计给出了编程见解和遇到的常见问题,并结合软硬件的编程、调试和运行分析,总结了USB双机互联实现的所需的知识和方法。
关键字:USB接口双机通信1引言总体现状随着PC的普及和信息网络的大发展,上网的人越来越多,也越来越依賴网络给自己工作生活带来便捷。
同时无线网络进一步的发展,我们几乎不受限制的随时随地接入互联网浏览信息、电子邮件、下载文件和听音乐等等网络活动。
有了网络,我们的地球小了,生活也得变丰富多彩了。
我们已经离不开网络了。
双机互联--怎样实现两台电脑的通信

双机互联--怎样实现两台电脑的通信双机互联随着时代的发展,电脑在现在的家庭中的普及程度越来越高,而且已经有很多的家庭拥有了两台甚至两台以上的电脑。
对于这些用户来说,如何把两台电脑连接在一起,组成一个最小规模的局域网,用来共享文件,联机玩游戏,共享打印机等外设,甚至共享MODEM上网就成为应用中的一个焦点,这就是我们这里所说的“双机互联”。
双机互联方法很多,你可以使用两块以太网卡,通过非屏蔽双纹线(UTP)连接;也可以通过串口或并口直接连接,或使用USB接口连接,还可以利用计算机的红外线接口无线连接以及通过两台MODEM通过拨号实现远程共享等等。
一、使用USB线双机互联使用USB线双机互联是最新的双机互联方法,它借助于专用的USB线通过两台计算机的USB口连接后再实现数据交换,不仅传输速率大大超越传统的串口/并口(最高可达6Mb/s,一般情况下也可超过4Mb/s),而且实现真正的即插即用。
它具有以下的特点:(1)可提供高达6Mbps的传输速率。
USB文件传输连接电缆可提供的传输速率比并口快500%,比串口快700%。
(2)能够检测到远程的PC,可以分别在两个窗口方便地剪切、拷贝、粘贴或拖拉文件。
也可以把远程的文件在本地电脑的打印机进行打印。
(3)具有热插拔功能和远程唤醒功能,传输的长度为2~4.5米。
(4)系统要求低。
Pentium 100MHz或更高,一个USB端口,支持Windows 95、OSR2.1、Windows 98、Windows 2000或Windows XP操作系统。
方法:只需要购买一根专用的USB联机线即可,由于USB可以热插拔,因此使用非常简单方便。
在插上线以后,需要安装相应的应用程序才能实现功能,安装完成以后可以进行共享光驱、打印文件、运行程序等操作,和一般的双机互联不同的是,每一台机器都拥有对另一台机器的完全操作权利,而不管是否设置了共享。
二、利用红外线实现双机文件传输功能用红外线口也可以将两台电脑连接起来。
单片机双机串行实验报告

单片机双机串行实验报告实验目的:通过单片机实现双机串行通信功能,掌握串行通信的原理、方法和程序设计技巧。
实验原理:双机串行通信是指通过串行口将两台单片机连接起来,实现数据的传输和互动。
常用的串行通信方式有同步串行通信和异步串行通信。
异步串行通信是指通过发送和接收数据时的起始位、停止位和校验位进行数据的传输。
而同步串行通信是指通过外部时钟信号进行数据的同步传输。
实验器材:1.两台单片机开发板(MCU7516)2.两个串口线3.两台计算机实验步骤:1.将两台单片机开发板连接起来,通过串口线连接它们的串行口。
2.在两台计算机上分别打开串口调试助手软件,将波特率设置为相同的数值(例如9600)。
3.在编程软件中,编写两个程序分别用于发送数据和接收数据。
4.在发送数据的程序中,首先要设置串口的波特率、数据位、停止位和校验位,并将数据存储在缓冲区中。
然后利用串口发送数据的指令将数据发送出去。
5.在接收数据的程序中,同样要设置串口的参数。
然后使用串口接收数据的指令将接收到的数据存储在缓冲区中,并将其打印出来。
实验结果与分析:经过实验,我们成功地实现了单片机之间的双机串行通信。
发送数据的单片机将数据发送出去后,接收数据的单片机能够正确地接收到数据,并将其打印出来。
实验中需要注意的是,串口的波特率、数据位、停止位和校验位必须设置为相同的数值。
否则,发送数据的单片机和接收数据的单片机无法正常进行通信。
同时,在实验之前,需要了解单片机开发板支持的串口通信相关的指令和函数。
实验总结:通过本次实验,我们深入了解了单片机之间的双机串行通信原理和方法。
掌握了串口的设置和使用方法,以及相关的指令和函数。
在实验中,我们学会了如何通过串行口实现数据的传输和互动,为今后的单片机应用和开发打下了基础。
同时,我们还发现,双机串行通信在实际应用中有着广泛的用途。
例如,可以通过串行通信实现两台计算机之间的数据传输,或者实现单片机与计算机之间的数据收发。
CAN总线的双机通信.doc

实验3 CAN总线的双机通信一、实验目的:学习并完成CAN总线的双机通信二、实验设备:EL-8051-III型单片机实验箱三、实验内容:初始化CAN节点,使SJA1000处在准备工作状态。
编写发送和接收程序,一台发送,一台接收,并验证实验程序。
四、实验步骤:1.给试验箱换上CAN控制器;2.编写并编译初始化和发送、接收程序;3.下载程序并调试。
五、实验程序:;本程序适用于带ALE发生器的新板,是两块板的收发程序;将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.;两块模块上的JUMP-4的两个跳线短接在Single侧;用导线分别对应短接两模块上的CANL和CANH.;(也可用带水晶头的专用CAN连接线的两头分别插在两模块的插座中而不用导线连接) ;有且只能有一块模块上的A短接到CANL,B短接到CANH.;接通电源,运行本测试程序,在断点处查看内存单元20H~27H中的值是否与30H~37H 中的值完全对应相等;如果相等表示模块正常,否则用自检程序分别检测收发模块MODE EQU 0DE00H ;模式寄存器CMR EQU 0DE01H ;命令寄存器SR EQU 0DE02H ;状态寄存器IR EQU 0DE03H ;中断寄存器IER EQU 0DE04H ;中断使能寄存器BTR0 EQU 0DE06H ;总线定时寄存器一BTR1 EQU 0DE07H ;总线定时寄存器二OCR EQU 0DE08H ;输出控制寄存器ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器ECC EQU 0DE0CH ;错误代码捕捉寄存器TXERR EQU 0DE0FH ;发送错误计数器ACR0 EQU 0DE10H ;验收代码寄存器0ACR1 EQU 0DE11H ; 1ACR2 EQU 0DE12H ; 2ACR3 EQU 0DE13H ; 3AMR0 EQU 0DE14H ;验收屏蔽寄存器0AMR1 EQU 0DE15H ; 1AMR2 EQU 0DE16H ; 2AMR3 EQU 0DE17H ; 3CANTRXB EQU 0DE10H ;发送/接收帧信息ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二DATA1 EQU 0DE13H ;发送/接收数据首址RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器CDR EQU 0DE1FH ;时钟分频寄存器ORG4000HJMP CANINIORG4080H;----------------------------------------------------------------;初始化CANINI:MOV DPTR,#MODE ;方式寄存器MOV A,#09H ;进入复位状态MOVX @DPTR,A ;MOV DPTR,#CDR ;时钟分频寄存器MOV A,#88H ;选择PLICAN模式,关闭时钟输出MOVX @DPTR,A ;MOV DPTR,#IER ;中断允许寄存器MOV A,#0DH ;开放发送中断,溢出中断和错误警告中断MOVX @DPTR,A ;MOV DPTR,#AMR0 ;接收屏蔽寄存器MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR1 ;MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR2 ;MOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#AMR3 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#ACR0 ;验收代码寄存器MOV A,#11H ;MOVX @DPTR,A ;MOV DPTR,#ACR1 ;MOV A,#22H ;MOVX @DPTR,A ;MOV DPTR,#ACR2 ;MOV A,#33H ;MOVX @DPTR,A ;MOV DPTR,#ACR3 ;MOV A,#43H ;MOVX @DPTR,A ;MOV DPTR,#BTR0 ;总线定时寄存器MOV A,#03H ;MOVX @DPTR,A ;MOV DPTR,#BTR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#OCR ;输出控制寄存器MOV A,#0AAH ;MOVX @DPTR,A ;MOV DPTR,#RBSA ;复位时候改成00hMOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#TXERR ;发送错误计数寄存器MOV A,#0 ;MOVX @DPTR,A ;MOV DPTR,#ECC ;错误代码捕捉寄存器????????????MOVX A,@DPTR ;MOV DPTR,#MODE ;MOV A,#08H ;单向验收滤波器(32位长)起作用,成功发送时必须应答信号MOVX @DPTR,A ;NOP;NOP;;*************************************************;发送MOV DPTR,#TRDATA ;把所要发送的数据送入单片机RAM中的20HMOV R2,#00H ;MOV R1,#08H ;MOV R0,#20H ;DD: MOV A,R2 ;MOVC A,@A+DPTRMOV @R0,A ;INC R2 ;INC R0DJNZ R1,DD ;MOV R0,#00H ;MOV R1,#00H ;MOV R2,#00H ;TDAT A:MOV DPTR,#SR ;状态寄存器MOVX A,@DPTR ;从SJA1000读入状态寄存器值JB ACC.4,TDAT A ;判断是否在等待接收,正在接收则等待TS0:MOVX A,@DPTR ;判断上次发送是否完成,为完成则等待JNB ACC.3,TS0TS1:MOVX A,@DPTR ;判断发送缓冲区是否锁定,锁定则等待JNB ACC.2,TS1TS2:MOV DPTR,#CANTRXB ;发送缓冲区首地址MOV A,#88H ;帧信息:扩展格式数据帧,数据长度8字节MOVX @DPTR,AINC DPTRMOV A,#11HMOVX @DPTR,AINC DPTRMOV A,#22HMOVX @DPTR,AINC DPTRMOV A,#33HMOVX @DPTR,AINC DPTRMOV A,#43HMOVX @DPTR,AMOV R0,#20H ;单片机内RAM发送数据首地址,发送的数据为TRDAT A中的数据MTBF: MOV A,@R0INC DPTRMOVX @DPTR,AINC R0CJNE R0,#48H,MTBF ;最后一个数据字节地址的下一个地址MOV DPTR,#CMRMOV A,#01H ;当前报文被发送MOVX @DPTR,ATRDAT A: DB 11H,22H,33H,44H,55H,66H,77H,88H;**************************************************************END;本程序适用于带ALE发生器的新板,是两块板的收发程序;将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.;两块模块上的JUMP-4的两个跳线短接在Single侧;用导线分别对应短接两模块上的CANL和CANH.;(也可用带水晶头的专用CAN连接线的两头分别插在两模块的插座中而不用导线连接);有且只能有一块模块上的A短接到CANL,B短接到CANH.;接通电源,运行本测试程序,在断点处查看内存单元20H~27H中的值是否与30H~37H中的值完全对应相等;如果相等表示模块正常,否则用自检程序分别检测收发模块MODE EQU 0DE00H ;模式寄存器CMR EQU 0DE01H ;命令寄存器SR EQU 0DE02H ;状态寄存器IR EQU 0DE03H ;中断寄存器IER EQU 0DE04H ;中断使能寄存器BTR0 EQU 0DE06H ;总线定时寄存器一BTR1 EQU 0DE07H ;总线定时寄存器二OCR EQU 0DE08H ;输出控制寄存器ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器ECC EQU 0DE0CH ;错误代码捕捉寄存器TXERR EQU 0DE0FH ;发送错误计数器ACR0 EQU 0DE10H ;验收代码寄存器0ACR1 EQU 0DE11H ; 1ACR2 EQU 0DE12H ; 2ACR3 EQU 0DE13H ; 3AMR0 EQU 0DE14H ;验收屏蔽寄存器0AMR1 EQU 0DE15H ; 1AMR2 EQU 0DE16H ; 2AMR3 EQU 0DE17H ; 3CANTRXB EQU 0DE10H ;发送/接收帧信息ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二DATA1 EQU 0DE13H ;发送/接收数据首址RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器CDR EQU 0DE1FH ;时钟分频寄存器ORG4000HJMP CANINIORG4080H;----------------------------------------------------------------;初始化CANINI:MOV DPTR,#MODE ;方式寄存器MOV A,#09H ;MOVX @DPTR,A ;MOV DPTR,#CDR ;时钟分频寄存器MOV A,#88H ;选择PLICAN模式,关闭时钟输出MOVX @DPTR,A ;MOV DPTR,#IER ;中断允许寄存器MOV A,#0DH ;开放发送中断,溢出中断和错误警告中断MOVX @DPTR,A ;MOV DPTR,#AMR0 ;接收屏蔽寄存器MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR2 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#AMR3 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#ACR0 ;验收代码寄存器已被屏蔽MOV A,#11H ;MOVX @DPTR,A ;MOV DPTR,#ACR1 ;MOV A,#22H ;MOVX @DPTR,A ;MOV DPTR,#ACR2 ;MOV A,#33H ;MOVX @DPTR,A ;MOV DPTR,#ACR3 ;MOV A,#43H ;MOVX @DPTR,A ;MOV DPTR,#BTR0 ;总线定时寄存器MOV A,#03H ;MOVX @DPTR,A ;MOV DPTR,#BTR1 ;MOV A,#0FFH ;MOVX @DPTR,A ;MOV DPTR,#OCR ;输出控制寄存器MOV A,#0AAH ;MOVX @DPTR,A ;MOV DPTR,#RBSA ;复位时候改成00hMOV A,#00H ;MOVX @DPTR,A ;MOV DPTR,#TXERR ;发送错误计数寄存器MOV A,#0 ;MOVX @DPTR,A ;MOV DPTR,#ECC ;错误代码捕捉寄存器????????????MOVX A,@DPTR ;MOV DPTR,#MODE ;MOV A,#08H ;单向验收滤波器(32位长)起作用,成功发送时必须应答信号MOVX @DPTR,A ;NOP;NOP;;**************************************************************;接收程序SEARCH:MOV DPTR,#SR ;状态寄存器地址MOVX A,@DPTRANL A,#0C3H ;读取总线关闭位、错误状态位、接收溢出位、有数据等状态位、JNZ PROCJMP SEARCH ;否则的话继续监测PROC:JNB ACC.7,PROCI ;总线不正常BUSERR:MOV DPTR,#IR ;中断寄存器;出现总线关闭MOVX A,@DPTR ;读中断寄存器,清除中断位?????????MOV DPTR,#MODE ;模式寄存器MOV A,#08H ;进入复位模式MOVX @DPTR,A ;将方式寄存器复位请求位清零LCALL ALARM ;调用报警子程序??????????????RETNOPPROCI: MOV DPTR,#IR ;总线正常MOVX A,@DPTR ;读取中断寄存器,清除中断位JNB ACC.3,OTHEROVER:MOV DPTR,#CMR ;数据溢出MOV A,#0CHMOVX @DPTR,A ;在命令寄存器中清除数据溢出和释放接收缓冲区RETNOPOTHER:JB ACC.0,RECE ;IR0=1,接收缓冲区有数据LJMP RECOUT ;否则,退出接收NOPRECE:MOV DPTR,#CANTRXB ;接收缓冲区首地址MOVX A,@DPTR ;读取数据帧信息JNB ACC.6,RDAT A ;RTR=1时为远程请求帧MOV DPTR,#CMRMOV A,#04H ;CMR.2=1,释放接收缓冲区MOVX @DPTR,A ;只有接收了数据才能释放接收缓冲区LCALL TRDAT A ;发送对方请求的数据LJMP RECOUT ;退出接收NOPRDAT A:MOV DPTR,#CANTRXB ;读取并保存接收缓冲区的数据MOV R1,#30H ;数据存储RAM,接收到的数据存储在此MOVX A,@DPTR ;读取数据帧格式字MOV @R1,A ;保存ANL A,#0FH ;截取低四位是数据长度ADD A,#4MOV R6,ARDAT A0: INC DPTRINC R1MOVX A,@DPTRMOV @R1,ADJNZ R6,RDAT A0 ;循环读取与保存MOV DPTR,#CMRMOV A,#04H ;释放接收缓冲区MOVX @DPTR,ARECOUT:MOV DPTR,#ALC ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器MOVX A,@DPTRMOV DPTR,#ECCMOVX A,@DPTRRETALARM:MOV P1,00H ;点灯RET;********************************************************************* END。
proteus仿真51单片机串口双机通讯

51单片机的串口双机通讯一、什么是串口串口是串行发送数据的接口,是相对于并口来说的,是一个广泛的定义。
本期我们说的串口指的是指UART或是RS232。
二、什么是波特率波特率是指串行端口每秒内可以传输的波特位数。
这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位。
一个字节需要8个二进位,如用串口模式1来传输,那么加上起始位和停止位,每个数据字节就要占用10个二进位。
9600bps用模式1传输时,每秒传输的字节数是9600÷10=960个字节,发送一个字节大概需要1ms时间。
三、51单片机串口相关寄存器1、SCON串口控制寄存器(1)SM0和SM1:方式选择寄存器SM0 SM1 工作方式功能波特率0 0 方式0 8位同步移位寄存器晶振频率/ 120 1 方式1 10位UART 可变1 0 方式2 11位UART 晶振频率/32或晶振频率/64 1 1 方式3 11位UART 可变多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。
当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。
(3)REN:允许接收位REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据。
(4)TB8:要发送的第9位数据位在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址。
(5)RB8:接收到的第9位数据位当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到RB8中。
方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。
(6)TI:发送中断标志位方式0中,不用管他。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三双机通信
一、实验目的
1) UART 串行通信接口技术应用
二、实验实现的功能
1) 用两片核心板之间实现串行通信,
2) 将按键信息互发到对方数码管显示并且在本机上用二极管显示按键状态
三、系统硬件设计
其中两机之间的互联如下图所示:
四、系统软件设计
#include <stc10.h>
void Delay(unsigned int n);
void Scan_Key(void);
unsigned char ptr,m,n;
unsigned char tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f };//字型码
unsigned char ppppp[30];
sbit H1=P3^6;sbit H2=P3^7;
void send(void)
{ SBUF=n;
while(!TI);
TI=0;
}
void rece(void)
{
while(RI==0);
RI=0;
ppppp[30]=SBUF;
P1=ppppp[30];
if(ptr==1)
P2=0xfe;
if(ptr==2)
P2=0xfd;
if(ptr==3)
P2=0xfb;
if(ptr==4)
P2=0xf7;
if(ptr==5)
P2=0xef;
if(ptr==6)
P2=0xdf;
}
void main(void)
{ P1M0=0xff;
P1M1=0x00;
TMOD=0x20;
TH1=0xf4;
TL1=0xF4;
SCON=0xd0;
PCON=0x00;
TR1=1;
P1=0x00;
while(1)
{
Scan_Key(); //扫描键盘
send();
rece();
}
}
void Delay(unsigned int n) //延时
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<80;j++);
}
}
void Scan_Key(void) // 键盘扫描程序
{
char i;
bit FLAG0=0; //列扫描初值ptr=0;
H1=0;H2=1;
for(i=0;i<2;i++) //键盘2个扫描列
{
Delay(10);
P0=0xfe;
m=P0;
switch(m) //取行的高4位,检测哪一行有按键被按下
{
case 0xde: ptr=i*3+1; //第一行被按否? 如有则是tab[i*3+1]键
FLAG0=1; //表示有按键
break;
case 0xbe: ptr=i*3+2; //第二行被按否? 如有则是tab[i*3+2]键
FLAG0=1;
break;
case 0x7e: ptr=i*3+3; //第三行被按否? 如有则是tab[i*3+3]键
FLAG0=1;
break;
default: break;
}
if( FLAG0 )
{
n=tab[ptr]; //将键盘编码转换成显示编码
}
H1=1;H2=0;
}
}
五、实验过程中遇到的问题及解决方法
1)起初不明白如何进行键盘扫描?
查阅资料与教材后知道是通过行线逐行输出低电平后检查列线的状态来确定。
具体方法:使第一行输出低电平,第二行输出高电平,如果L1,L2,L3有为低电平的则对应按键按下,否则无按键按下。
再使第二行输出低电平,第一行输出高电平,如果L1,L2, L3有为低电平的则对应按键按下,否则无按键按下。
重复上述操作,便可实现键盘扫描。
2)在开始时键盘扫描只能扫描前三号即第一行的三个键。
经过检查知道是在给H1,H2幅初值时,把其初值放进了行扫描的for循环里边,在扫完第一行后,H1,H2值变化为第二行为低,但是在for循环中又重新将H1,H2变换成初始的第一行为低,所以第二行无法扫描到。
解决办法:将H1,H2的初始化放到for循环外部。
3)由于cpu引脚引脚采用分时复用,这样节省了引脚个数但是在有的时候给端口整体幅值却会影响程序的运行。
在有些端口处采用位地址,直接给位幅值。
如采用sbit H1=P3^6;sbit H2= P3^7;给H1,H2幅值也就给P3^6,P3^7赋值,而不影响别的管脚的变化,从而减少程序的出错概率。
指导老师签字:
日期:。