用单片机普通I_O口模拟串口的一种方法
用单片机普通I/O口实现多机通信的一种新方法

效 ;而 当 S =0时 ,无 论接 收 到的 R 8是 什 么 ,接 M2 B 收都 有效 。
与 查询 方 式不 同 ,采用 中断方 式 时 ,分机 不 必 一
直处 于监 听 状 态 ,而 可以进 行 相应 的数 据 采集 或 控 制
等其 他工 作 。当主机 有通 讯要 求 时 , 可通 过 P . 1 0向各
关 键 词 : 单 片 机 ;多机 通 讯 ;I O 口 /
1 传统 的 多机 通信 方 式
时 ,如果 允许 主 机与 之通 讯 ,则 可 开外 部 中断 及 总 中
断1 ,否 则关 闭 中断 1 。
在 实际 工 业应 用 中 ,经 常 遇到 需要 多 台计 算 机 配 合 才 能完 成 的数 据 采集 与控 制 系统 的任 务 ,而 多 台计 算 机 配 合 主 要 是 通 过 多 台计 算 机 之 间 的通 信来 实 现 的。 为此 必须 将 它们 按实 际需 要 组成 一 定形 式 的 网络 。 多机通 信 网络 通 常有 5 网络 形 式 : 种 星型 、 型 、总线 树 型 、环型 、分 散 型 网络结 构 。它 们 各有 优缺 点 ,其 中
分机 发送 中断请 求 ( 要求 通 讯 )信 号 ;而 从机 在 工作
总线 型 网络结 构 以 可靠性 好 、接 口简单 、组 成灵 活和
这 种 中 断方 法解 决 了分机 盲 目等待 的 问题 ,分 机 也 能立 即 响应 主机 的通讯请 求 ,但 在 某 些应 用场 合 有
相 当的局 限性 。
( ) 当分 机通 信 波特 率要 求 不一 样 时 ; 1 ( ) 主机 ( 分 机 )还 要 通过 串行 口与别 的设 备 2 或 进 行数 据交 换 时 。
如何使用单片机的单个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
模拟的串口协议如下:
起始位 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++) {
普通 MCU 模拟串口发送说明
相关说明:
(1)、模拟 115200 波特率,信号跳变的时间为 8.68uS = 1 / 115200 (2)、模拟 9600 波特率,信号跳变的时间为 104.1uS = 1 / 9600 (3)、串口的波特率越高,所需要的时间越短,相对稳定性越差,建议采用 9600 波特率。 (4)、串口的发射模拟相对比较容易,接收比较困难。下面就串口的 IO 模拟发射做说明 (5)、我们的串口允许的时钟误差最多 3%。所以用户请严格的控制时间误差在这个范围。
IO口模拟串口三种方法

#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLE TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
sbit ACC0= ACC^0;
sbit ACC1= ACC^1;
sbit ACC2= ACC^2;
Delay2cp(35);
//(96-26)/2,循环共
占用26个指令周期
}
while(--temp)
//在指定的
时间内搜寻结束位。
{
Delay2cp(1);
if(RXD)break;
//收到结束位便退出
}
return Output;
}
//延时程序*
void Delay2cp(unsigned char i)
TH0=0xA0;
//预值为256-96=140,十六进制A0
TL0=TH0;
TR0=0; TF0=0; ET0=1; EA=1;
//在发送或接收才开始使用
//允许定时器0中断 //中断允许
总开关
}
//接收一个字符
uchar RByte()
{
uchar Output=0;
uchar i=8;
TR0=1;
//从串口读一个字节
uchar RByte(void)
{
uchar Output=0;
uchar i=8;
uchar temp=RDDYN;
//发送8位数据位
Delay2cp(RDDYN*1.5);
//此处注意,等过起始位
while(i--)
{
Output >>=1;
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; //定义一个位操作变量sbit SBUF1_bit0 = SBUF1^0;sbit SBUF1_bit1 = SBUF1^1;sbit SBUF1_bit2 = SBUF1^2;sbit SBUF1_bit3 = SBUF1^3;sbit SBUF1_bit4 = SBUF1^4;sbit SBUF1_bit5 = SBUF1^5;sbit SBUF1_bit6 = SBUF1^6;sbit SBUF1_bit7 = SBUF1^7;void delay_bps() {unsigned char i; for (i = 0; i < 29; i++); _nop_();_nop_();} //波特率9600 模拟一个9600波特率unsigned char getchar2() //模拟接收一个字节数据{while (RXD1);_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();delay_bps();SBUF1_bit0 = RXD1; //0delay_bps();SBUF1_bit1 = RXD1; //1delay_bps();SBUF1_bit2 = RXD1; //2delay_bps();SBUF1_bit3 = RXD1; //3delay_bps();SBUF1_bit4 = RXD1; //4delay_bps();SBUF1_bit5 = RXD1; //5delay_bps();SBUF1_bit6 = RXD1; //6delay_bps();SBUF1_bit7 = RXD1; //7delay_bps();return(SBUF1) ; //返回读取的数据}void putchar2(unsigned char input) //模拟发送一个字节数据{SBUF1 = input;TXD1 = 0; //起始位delay_bps();TXD1 = SBUF1_bit0; //0delay_bps();TXD1 = SBUF1_bit1; //1delay_bps();TXD1 = SBUF1_bit2; //2delay_bps();TXD1 = SBUF1_bit3; //3delay_bps();TXD1 = SBUF1_bit4; //4delay_bps();TXD1 = SBUF1_bit5; //5delay_bps();TXD1 = SBUF1_bit6; //6delay_bps();TXD1 = SBUF1_bit7; //7delay_bps();TXD1 = 1; //停止位delay_bps();}3、实现串行通讯。
51单片机模拟串口的三种方法

//先传低位
} //查询计数器溢出标志位 void WaitTF0( void ) { while(!TF0); TF0=0; } 接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和 都很准确,另外不需要计算每条语句的指令周期数。 方法三:中断法
中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户 在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程 断进行初始化,同时编写中断程序。本程序使用Timer0中断。 #define TM0_FLAG P1_2 //设传输标志位 //计数器及中断初始化 void S2INI(void) { TMOD =0x02; //计数器0,方式2 TH0=0xA0; //预值为256-96=140,十六进制A0 TL0=TH0; TR0=0; //在发送或 接收才开始使用 TF0=0; ET0=1; //允许定时
//发送启始
位 Delay2cp(39); //发送8位数据位 while(i--) { TXD=(bit)(input&0x01); Delay2cp(36); input=input>>1; } //发送校验位(无) TXD=(bit)1; 位 Delay2cp(46); } //从串口读一个字节 uchar RByte(void) { uchar Output=0; uchar i=8; uchar temp=RDDYN; //发送8位数据位 Delay2cp(RDDYN*1.5); while(i--) { Output >>=1; if(RXD) Output Delay2cp(35); 占用26个指令周期 } while(--temp) 时间内搜寻结束位。 { Delay2cp(1); if(RXD)break; } return Output;
模拟串口的实现单片机IO口

TR0=1;
TF0=0;
}
void WByte(uchar input)//send function
{
uchar i=8;
TR0=1;
TXD1=0;//begin bit
WaitTF0();
//send the Byte
while(i--)
{
TXD1=input&0x01;//send Byte from low bit to highbit
模拟串口的实现单片机IO口
用EBOX向我们的电力线调试模块发数据,但是要有一个控制接口,但是
EBOX没有提供,所有只好用MCU来做伺服器。一般的单片机都只有一个串
口,所以必须模拟一个出来。
/*
sbit TXD1=P1;//definep14 as theanalogtransmit port
sbit RXD1= P1 ;//definep12 as theanalog recieve port
i=i;
i=i;
i=i;
i=i;
i=i;
i=i;
i=i;
TR0=1;//计数器开始工作
WaitTF0();
while(i--)//接收8位数据位
{
Output>>=1;
if(RXD1)Output=Output|0x80;//recieve from the highbit tolow bit
WaitTF0();
WaitTF0();
input=input>>1;//rightshift
}
TXD1=1;//stop bit
WaitTF0();
TR0=0;//stop thecounter
单片机中的模拟输入输出接口设计与应用

单片机中的模拟输入输出接口设计与应用概述单片机是一种集成了处理器、存储器和各种外设功能的集成电路,广泛应用于嵌入式系统中。
在实际应用中,模拟输入输出(Analog Input/Output,简称为AI/AO)是单片机常用的功能之一。
模拟输入输出接口用于将模拟信号转换为数字信号或将数字信号转换为模拟信号,从而实现单片机与外部模拟设备的互联。
本文将介绍单片机中的模拟输入输出接口的设计与应用。
一、模拟输入输出的作用与特点1. 作用:模拟输入输出接口可将模拟量与单片机进行连接,实现模拟量信号的输入和输出,为系统提供更精确的数据。
2. 特点:- 模拟输入输出接口可以实现模拟信号与数字信号之间的转换。
- 模拟输入输出接口通常采用模数转换器(ADC)和数模转换器(DAC)实现模拟信号的采样和重构。
- 模拟输入输出接口的精度和分辨率直接影响系统的测量和控制精度。
二、模拟输入与数字输出接口的设计与应用1. 模拟输入接口设计与应用模拟输入接口常使用模数转换器(ADC)实现。
ADC将外部模拟信号转换为相应的数字信号,单片机可以通过读取数字信号来获取模拟输入量的值。
以下是模拟输入接口的设计与应用步骤:(1)选择合适的ADC型号:根据系统需求,选择合适的ADC型号。
选型时要考虑采样率、分辨率、电平范围和功耗等因素。
(2)接线:将模拟信号与ADC输入引脚相连。
通常,需要使用模拟信号调理电路(如信号调理电路和滤波器)来满足输入要求。
(3)配置寄存器:根据单片机的技术手册,配置ADC寄存器,设置采样频率、参考电压、输入通道等参数。
(4)采样和转换:通过编程,触发ADC进行采样和转换。
读取ADC结果寄存器,获取模拟输入量的数值。
(5)数据处理与应用:根据需要,对获取的模拟输入量进行进一步处理,如信号滤波、数据补偿等。
可以将模拟输入量用于系统的测量、控制、报警等功能。
2. 数字输入与模拟输出接口的设计与应用数字输入与模拟输出接口通常使用数模转换器(DAC)来实现。
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 intextern 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总线,准备发送或接收数据 */Delay1us(2);}/************************************************************** *****结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*************************************************************** *****/void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/Delay1us(1); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4us*/Delay1us(5);SDA=1; /*发送I2C总线结束信号*/Delay1us(4);}/*******************************************************************字节数据发送函数函数原型: void SendByte(uchar c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
- 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所示。
编程时,发送程序生成欲与之通信的从机地址编号,接收程序接收到地址编码后,与本机地址比较,若相同,则准备接收数据;若不同,则跳出中断服务程序。