用单片机普通I_O口模拟串口的一种方法
用单片机普通I/O口实现多机通信的一种新方法
《 现代 电子 技 术 》 0 2年 第 1 20 O期 总第 1 1期 4
收稿 日期 :2 0 — 7 2 02 0 — 0
用单 片机 普通 IO 口实现 多机通信 的一种新 方法 /
A Ne t o fMut C mp trC mmu iain Us gM ir p o es rSI O o t w Meh d o l o ue o i nc t i c o r cso / P r o n
分机 发送 中断请 求 ( 要求 通 讯 )信 号 ;而 从机 在 工作
以上介 绍 的方 法就 难 以实 现 。这 是 因为 :不 管 是
控制 简单 等 优势 ,在实 际应 用 中使 用最 多 。
总线 型 网络 结 构 中主机 与分 机进 行 串行 通 信 可 以 利用 查询 方式 或 中断方 式 。用查 询 方式 工作 时 ,所 有
主机还 是从 机 它们 的 串行 口已被使 用 ,跟远 程计 算 机 或 串行设 备 进行 通 信 已没有 串 口用 。下 面介 绍 的方 法
总线 型 网络结 构 以 可靠性 好 、接 口简单 、组 成灵 活和
这 种 中 断方 法解 决 了分机 盲 目等待 的 问题 ,分 机 也 能立 即 响应 主机 的通讯请 求 ,但 在 某 些应 用场 合 有
相 当的局 限性 。
如何使用单片机的单个IO口模拟串口UART输出
IO_UART_TX_H(); } else {
IO_UART_TX_L(); asm("l.nop");//延时一个机器周期 } delay_one_bit_tx(); } IO_UART_TX_H();//发送结束位 delay_one_bit_tx(); }
1
百度文库
V1.0
普通 MCU 模拟串口发送说明
相关说明:
(1)、模拟 115200 波特率,信号跳变的时间为 8.68uS = 1 / 115200 (2)、模拟 9600 波特率,信号跳变的时间为 104.1uS = 1 / 9600 (3)、串口的波特率越高,所需要的时间越短,相对稳定性越差,建议采用 9600 波特率。 (4)、串口的发射模拟相对比较容易,接收比较困难。下面就串口的 IO 模拟发射做说明 (5)、我们的串口允许的时钟误差最多 3%。所以用户请严格的控制时间误差在这个范围。
模拟的串口协议如下:
起始位 1 位 数据位 8 位 停止位 1 位 校验位 无
参考的代码如下:
void io_uart_send_byte(unsigned char dat) {
Unsigned char i ; IO_UART_TX_L();//拉低作为起始 delay_one_bit_tx();//按照需要的波特率来延时 for(i = 0 ; i< 8 ; i++) {
基于单片机I/O口模拟的SPI串行通信实现
基于单片机I/O口模拟的SPI串行通信实现
【摘要】基于单片机或ARM芯片的普通I/O口,模拟实现SPI串行通信。模拟SPI通信需严格时钟时序,只有当主器件模拟的SPI时序与从器件的SPI时序完全一致时,才能实现SPI通信的正常数据交换。
【关键词】I/O口;SPI时序;主器件;从器件
1.引言
SPI(SeIial Peripheral Interfa即串行外围设备接口)总线技术是一种高效率的串行接口技术,主要用于扩展外设和进行数据交换。在许多单片机中,已经作为一种标准配置。但某些应用非常广泛的单片机并不带标准SPI接口,这样就限制了在这些系统中使用带SPI接口的器件。解决该问题的方法是使用单片机的普通I/O口通过软件模拟的方式实现SPI串口通信,以满足应用需求。此外,采用标准的SPI接口有很多局限性,在设备外围开发和扩展增加负担,而通过I/O口模拟实现SPI通信将不受这些限制,可轻松实现其外围开发和扩展,灵活性更大;通过I/O口模拟SPI通信,其通用性和可移植性强,实现简单、方便。
2.SPI总线概述
SPI通信的总线形式一般采用4线制,即为使能控制线SN、始终控制线SCLK、主出从入线MOSI和主入从出线MISO。可实现一个主控制器挂接多个从控制器,如图1所示,为SPI总线框图。
使能控制线SN完成对从控制器的片选,当需要与某个控制通信时,将SN 置于打开(高或者低,根据不同芯片分别对待)状态,使从控制器处于可通信状态,同时时钟控制线SCLK用于控制SPI通信的时序,该时序需与从控制器的SPI时序保持完全一致,这样才能保证SPI通信的实现。主出从入线MOSI为SPI 串口通信数据输出线,主入从出线MISO为SPI串口通信数据输入线。
51单片机GPIO口模拟串口通信
51单片机GPIO口模拟串口通信
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种
应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动
上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,
这就要求单片机具有双串口的功能,但我们知道一般的51 系列只提供一个串
口,那么另一个串口只能靠程序模拟。本文所说的模拟串口,就是利用51
的两个输入输出引脚P1.0 和P1.1,置1 或0 分别代表高低电平,也就是串口通
信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置
1,各种数据位和校验位则根据情况置1 或置0。
以11.0592MHz 的晶振为例,通过定时计数器0 产生中断信号来模拟串口电
平,下面附上具体源代码。
[cpp]view plaincopy/*Fuction:使用51 单片机GPIO 口模拟串口通信,通过定
时计数器0 来产生中断信号
SoftwareDesigner:Jason*/#includesbitP1_0=P1;sbitP1_1=P1;#de fine RXD P1_0#de fineTXDP1_1unsignedcharflag;voidinit();voidsend_byte(unsignedchar);unsignedchar rec_byte();voidwait_int();//将从PC 机串口接收到的数据原封不动回传给PC 机voidmain(){unsignedchartemp;init();while(1){if(RI==1){RI=0;temp=rec_byte();send
IO口模拟串口三种方法
//从串口读一个字节
uchar RByte(void)
{
uchar Output=0;
uchar i=8;
uchar temp=RDDYN;
//发送8位数据位
Delay2cp(RDDYN*1.5);
//此处注意,等过起始位
while(i--)
{
Output >>=1;
if(RXD) Output =0x80; //先收低位
sbit P1_2 = 0x92;
#define RXD P1_0
#define TXD P1_1
#define WRDYN 44 //写延时
#define RDDYN 43 //读延时
//往串口写一个字节
void WByte(uchar input)
{
uchar i=8;
TXD=(bit)0;
//发送启始
//计数器初始化
void S2INI(void)
{
TMOD =0x02;
//计数器0,方式2
TH0=0xA0;
//预值为256-96=140,十六进制A0
TL0=TH0;
TR0=1;
//开始计数
TF0=0;
}
void WByte(uchar input)
{
//发送启始位
uchar i=8;
STC单片机模拟串口程序
STC单片机模拟串口程序
/*************stc12模拟串口程序*************/
/*功能:用单片机的任意I/O引脚模拟串口的TXB/RXB*/
/*适于STC1T系列单片机,波特率默认为9600晶振11.0592工作于1T模式,请根据实际需要直接使用或修改*/
/*未使用任何软件延时,仅占用了T0及其中断,和纯硬件串口效果完全相同,对其他程序执行无影响*/
/*示例功能为根据变量nSel的值选择1个字符串数组,并在条件满足时逐字节逐位由模拟串口引脚TXB发送,全部字符发完后置位TSEND 标志*/
/*发送同时以全双工方式接收数据,收到的字节按顺序循环存入Rbuf[16]中*/
/*以语音合成芯片SYN6658的命令格式为例,从3段合成文本中任选1段播放*/
/*数组选择变量nSel的值为1播放第1段,2播放第2段...,0不播放(nSel值的获取方法请根据具体需要添加相应程序段)*/ /*该程序已通过实际调试,误码率为0*/
/*该程序参考了STC单片机用户手册中的模拟串口程序*/
/***********作者:ltiaobao,2013.08***********/
#include "reg51.h"
#include
/*define baudrate const*/
/*BAUD=65536-SYSclk/3/baudrate/M(1T:M=1,12T:M=12)*/ //#defineBAUDOxF400//******************(1T)
#defineBAUD0xFE90//******************(1T)
IO口模拟UART串口通信
IO口模拟UART串口通信
为了让大家充分理解UART串口通信的原理,我们先用P3.0和P3.1这两个当做IO口来开展模拟实际串口通信的过程,原理搞懂后,我们再使用存放器配置实现串口通信过程。
对于UART串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200、128000、256000等速率。IO口模拟UART串行通信程序是一个简单的演示程序,我们使用串口调试助手下发一个数据,数据加1后,再自动返回。串口调试助手,在我们开展全板子测试视频的时候,大家已经见过,这里我们直接使用STC-ISP软件自带的串口调试助手,先把串口调试助手使用给大家说一下,如图1所示。第一步要选择串口助手菜单,第二步选择十六进制显示,第三步选择十六进制发送,第四步选择COM口,这个COM口要和自己电脑设备管理器里的那个COM口一致,波特率是我们程序设定好的选择,我们程序中让一个数据位持续时间是1/9600秒,那这个地方选择波特率就是选9600,校验位选N,数据位8,结束位1。
图1串口调试助手示意图
串口调试助手的实质就是我们利用电脑上的UART通信接口,通过这个UART接口发送数据给我们的单片机,也可以把我们的单片机发送的数据接收到这个调试助手界面上。
因为初次接触通信方面的技术,所以我对这个程序开展
一下解释,大家可以边看我的解释边看程序,把底层原理先彻底弄懂。
变量定义部分就不用说了,直接看main主函数。首先是对通信的波特率的设定,在这里我们配置的波特率是9600,那么串口调试助手也得是9600。配置波特率的时候,我们用的是定时器0的模式2。模式2中,不再是TH0代表高8位,TL0代表低8位了,而只有TL0在开展计数了。当TL0溢出后,不仅仅会让TF0变1,而且还会将TH0中的内容重新自动装到TL0中。这样有一个好处,我们可以把我们想要的定时器初值提前存在TH0中,当TL0溢出后,TH0自动把初值就重新送入TL0了,全自动的,不需要程序上再给TL0重新赋值了,配置方式很简单,大家可以自己看下程序并且计算一下初值。
单片机实验一I/O端口实验报告参考模板
单片机原理与接口技术实验
实验一 I/O端口实验(2)
系别:通信工程系
专业:通信工程系11级
学号:233201122041
姓名:
实验时间:2014年3月6日
撰写日期:2014年3月9日
实验一 I/O端口实验(2)
一、实验目的
1、掌握单片机通用I/O端口的使用方法;
2、掌握I/O端口数据输入/输出的方法。
二、实验内容(与本次实验报告标题括号中的数字对应)
2、当开关状态为0101(K5K6K7K8)时,四个灯循环右移;当开关状态为1010(K5K6K7K8)时,四个灯循环左移;当开关为其它状态时,在LED1~LED4上显示开关状态。程序运行时,拨动开关,显示立即跟着变化。【基础,周四下午每人做】
三、实验设计思路
对于该题,因为有3种情况,所以参考课本P68程序,在while循环结构内添加if-else条件判断语句,分别区分右移、左移、与开关状态一致3种情况。
四、电路原理图及接线说明
绘制本次实验用到的部分完整电路原理图如下:
开关K5K6K7K8与P2.0~P2.3相连线;
LED:1~8和P1.0~P1.7相连线。
五、实验流程图
见下图:
六、调试过程及实验现象
对于第该题,一开始运行灯全亮,经按F8逐步调试后,发现P2的值怎么也无法赋给变量b,导致无论如何拨动开关,b的值都不会改变,一直等于FF,使灯全亮。后来经助教指点方知是P2口没有设置为I/O模式,以致于无法将P2的值传输给b。修改设置后,一切运行正常。
七、总结
本次实验的实验难度不大,第一题参考课本的8位左移右移例子稍作修改
便可运行,因为实验原理一样;
51单片机IO口模拟串口
论坛新老朋友们。祝大家新年快乐。在新的一年开始的时候,给大家一点小小的玩意。工程师经常碰到需要多个串口通信的时候,而低端单片机大多只有一个串行口,甚至没有串口。这时候无论是选择高端芯片,还是更改系统设计都是比较麻烦的事。我把以前搞的用普通I/O口模拟串行口通讯的程序拿出来,供大家参考,希望各位兄弟轻点拍砖。基本原理:我们模拟的是串行口方式1.就是最普通的方式。一个起始位、8个数据位、一个停止位。模拟串行口最关键的就是要计算出每个位的时间。以波特率9600为例,每秒发9600个位,每个位就是1/9600秒,约104个微秒。我们需要做一个精确的延时,延时时间+对IO口置位的时间=104微秒。起始位是低状态,再延时一个位的时间。停止位是高状态,也是一个位的时间。数据位是8个位,发送时低位先发出去,接收时先接低位。了解这些以后,做个IO 模拟串口的程序,就是很容易的事。我们开始。先上简单原理图:就一个MAX232芯片,没什么好说的,一看就明白。使用单片机普通I/O口,232数据输入端使用51单片机P3.2口(外部中断1口,接到普通口上也可以,模拟中断方式的串行口会有用。呵呵)。数据输出为P0.4(随便哪个口都行)。
下面这个程序,您只需吧P0.4 和P3.2 当成串口直接使用即可,经过测试完全没有问题. 2、底层函数代码如下:
sbit TXD1 = P0^4; //定义模拟输出脚
sbit RXD1 = P3^2; //定义模拟输入脚
bdata unsigned char SBUF1; //定义一个位操作变量
51单片机模拟串口的三种方法
51单片机模拟串口的三种方法
单片机模拟串口是指通过软件实现的一种串口通信方式,主要应用于一些资源有限的场合,如单片机中没有硬件UART模块的情况下。下面将介绍三种常用的单片机模拟串口的方法。
1.轮询法
轮询法是最简单的一种模拟串口方法,其原理是通过轮询方式不断查询接收和发送的数据。在接收数据时,单片机通过忙等待的方式查询接收端是否有数据到达,并且处理数据。在发送数据时,单片机通过检查发送端是否空闲,然后发送数据。
这种方法的优点是实现简单,占用资源少。缺点是轮询过程可能会浪费一定的时间,同时由于忙等待可能会占用CPU资源,影响其他任务的执行。
2.中断法
中断法是一种基于中断机制实现的模拟串口方法,其原理是通过外部中断或定时器中断触发,单片机响应中断并进行串口数据的接收和发送。
在接收数据时,单片机通过外部中断或定时器中断来检测串口接收中断,并处理接收到的数据;在发送数据时,单片机通过定时器中断来定时发送数据。
这种方法的优点是能够及时响应串口的数据接收和发送,不会浪费过多的时间。缺点是中断处理可能会占用一定的CPU资源,同时中断嵌套可能会引起一些问题。
3.环形缓冲法
环形缓冲法是一种基于环形缓冲区的模拟串口方法,其原理是通过环形缓冲区来缓存接收和发送的数据。
在接收数据时,单片机将串口接收到的数据放入环形缓冲区,并使用指针指示当前读取位置和写入位置,然后通过轮询或中断方式从缓冲区中读取数据并进行处理;在发送数据时,单片机将要发送的数据放入环形缓冲区,并通过轮询或中断方式从缓冲区中读取数据并发送。
STC51单片机普通IO口模拟IIC(I2C)接口通讯的程序代码
STC51单片机普通IO口模拟IIC(I2C)接口通讯的程序代码STC 51单片机普通IO口模拟IIC(I2C)接口通讯的程序代码
原文:
(改自周立功软件包)
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
extern void Delay1us(unsigned char );
sbit SDA=P1^6; /*模拟I2C数据传送位*/
sbit SCL=P1^7; /*模拟I2C时钟控制位*/
bit ack; /*应答标志位*/
/************************************************************** *****
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
*************************************************************** *****/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
Delay1us(1);
SCL=1;
Delay1us(5); /*起始条件建立时间大于4.7us,延时*/
SDA=0; /*发送起始信号*/
Delay1us(5); /* 起始条件锁定时间大于4μs*/
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
单片机IO口模拟串口程序发送接收
单片机I O口模拟串口
程序发送接收
Corporation standardization office #QS8QHH-HHGX8Q8-GNHHJ8
/*************************************************************** * 在单片机上模拟了一个串口,使用P2.1作为发送端
* 把单片机中存放的数据通过P2.1作为串口TXD发送出去
***************************************************************/ #include
#include
#include
typedef unsigned char uchar;
int i;
uchar code info[] =
{
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 0x55
};
sbit newTXD = P2^1;//模拟串口的发送端设为P2.1
void UartInit()
{
SCON = 0x50; // SCON: serail mode 1, 8-bit UART
TMOD |= 0x21; // T0工作在方式1,十六位定时
PCON |= 0x80; // SMOD=1;
TH0 = 0xFE; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=11.0592MHz
TL0 = 0x7F; // 定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bps fosc=11.0592MHz
模拟串口的三种方法及C语言
模拟串口的三种方法及C语言
模拟串口是软件中模拟实现串口通信的一种方法,它是在电脑上通过
软件模拟两个串口之间的传输,用来测试、调试串口相关的应用程序。本
文将介绍三种常见的模拟串口的方法,并提供C语言代码示例。
1.使用虚拟串口软件
虚拟串口软件是一种用于模拟串口通信的应用程序。它创建了虚拟的
串口设备,使其在电脑上模拟出真实的串口通信环境。通过虚拟串口软件,可以实现串口的模拟收发数据,可以连接到串口测试工具、串口调试工具
或者自己编写的串口通信程序上。
以下是一个使用虚拟串口软件模拟串口通信的C语言代码示例:
```c
#include <stdio.h>
#include <windows.h>
int mai
//打开虚拟串口
//检测串口是否成功打开
printf("Error in opening serial port\n");
return 1;
}
//进行串口通信操作,如发送、接收数据
//关闭串口
return 0;
```
在这个示例中,我们使用了Windows操作系统的函数`CreateFile`来打开一个虚拟串口,这里的串口名称是"COM1"。然后可以调用相关函数进行串口通信操作,最后用`CloseHandle`函数关闭串口。
2.使用串口驱动模拟
在一些情况下,可以通过修改电脑的串口驱动程序来模拟串口通信。这种方法需要更深入的了解操作系统的底层机制,并进行驱动程序的开发和修改。通过修改串口驱动程序,可以模拟出一个虚拟的串口设备,通过这个设备进行串口通信。
以下是一个简单的C语言代码示例,用于修改串口驱动程序来模拟串口通信:
单片机IO口模拟串口程序(发送+接收)
单片机IO口模拟串口程序(发送+接收)
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。
程序硬件平台:11.0592M晶振,STC单片机(兼容51)
/************************************** *************************
* 在单片机上模拟了一个串口,使用P2.1作为发送端
* 把单片机中存放的数据通过P2.1作为串口TXD发送出去
*************************************** ************************/
#include <reg51.h>
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar;
int i;
uchar code info[] =
{
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5 5,0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
sbit newTXD = P2^1;//模拟串口的发送端设为P2.1
void UartInit()
{
SCON = 0x50; // SCON: serail mode 1, 8-bit UART
TMOD |= 0x21; // T0工作在方式1,十六位定时
单片机虚拟串口的使用方法
单片机虚拟串口的使用方法
单片机的虚拟串口是一种非常常见的通信方式,它利用串口模拟的方式来进行数据的传输。虚拟串口能够让单片机和计算机之间实现数据的传输和通讯,从而方便了开发者的开发工作,更好地实现了单片机与计算机的互联互通。
虚拟串口的使用方法如下:
1. 确定虚拟串口的通信参数
在使用虚拟串口前,首先要确认好虚拟串口的通信参数。一般来说,包括波特率、数据位、停止位、奇偶校验等参数。这些参数需要与单片机的串口通信参数相对应,否则通信将会失败。
2. 安装虚拟串口驱动程序
在计算机上进行单片机项目的开发时,需要先安装对应的虚拟串口驱动程序。常用的虚拟串口驱动程序有VirtualSerialDriver、FTDI等。在安装驱动程序时,需要根据计算机的操作系统版本,选择对应的驱动程序版本。
3. 编写单片机程序
在单片机中涉及到虚拟串口的程序中,需要先初始化串口通信参数,并打开串口,然后循环等待从串口接收到的数据。在循环中,可以使用串口发送数据给计算机,或者从计算机接收数据。
4. 在计算机上打开虚拟串口设备
在单片机程序中设置好虚拟串口的通信参数后,需要在计算机上打开虚拟串口设备。在计算机的设备管理器中,能够看到已经成功安装的虚拟串口设备。打开对应的串口,设置对应的通信参数即可。
5. 测试通信
在单片机和计算机之间建立虚拟串口连接后,需要进行测试,确保串口通信正常。可以先从单片机发送数据给计算机,观察是否能够在计算机上接收到数据;然后,可以在计算机上发送数据给单片机,观察单片机是否能够接收到数据。如果测试结果正确,就可以通过这个虚拟串口通讯了。
52单片机实用的IO模拟串行口C语言源程序
52单片机实用的IO模拟串行口C语言源程序
作者:21IC suda
用途:短距离、波特率要求不高、环境干扰不大的场合
特点:
程序简练、实用、移植方便
占用定时器T2
只消耗约600字节的ROM
有详细的注释
参数:
晶振:22.1184MHz
波特率:1200
起始位:1
数据位:8
校验位:无
停止位:1
*/
#include
//将T2定时器的自动重装寄存器定义成16位SFR,以方便访问
sfr16 RCAP2 = 0xCA;
//修改如下定义将方便程序移植
sbit RXD_pin = P3^0; //定义接收引脚
sbit TXD_pin = P3^1; //定义发送引脚
#define MAIN_CLK 22118400L //定义主频
#define BAUD_RA TE 1200L //定义波特率(数值不能太高,因为要给T2中断服务程序留足执行时间)
#define HITS 8 //定义采样率(应当是偶数;减少采样率能提高波特率,但为保证可靠工作,最小不能少于6次)
#define RXD_BUF_LEN 32 //定义接收缓冲区大小
volatile unsigned char RXD_buf[RXD_BUF_LEN]; //定义接收缓冲区(循环队列)
volatile unsigned char RXD_p1; //指向缓冲区,由中断程序自动修改
volatile unsigned char RXD_p2; //指向缓冲区,由主程序修改
#define TXD_BUF_LEN 32 //定义发送缓冲区大小
volatile unsigned char TXD_buf[TXD_BUF_LEN]; //定义发送缓冲区(循环队列)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子报/2005年/12月/18日/第011版
单片机应用
用单片机普通I/O口模拟串口的一种方法
南昌李春玲
MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD (P3.0)和TXD(P3.1)与外设进行全双工的串行异步通信。串行端口有四种基本工作方式:方式0主要用于外接移位寄存器,以扩展单片机的I/O接口;方式1多用于双机之间或与外设的通信;方式2、方式3除有方式1的功能外,还可用作主从式多机通信,构成分布式多机系统。
在应用系统中,若需要多个串口,且各串口工作方式要求不同,如:通信波特率不一样,通常的方法是扩展一片可编程串行接口芯片,如8251或8250,但这样增加了硬件开销,且需要占用较多的I/O资源。本文介绍一种用单片机普通I/O口模拟串口的方法。
以A、B两个单片机之间的串行通信为例,电路如图1所示。使用了P1口中的3条普通I/O口,其中P1.0为串行发送端(模拟TXD),P1.1为串行接收端(模拟RXD),P1.2作为对方单片机的中断申请信号INTO的输入线(模拟内部串行口中断源RI/TI)。
串行通信信息帧的发送与接收由软件编程实现。工作过程如下(以A机发送、B机接收为例):
1.A机从P1.2口输出中断申请信号。
2.A机通过P1.0口发送一帧模拟信息。串行通信采用异步传送格式:包括1位起始位(低电平)、7或8位数据编码、1位奇偶校验位(可不要)、1位停止位(高电平)。串行通信中,如果数据传送的波特率为1200bps,则每位信息维持时间为0.833ms。
程序段TTXD完成上述发送功能。信息帧为10位(1位起始位、8位数据编码、无奇偶校验位、1位停止位)。
3.B机接收到INTO的中断申请信号后,自动进入中断服务程序,同步进行模拟异步接收。当P1.1口从高变低时,说明一帧开始,然后依次接收8位数据编码,采样数据在每一位的中间进行,故接收与发送要错开半位,最后检测到高电平后,跳出中断。一次中断完成一帧信息的接收,获得一个字节的数据。
INTO的中断服务程序段RRXD完成上述接收功能。
程序清单如下:
TTXD:MOV A,#DATA;发送字节送A
CLR P1.2;送中断申请信号
SETB P1.0
LCALL DELAY417
CLR P1.0
LCALL DELAY417
LCALL DELAY417
;模拟1位起始位
MOV R3,#8
OUT:RRC A
MOV P1.0,C;发送1位数据
LCALL DELAY417
LCALL DELAY417
;维持0.833ms
DJNZ R3,OUT;发送下一位数据
SETB P1.0
LCALL DELAY417
LCALL DELAY417;模拟停止位
SETB P1.2;“1”送P1.2
RET
RRXD:SETB P1.1
JB P1.1,$;检测起始位
MOV R3,#8
LCALL DELAY417;错开半位
IN:LCALL DELAY417
LCALL DELAY417
MOV C,P1.1;接收采样数据
RRC A;移入A中
DJNZ R3,IN;接收下一位
JNB P1.1,$;检测停止位
RETI
若单片机使用12MHz的晶振,延时约417μs的程序为:
DELAY417:MOV R5,#205
XH:DJNZ R5,XH
RET
使用该方式亦可实现主从式多机通信。模拟单片机串口方式2和方式3所构成的主从式多机通信电路如图2所示。编程时,发送程序生成欲与之通信的从机地址编号,接收程序接收到地址编码后,与本机地址比较,若相同,则准备接收数据;若不同,则跳出中断服务程序。