# 基于Proteus的Arduino与8086串口通信实例 **Repository Path**: pi-minghao/adruino-software-serial ## Basic Information - **Project Name**: 基于Proteus的Arduino与8086串口通信实例 - **Description**: Arduino虚拟串口应用实例项目简介 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-01-03 - **Last Updated**: 2025-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于Proteus的Arduino虚拟串口应用实例介绍 ### 实例介绍 本项目是在Proteus中实现的对Arduino中自带的Software Serial库的一个应用。利用虚拟串口Software Serial,完成Arduino与8086的通信,并最终实现在移动终端的Virtual Front Panel上控制Arduino向8086通信,点亮8086系统中8255接口上连接的LED灯。 ### 压缩包概览 Arduino Software Serial.zip包中,含三个Proteus Project项目文件夹,其名称和作用如下: 1. **arduino software serial** ,此文件夹所含的工程文件是Arduino虚拟串口的例程,实现的功能为:Arduino每隔一段时间通过虚拟串口向Virtual Terminal发送字符串“Hello World”。这个例程是本应用实例的基础,余下的两个工程文件都是在这个例程的基础上修改而来的。 2. **software serial test** ,此文件夹中所包含的工程文件是Arduino VFP虚拟串口的测试程序,实现的功能为:在Virtual Front Panel上添加一个按键。在移动端APPVirtual Front Panel上的每次按键后,Arduino通过虚拟串口向Virtual Terminal发送字符串“hello world”。此测试程序的作用是测试Arduino IoT设计的正确性。 3. **arduino+8086** ,此文件夹中包含实现最终目标的工程文件夹。即,在移动终端的Virtual Front Panel上,每按一次按键,Arduino通过串口向8086发送信息(字符串),8086接收到后Arduino发来的信息后,点亮8086系统中8255接口上连接的LED灯。 ### 各工程详细介绍 #### 1. **Arduino Software Serial** **内容** :此文件夹所含的工程文件是Arduino虚拟串口的例程。其原理图中只包含了Arduino及其外围电路,和Virtual Terminal **作用** : Proteus工程进入运行状态后,无需任何操作,Virtual Terminal就以一定的间隔循环显示“hello world”,如下图所示: ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20192709.png) 关键部分代码如下: ``` #include #define rxPin 8 #define txPin 9 // Set up a new SoftwareSerial object SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); void setup () { peripheral_setup(); // TODO: put your setup code here, to run once: // Define pin modes for TX and RX pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); mySerial.begin(9600); } void loop() { peripheral_loop(); // TODO: put your main code here, to run repeatedly: // Set the baud rate for the SoftwareSerial object mySerial.println("Hello, world?"); delay(1000); } ``` #### 2. **software serial test** **内容** :此文件夹中所包含的工程文件是Arduino VFP虚拟串口的测试程序。这一Proteus工程中,包含了原理与文件和Visual Designer。 **原理图** 中,包含Arduino及其外围电路、Virtual Terminal ,以及ESP8266。 ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20181333.png) **Visual Designer中** 的Virtual Front Panel上有一个hello按键,其作用是控制Arduino的发送。只有按下按键后,Arduino才会发送消息。 ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20181404.png) **作用** :Proteus工程进入运行状态,此时Proteus中同时仿真了电路和移动端APP的Virtual Front Panel,即“移动端APP和硬件都是虚仿”。单击Virtual Front Panel上的hello按键,Virtual Terminal上就显示一个“hello world”,如下图所示: ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20181440.png) 此时,若用移动端APP连接至电脑,则可以用移动端APP的Virtual Front Panel上的按键来实现相同的功能,即“移动端APP真实,硬件虚仿”。 关键部分代码: ``` // Set up a new SoftwareSerial object SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); void setup () { peripheral_setup(); // TODO: put your setup code here, to run once: // Define pin modes for TX and RX pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); mySerial.begin(9600); } void loop() { peripheral_loop(); // TODO: put your main code here, to run repeatedly: // Set the baud rate for the SoftwareSerial object delay(1000); } void IotBtn1_ControlEvent () { // TODO: put your handler code here mySerial.println("Hello, world?"); } ``` #### 3. **arduino+8086** **内容** :此文件夹中包含实现最终目标的工程文件夹。该工程中,包含包含了原理与文件和Visual Designer。 **原理图** 中,包含两个系统: 一个系统是Arduino系统,包含Arduino及其外围电路和ESP8266。 ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20192343.png) 另一个系统是8086系统,包含8086CPU,地址锁存电路,地址译码电路,8251串行接口芯片,8255可编程串行接口芯片及其连接的LED灯。 同时,外加了一个Virtual Terminal,用于验证Arduino是否发送了正确的信息。 ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20192326.png) **Visual Designer** 中的Virtual Front Panel上有一个按键,其作用是控制Arduino的发送。只有按下按键后,Arduino才会向8086发送消息。 **实现思路** :每当在Virtual Front Panel上按下按键,Arduino就通过虚拟串口发送一个字符串(本实例中发送的是字母“Q”),发送后,串行接口芯片8251就会将这个字符存入到缓冲区,待8086读取。8086读取到这个字符后,需根据通信协议判断接收到信息是否正确。若正确,则8086控制8255的PB口输出相应电平,点亮其相应的LED灯(在本实例中,实现的功能是:每当在Virtual Front Panel上按下按键,8255PB口连接的8个LED就循环一位点亮)。 **作用** :Proteus工程进入运行状态,此时Proteus中同时仿真了电路和移动端APP的Virtual Front Panel,即“移动端APP和硬件都是虚仿”,电路中,8255PB口的8个LED灯为全灭状态。单击一次Virtual Front Panel上的“switch”按键,则虚拟终端上显示一个Q,同时8个LED中的第一个点亮。再点一次按键,虚拟终端上再显示一个Q,同时8个LED中的第二个点亮,以此类推,如下图所示: ![输入图片说明](pics/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-01-03%20192533.png) 此时,若用移动端APP连接至电脑,则可以用移动端APP的Virtual Front Panel上的按键来实现相同的功能,即“移动端APP真实,硬件虚仿”。 整体代码: Arduino: ``` /* Main.ino file generated by New Project wizard * * Created: 周五 12月 30 2022 * Processor: Arduino Uno * Compiler: Arduino AVR (Proteus) */ #include #define rxPin 8 #define txPin 9 // Peripheral Configuration Code (do not edit) //---CONFIG_BEGIN--- #pragma GCC push_options #pragma GCC optimize ("Os") #include // Required by cpu #include #include // Required by ESP1:STORAGE #include #include #pragma GCC pop_options // Peripheral Constructors CPU &cpu = Cpu; Vfp8266::Server &ESP1_SERVER = VFP; Vfp8266::FileStore &ESP1_STORAGE = FS; PushButton IotBtn1 = PushButton ("IotBtn1"); void peripheral_setup () { ESP1_SERVER.begin (80); ESP1_STORAGE.begin (); IotBtn1.attachEventHandler(&IotBtn1_ControlEvent); } void peripheral_loop() { ESP1_SERVER.poll (); } //---CONFIG_END--- // Set up a new SoftwareSerial object SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); void setup () { peripheral_setup(); pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); mySerial.begin(9600); } void loop() { peripheral_loop(); } void IotBtn1_ControlEvent () { mySerial.println('Q'); //Transmit a character Q to 8251 } ``` 8086:(编译器使用MASM) ``` ;==================================================================== ; Main.asm file generated by New Project wizard ; ; Created: 周六 12月 31 2022 ; Processor: 8086 ; Compiler: MASM32 ; ; Before starting simulation set Internal Memory Size ; in the 8086 model properties to 0x10000 ;==================================================================== CS8251D EQU 290H ;8251数据端口地址 CS8251C EQU 292H ;8251控制端口地址 P8255B EQU 282H ;8255 B口地址 P8255A EQU 280H ;8255 A口地址 PCON EQU 286H ;8255 控制端口地址 CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE ;8255初始化 START: MOV DX,286H ;8255A的控制口地址 MOV AL,90H ;控制字 OUT DX,AL MOV DX,P8255B MOV AL,00H ;8个灯初始状态为全灭 OUT DX,AL MOV CL,01H ;要点亮的灯的位置 ;8251初始化 COMINIT: XOR AL,AL MOV CX,03 MOV DX,CS8251C OUT1: OUT DX,AL LOOP OUT1 MOV AL,40H OUT DX,AL NOP MOV AL,01001110B MOV DX,CS8251C OUT DX,AL MOV AL,00110111B MOV DX,CS8251C OUT DX,AL ;点灯 WAIT0: MOV DX,CS8251C IN AL,DX TEST AL,2 ;等待8251接收完毕 JZ WAIT0 MOV DX,CS8251D IN AL,DX ;读取接收到的数据 MOV BL,AL CMP BL,'Q' ;判断接收到的字符是否为Q JNZ WAIT0 MOV DX,P8255B MOV AL,CL OUT DX,AL ;点亮一盏灯 ;循环移位 CMP CL,0 JNZ SHIFT INC CL JMP WAIT0 CMP CL,80H JNZ WAIT0 MOV CL,0 JMP WAIT0 SHIFT: SHL CL,1 JMP WAIT0 CODE ENDS END START ```