单片机串口通信实验(精选8篇)
开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。void start()// 开始位 { SDA = 1;
//SDA初始化为高电平“1”
SCL = 1;
//开始数据传送时,要求SCL为高电平“1”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SDA = 0;
//SDA的下降沿被认为是开始信号
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)} 结束信号:SCL为高电平,SDA由低电平向高电平跳变,结束传送数据。void stop()// 停止位 { SDA = 0;
//SDA初始化为低电平“0”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 1;
//结束数据传送时,要求SCL为高电平“1”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SDA = 1;
//SDA的上升沿被认为是结束信号 }
2,数据格式(数据输入)
在IIC总线开始信号后,送出的第一个字节数据是用来选择器件地址和数据方向的,其格式为
从器件收到地址型号后与自己的地址比较,一致则此器件就是主器件要找的器件,并返回ACK(不管是写数据还是地址都会返回)。IIC传送数据时SCL为低电平时SDA可改变高低电平,SCL转跳为高时数据输入(此时SDA不能跳变),发送数据:bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;
//储存应答位
for(i = 0;i < 8;i++)// 循环移入8个位
{
SDA =(bit)(y&0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
_nop_();
//等待一个机器周期
SCL = 1;
//在SCL的上升沿将数据写入AT24Cxx
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 0;
//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
y <<= 1;
//将y中的各二进位向左移一位
} SDA = 1;
// 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(AT24Cxx)控制
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 1;
//根据上述规定,SCL应为高电平
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
ack_bit = SDA;//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
//若送高电平,表示没有接收到,传送异常
SCL = 0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
return ack_bit;
// 返回AT24Cxx应答位 } 读数据:unsigned char ReadData()// 从AT24Cxx移入数据到MCU { unsigned char i;unsigned char x;
//储存从AT24Cxx中读出的数据
for(i = 0;i < 8;i++){
SCL = 1;
//SCL置为高电平
x<<=1;
//将x中的各二进位向左移一位
x|=(unsigned char)SDA;//将SDA上的数据通过按位“或“运算存入x中
SCL = 0;
//在SCL的下降沿读出数据
} return(x);
//将读取的数据返回 } 发送数据步骤:
oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent { start();
//开始数据传递
WriteCurrent(OP_WRITE);//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(add);
//写入指定地址
WriteCurrent(dat);
//向当前地址(上面指定的地址)写入数据
stop();
//停止数据传递
delaynms(4);
//1个字节的写入周期为1ms, 最好延时1ms以上 } 读数据步骤:
/*************************************************** 函数功能:从AT24Cxx中的当前地址读取数据 出口参数:x(储存读出的数据)
***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();
//开始数据传递
WriteCurrent(OP_READ);
//选择要操作的AT24Cxx芯片,并告知要读其数据
x=ReadData();
//将读取的数据存入x stop();
//停止数据传递
return x;
//返回读取的数据 } /*************************************************** 函数功能:从AT24Cxx中的指定地址读取数据 入口参数:set_add 出口参数:x
***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址读取 { start();
//开始数据传递
WriteCurrent(OP_WRITE);
//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(set_add);
//写入指定地址
return(ReadCurrent());
//从指定地址读出数据并返回 }
单总线协议————数据传输低位在前——p237 1,初始化单总线器件
初始化时序程序:
函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag
***************************************************/ bit Init_DS18B20(void){ bit flag;
//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1;
//先将数据线拉高
for(time=0;time<2;time++)//略微延时约6微秒
;DQ = 0;
//再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒
;
//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1;
//释放数据线(将数据线拉高)
for(time=0;time<10;time++)
;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;
//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕
;return(flag);
//返回检测成功标志 }
单总线通信协议中存在两种写时隙:写0写1。主机采用写1时隙向从机写入1,而写0时隙向从机写入0。所有写时隙至少要60us,且在两次独立的写时隙之间至少要1us的恢复时间。两种写时隙均起始于主机拉低数据总线。产生1时隙的方式:主机拉低总线后,接着必须在15us之内释放总线,由上拉电阻将总线拉至高电平;产生写0时隙的方式为在主机拉低后,只需要在整个时隙间保持低电平即可(至少60us)。在写时隙开始后15~60us期间,单总线器件采样总电平状态。如果在此期间采样值为高电平,则逻辑1被写入器件;如果为0,写入逻辑0。
下图为写时隙(包括1和0)时序
上图中黑色实线代表系统主机拉低总线,黑色虚线代表上拉电阻将总线拉高。下面是代码:
WriteOneChar(unsigned char dat){ unsigned char i=0;for(i=0;i<8;i++)
{
DQ =1;
// 先将数据线拉高
_nop_();
//等待一个机器周期
DQ=0;
//将数据线从高拉低时即启动写时序
DQ=dat&0x01;
//利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;
//释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;
//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++)
;//稍作延时,给硬件一点反应时间 }
对于读时隙,单总线器件仅在主机发出读时隙时,才向主机传输数据。所有主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。所有读时隙至少需要60us,且在两次独立的读时隙之间至少需要1us恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发出读时隙后,单总线器件才开始在总线上发送1或0。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。
当发送0时,从机在读时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间15us,因此主机在读时隙期间必须释放总线,并且在时隙起始后的15us之内采样总线状态。
下图给出读时隙(包括0或1)时序
图中黑色实线代表系统主机拉低总线,灰色实线代表总局拉低总线,而黑色的虚线则代表上拉电阻总线拉高。代码为:
unsigned char ReadOneChar(void){
unsigned char i=0;
unsigned char dat;//储存读出的一个字节数据
for(i=0;i<8;i++)
{
DQ =1;
// 先将数据线拉高
_nop_();
//等待一个机器周期
DQ = 0;
//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_();
//等待一个机器周期
DQ = 1;
//将数据线“人为”拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++)
;
//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;//如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++)
;
//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);
//返回读出的十进制数据 }
每个单总线器件内部都光刻了一个全球唯一的64位二进制序列码,用于该单总线器件的识别
SPI总线协议
SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。读代码:
unsigned char ReadCurrent(void){
unsigned char i;unsigned char x=0x00;
//储存从X5045中读出的数据
SCK=1;
//将SCK置于已知的高电平状态
for(i = 0;i < 8;i++){
SCK=1;
//拉高SCK
SCK=0;
//在SCK的下降沿输出数据
x<<=1;//将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
x|=(unsigned char)SO;//将SO上的数据通过按位“或“运算存入 x
} return(x);
//将读取的数据返回
} 写代码:
void WriteCurrent(unsigned char dat){
unsigned char i;SCK=0;
//将SCK置于已知的低电平状态
for(i = 0;i < 8;i++)// 循环移入8个位
{
SI=(bit)(dat&0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
SCK=0;
SCK=1;
//在SCK上升沿写入数据
dat<<=1;
//将y中的各二进位向左移一位,因为首先写入的是字节的最高位
1 串口通信的实现方式
设备在实现通信的过程中, 必须树立一个信息接发双方都认可的通信方式, 只有这样才能够保证信息在传送的过程中不发生冲突, 才能够实现设备之间的通信, 对于串口通信来说, 主要有以下两种方式。
1.1 异步通信方式
异步通信方式实现的过程中, 数据传输方式为独立字节的形式, 不同的字节前端有着不同的起始信号, 不同字节的后端则会有不同的终止信号, 起始信号只能是一个, 而终止信号可以是一个也可以是多个。数据传输过程中, 字节进行移动, 一个字节的迁移过程表示一个字节的传输过程, 传输之前使用起始信号进行传输, 传输结束之后使用终止信号将传输线调回标准状态, 一个字节传输完毕后进行下一个字节的传输, 字节传输有着连续性, 这就是异步传输方式。由于没一个字节都要附加起始信号信息和终止信号信息, 因此异步传输方式的效率较低, 但异步通信方式容许一定程度的频率漂移, 有着一定的误差缓冲作用。
1.2 同步通信方式
同步通信方式指的是将所有字符和字节连接在一起进行传输的一种通信方式, 多个字符相互连接组成数据块, 在数据块前增加同步字符, 以同步字符作为传输起始信号, 在传输后增加校验字符, 以校验字符作为传输终止信号, 以此来校验传输过程中的错误和误差, 数据块中的各个字符之间没有间隔, 相较于异步通信方式来说, 其传输效率较高, 但其对于信息接收端和信息发送端的同步性要求较高, 因此硬件的复杂程度也就更高。
2 基于单片机的数据串口通信
2.1 单片机数据串口通信过程
单片机数据串口通信功能的实现主要依赖于数据寄存器, 这个数据寄存器一般设置在单片机的串行端口上, 其能够实现数据的接收和发送, 从而为实现通信提供了可能。一般来说, 数据在写入寄存器的时候同时会进行发送, 从而进入到数据的传输流程中, 而数据寄存器在读取数据的时候同时也开始数据的接收, 这就是单片机数据串口通信的简单过程。
具体来说, 串行接口与单片机通信的过程中, 可编程逻辑控制器会接收到单片机发送的命令帧格式, 在通信结束之后, 可编程逻辑控制器执行命令, 可编程逻辑控制器需要以ASCII的形式来形成接收到的信息, 但是单片机的输入方式有着一定的局限性, 只能够进行高低电平输入, 这就需要在信息发送过程中对信息进行格式转化, 串口通信协议中有信息帧格式, 可以以此为依据将信息转化为二进制格式, 转化后的信息发送至数据寄存器中, 从而完成单片机数据串口通信过程。
2.2 单片机的显示设计分析
单片机显示程序的设计一般有两种方式:
2.2.1 动态显示驱动
指的是通过数码管来实现单片机动态显示的一种驱动显示方式具体来说, 并联所有选择的线路, 利用八位I/O口来控制这些并联的线路, 将除八位I/O口之外的I/O口作为数码管选线, 显示数字的译码由单片机进行输出, 此时, 为选通电路与各个数码显示管一一对应, 并由对应的数码显示管来进行有效的控制, 没有对应的数码显示管在此过程中不会产生反应, 这就是动态显示驱动的过程。
2.2.2 静态显示驱动
静态显示驱动属于一种直流驱动方式, 数码管有两个极, 分别是共阳极和共阴极, 在接地设置上, 让这两个极同时接地, 且同时连接电源, 这就是静态显示驱动方式, 需要注意的是, 相较于动态显示驱动方式而言, 静态显示驱动方式会占用更多的I/O口, 这就给显示设计带来了一定的复杂性, 因此, 在实际的单片机显示设计中, 一般采用动态显示驱动方式较多。
2.3 矩阵式键盘接口分析
在单片机数据串口通信过程中, 可能在键盘中需要较多数量的键盘按键, 为了避免占用过多的I/O口, 则需要对这些键盘按键进行合理的排序。下面介绍一种矩阵形式的排列方式, 以此来实现键盘按键的合理划分布。在矩阵式排列的过程中, 垂直线和交叉点在同一条水平线上不能够直接的联通, 而是要通过按键来实现二者的连接, 这就形成了一种4×4 的矩阵式排列方式, 这种键盘连接对于端口的应用效率明显提升。
矩阵式键盘连接方式适用于线路较多情况, 线路越多, 则其提升端口使用效率的效果越明显。矩阵式排列分布方式下, 使用端口线增加线路时, 一条线的增加对应一个键的增加, 而使用普通线, 一条线的增加对应二十键, 此时使用矩阵式排列方式就能够取得良好的效果。
矩阵式结构虽然能够避免过多的占用I/O口, 但是其也有着一定的局限性, 即矩阵式结构实现难度较大, 相对来说比较复杂。已经确定的矩阵式键盘来说, 可以采用“行扫描法”来识别按键, 对于按键落下与否的判断来说, 可以降低行线到低电平状态, 检测列线的状态, 如果发现有一条列线的电平为低状态, 则可以判断键盘的按键在按下的状态, 如果所有的列线都在高电平的状态, 则可以判断键盘按键处于非按下的状态。在确定有键盘按键处于按下的状态时, 则需要确认具体是哪一个按键处于按下状态, 首先将某一条行线调到低电平的状态, 之后对列线进行逐条检查, 哪一列的列线处于低电平状态, 则其与调到低电平状态这条行线的交点按键就是闭合的按键, 依此进行判断即可。
3 结论
信息的发展日新月异, 数据通信在工业及信息领域的应用越来越重要, 计算机与外设数据的连接则依赖于单片机的数据串口通信, 这就打破了信息传输的地域性限制。本文简要研究了基于单片机的数据串口通信, 旨在进一步促进单片机数据串口通信技术的进一步发展。
参考文献
[1]佘艳.基于单片机的数据串口通信[J].电子技术与软件工程, 2015, 01:262.
[2]王振宇.基于单片机的数据串口通信研究[J].电子技术与软件工程, 2015, 07:256-257.
关键词:单片机;RS-232;PC机;实时数据采集
中图分类号:TP368 文献标识码:A 文章编号:1674-7712 (2012) 16-0066-01
一、单片机与PC机串行通信的硬件系统连接
二、串口通信的通信协议
考虑到小型分散测控系统采用主从式控制结构的实际情况,可将多个单片机的通信模式设置为模式1与PC机进行远程串行通信。当PC机启动通信功能并对某一单片机实现功能控制时,将每一片单片机设置一个片识别地址,也就是站号,只有当PC机发送的信号中的地址位与单片机中的片识别地址相一致时,该单片机才能根据接收信号对PC机做出响应,按系统要求向PC端发送应答数据。
具体的寻址实现可以采用软件查找方法:单片机可以提供位寻址区,假如该单片机的寻址标志位被置为“1”,表示该单片机可以对PC端的数据进行接收;假如寻址标志位为“0”,表示该单片机无法响应PC端请求。通过对标志位的判断结果决定是否将单片机地址与PC机地址进行比较,只有地址一致的单片机才可以将寻址标志位置为“1”,然后退出中断服务程序;其他未响应单片机则直接退出中断服务程序。
在发送端和接收端的信息传输中需要进行信息校验,以保证传输信息的正确性和可靠性,一般情况下课采用累加和校验。只有校验结果正确时,收发端才能正确响应数据帧,进行数据的发送与接收,否则将反馈信息传输出错,要求发送端对数据进行重新发送。为防止“锁死”现象的出现,该校验方法需要限定重发次数,在限定次数内发送的数据可被认定为有效,超出限定次数可认为发送失败,跳过该数据传输,或结束通信返回失败信号。
三、相应的软件编程实现
在实现程序上,单片机端的通信程序采用MSC51汇编语言编程,通过中断响应的方式实现数据通信,其通信方式可通过技术手册获得;PC机端的通信程序可以采用VB编程方式实现数据通信,其通信方式采用事件驱动方式。通过MSCComm控件可以对串口进行初始化、收发数据等串行通信功能实现。
四、结语
在实际的工业过程中单片机与PC机的通信应用非常广泛。本文系统具有一定的通用性,在实际应用中可根据实际需要对相关部分进行修改,满足实际要求。实践表明,本文系统稳定可靠,能够满足单片机与PC机串行通信中的实时采集数据和控制的要求。
参考文献:
[1]甄任贺,俞寿益.单片机与PC机串行通信的实现方法[J].广东技术示范学院学,2004,6.
[2]潘方.RS 232串口通信在PC机与单片机通信中的应用[J].现代电子技术,2012,35.
//串口接收的数据送至P1口,可接几个led试一下
#include
void main(void)
{
TMOD=0x20;//T0方式2,作为波特率发生器
TH1=0xfd;//9600波特率
TL1=0xfd;
SM0=0;//串口方式1
SM1=1;
REN=1;
EA=1;
ES=1;
PCON=0x80;
TR1=1;
while(1);//wait here
}
//******************串口中断*******************
void isr()interrupt 4
{
ES=0;
if(RI==1)
{
P1=SBUF;//P1口作为驱动口,根据需要结合自己发送的指令自己调整哦}
ES=1;
关键词:plc,单片机,串行通信
随着科学技术、网络通信技术以及自动化技术的快速发展, 可编程逻辑控制器 (plc) 的功能日益强大, plc不仅能够实现逻辑控制, 而且还能实现数字控制、远程控制以及运动控制等, plc逻辑控制器已经广泛应用于电力、交通运输、冶金、汽车制造等等各行各业。
1 单片机与plc串行通信的特点
plc和单片机各有各的优点和长处, 可编程逻辑控制器使用简单、抗干扰能力强、运行可靠, 并具有较强的驱动能力, 可以在条件恶劣的环境下工作, plc主要用于机械设备的控制plc与现在的以太网、adsl等宽带技术相比, plc具有以下优点:plc分布广泛;接入方便;并且plc接入成本比较低, 费用低, 可以减轻用户的负担。单片机体积小、价格低, 并且使用方便灵活, 单片机可以用于办公设备、家用电器、仪器仪表以及传感内部的核心部位。在实际的应用中, 需要把单片机和plc两者结合起来从而可以发挥各自优点和长处。单片机和plc通过通信进行交换信息, 从而组成控制系统, 实现实时采集。
1.1 单片机串口介绍
AT89S52单片机内部含有一个可编程全双工串行通信接口, 具有UART的全部功能。该接口电路不仅能同时进行数据的发送和接收, 也可作为一个同步移位寄存器使用。
在进行异步通信时, 数据的发送和接收分别在各自的时钟 (TCLK和RCLK) 控制下进行的, 但都必须与字符位数的波特率保持一致。MCS-51串行口的发送和接收时钟可由两种方式产生, 一种是由主机频率fosc经分频后产生, 另一种方式是由内部定时器T1或T2的溢出率经16分频后提供。
串行口的发送过程由一条写发送缓冲器的指令把数据 (字符) 写入串行口的发送缓冲器SBUF (发) 中, 再由硬件电路自动在字符的始、末加上起始位 (低电平) 、停止位 (高电平) 及其它控制位 (如奇偶位等) , 然后在移位脉冲SHIFT的控制下, 低位在前, 高位在后, 从TXD端 (方式0除外) 一位位地向外发送。
串行口的接收与否受制于允许接收位R E N的状态, 当R E N被软件置“1”后, 允许接收器接收。接收端RXD一位位地接收数据, 直到收到一个完整的字符数据后, 控制电路进行最后一次移位, 自动去掉启始位, 使接收中断标志RI置“1”, 并向CPU申请中断。TI和RI是由硬件置位的, 但需要用软件复位。
1.2 单片机串口控制寄存器
SBUF是两个在物理上独立的接收、发送缓冲器, 可同时发送、接收数据。两个缓冲器只用一个字节地址99H, 可通过指令对SBUF的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。串行口对外有两条独立的收发信号线RXD (P3.0) 、TXD (P3.1) , 因此可以同时发送、接收数据, 实现全双工。
1.3 单片机多机通信方案选择
根据需要, 各片单片机有相等的权限, 每块单片机都可设置为主机或从机, 因此单片机的串口应具有双向可选择性。采用两个同相三态门加上一个反相器即可构成这样的接口, 并由单片机的一根引脚控制单片机串口的连接方式。
发送数据区可存放1B~48B的数据, 以空字符'�'作为发送数据结束标志。接收数据时以空字符作为接收有效数据结束标志。通信结束时, 从机发回收发长度作为校验。
2 通信接口电路的设置
2.1 接口电路的设计
rs—232c接口是plc的一个标准的接口, 主要采用eia电平逻辑, 而at89c51主要采用ttl/cmos电平逻辑, 由于这些电平不能互相兼容, 所以应该将eia电平逻辑和ttl/cmos电平进行转换, 在我们使用的max232串行通信芯片中主要是单片集成双rs—232接收器。这种串行通信接口主要采用+—5v的电源供电, 然后外接四支电容形成标准的rs—232通信接口, 从而可以使eia电平和ttl/cmos电平之间的转换, 经过转换之后两者就可以通过rs—232接口实现信号之间的传送。
2.2 串行通信接口的设置
2.2.1 单片机串行口的设置
at89c51单片机内部有一个串行口, txd (p3.1) 为发送端, rxd (p3.0) 为接收端, at89c51主要有scon和pcon两个特殊的寄存器进行控制, 在软件设置的四种通信方式工作时, 串行口主要为8位异步通信接口, 非常适合于集成点对点连接接口的8位数据的传输, 每帧信息有一个起始位、八个数据位和一个停止位, at89c51的cpu晶振为11.0592mhz时, 波特率主要采用9600bps, 波特率主要有串行口方式寄存器smod的状态和定时器t1的溢出率进行确定。
2.2.2 plc串行口参数的设置
plc主要通过进行设置系统寄存器来实现串行接口初始化。比如我们使用的fp1的系统寄存器no.413可以采用指定的rs232串口波特率控制字可以设置为h00, 即一个起始位;8个数据位;一个停止位, 没有奇偶校验位。串口波特率设置的寄存器no.414可以采用指定的rs232c串口波特率, 可以设置为h01, 其中波特率为9600bps;串口方式设置寄存器no.412可以设置为h01, 这种方式成为计算机连接通信方式, 站号设定寄存器可以no.415可以设置为h01。
3 单片机与plc串行口的通信过程
单片机的串行端口有一个数据寄存器sbuf, 在特定的条件下, 如果单片机向sbup写入数据就启动了发送过程, 如果单片机向sbup读入数据就启动了接受过程, 当单片机与plc通过rs—232c串行接口进行通信时, 发送过程主要有单片机向plc发出命令帧格式, 发送过程结束之后, plc做出响应, 同时单片机接受响应帧格式, 这种过程称为接受过程通信过程主要由单片机进行启动和接受不需要运用plc进行编制程序。其中发出命令帧格式主要包括plc站号、特殊标志位以及呼叫字符等, 发出命令帧。
4 单片机与plc的应用
plc是建立在单片机之上的一种科技产品, 单片机是一种集成电路, 单片机可以构成多种多样的应用系统, 可以是大型、中型、小型以及微型的, 而plc是单片机应用系统中的一个特殊的系统, 单片机可以配合外围的电路设计出各种功能, 单片机一般采用c语言、汇编语言等, 这种系统可以应用于各个领域内, 并且也非常安全可靠。单片机的应用系统是非常广泛的, 但是单片机的使用和维护是非常困难的, 从plc和单片机的系统的选用上来讲对于单项的工程采用plc是非常快捷、并且成功率高、可靠性好, 但是成本比较高。对于大量的配套的项目来讲, 采用单片机具有成本低、效益高等优点。随着科学技术不断进步和更新, 在单片机系统中嵌入plc系统性能不仅可以得到保证, 而且使工程项目的效益也得到保证。
目前单片机渗透到我们生活的各个领域, 几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置, 飞机上各种仪表的控制, 计算机的网络通讯与数据传输, 工业自动化过程的实时控制和数据处理, 广泛使用的各种智能IC卡, 民用豪华轿车的安全保障系统, 录象机、摄象机、全自动洗衣机的控制, 以及程控玩具、电子宠物等等, 这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求, 因而必须采用多机控制的形式, 而多机控制主要通过多个单片机之间的串行通信实现。串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。
构成较大规模的检测、控制系统, 经常要采用多个单片机, 组成可以通信的多机系统。Mcs一51系列单片机为实现多机通信联网设计了方便的串行通信接口功能。将多个Mcs一51单片机组成串行总线形式的相互通道, 通过写单片机的串行控制方式寄存器, 将串行口置成方式2或方式3, 就可以实现主机与分机之间的串行通信。这种多机系统结构简单, 应用广泛, 但它只能实现由主机呼叫分机, 然后实现主机与分机之间的全双工串行通信。我们在监控系统中要求既有主机与分机主动通信, 又有分机与主机主动通信, 这种结构的多机系统就无法满足要求。
5 总结与展望
串行通信是一种应用广泛的通信方式, 本文主要以at89c51单片机和plc之间的串行通信为例进行探讨, 并由此得出串行通信技术是一种实用性强;结构简单、运行可靠、抗干扰能力强, 并且使用于远距离传输的一种通信方式。随着科学技术的不断进步, 对单片机以及plc通信系统不断的开发利用, 进一步将两者有效的结合起来实现通信技术, 从而创造更高的应用价值。
多机协同工作已是单片机发展的一个重要趋势, 目前单片机多机通信的主要方式仍然是主从式多机通信系统。
单片机多机通信的目的是实现分布式处理系统, 单片机多机通信的方式有很多种, 应用前景广阔, 非常具有研究意义!
参考文献
[1]李生军, 李少蒙.《单片机与plc之间的串行通信实现》.化工自动化及仪表, 2010, 37 (2) :78--80.
[2]李辉, 郑宁.《plc与单片机之间的串行通信及应用》.电工技术杂志, 2013 (8) :67--68.
[3]赵勇.《单片机与可编程控制器的串行通信及应用》.西安邮电学院学报, 2010, 10 (1) :36--37.
[4]赵淑玉, 孟宝全.《单片机和plc的应用与串行通信》.科技信息, 2011 (21) :52--54.
STM32单片机是基于高性能Cortex-M3内核的32位单片机,外设功能强大,最大工作频率72MHz。 本文选用的STM32103VET6芯片,有多达5个USART、3个SPI口和2个I2C口,便于产品与上位机的通信。采用基于库函数的编程方法,能很快地进行产品开发。目前公开的文献没有提及无硬件平台情况下对STM32进行多串口调试的方法,部分文献有介绍用虚拟串口仿真51单片机,但没有提及怎样仿真串口接收通信的情况[1,2,3]。本文采用基于Real View MDK、VSPD( 虚拟串口) 和串口调试软件的联合仿真调试技术,可以在没有硬件平台的情况下, 完成多串口收发通信软件的开发和测试。
1多串口通信的软件设计原理
软件流程图如图1所示。
本文使用的STM32芯片有多达5个USART,使用其中的3个USART(USART1 ~ USART3)。在不进行管脚 重映射的 情况下,USART1 _ Tx管脚为PA9,USART1_Rx管脚为PA10,USART2 _Tx管脚为PA2 ,USART2 _Rx管脚为PA3 ,USART3 _Tx管脚为PB10,USART3_Rx管脚为PB11。软件的设计采用模块化,包括RCC时钟配置模块,NVIC中断向量配置模块,USART1 ~ USART3管脚配置 模块、 USART1 ~ USART3初始化模块,USART1 ~ USART3通信模块等。
1.1RCC时钟设置模块
采用8 MHz外部晶振作为PLL时钟,再倍频到72 MHz。该时钟作为系统时钟,待系统时钟稳定后,再进行各模块时钟的分配[4]。时钟初始化模块部分代码如下:
1.2UASRT通信管脚配置模块
STM32单片机功能管脚由GPIO管脚进行映射,这里仅给出USART1_Tx和USART1_Rx管脚配置的软件代码,USART2和USART3的管脚配 置类似[5]。
1.3NVIC中断向量模块的配置
NVIC是中断向量控制器,用来控制多个中断向量的优先级,在NVIC中设置USART1中断为最高优先级,USART2次之,USART3中断优先级最低。 本文设置发 送为顺序 发送,接收为中 断响应接 收[6]。代码如下:
USART1 ~ USART3的抢占优 先级相同,USART1的从优先级值最小,所以USART1的优先级别最高。
1.4USART的通信配置模块
采用全双工通信,对USART1进行配置,USART1的波特率115 200 bit / s,数据位8位,停止位1位,无校验位,无流量控制,接收、发送使能,采用接收中断方式,USART2和USART3的配置类似。
1.5USART的中断接收模块
在该中断响应函数中,当USART1接收事件完成时,产生中断信号,通知微处理器进行串口通信的接收处理[7,8]。
当USART2和USART3产生接收中断时,进入相应的中断函数进行处理。
2虚拟串口和仿真串口的绑定
传统的USART调试必须有相应的开发板,连接开发板的串口和上位机的串口,开发软件Real View MDK在调试时,有3个串口的仿真输出窗口UART# 1,UART# 2,UART #3,但这3个窗口只能仿真串口输出,不能仿真串口的接收通信。采用虚拟串口软件VSPD(Virtual Serial Port Driver),可以虚拟出多对串口,如图2所示。分别把每一对虚拟串口中的一个与STM32单片机的每个串口进行绑定,就可以进行串口的通信仿真测试。
本文用VSPD软件虚拟了3对串口,分别是COM4和COM5、COM6和COM7、COM8和COM9。 COM4发送数据时,COM5接收数据,反之亦然。为了仿真STM32单片机3个串口的 收发通信,把UART1和COM4绑定在一起,把UART2和COM6绑定在一起,把UART3和COM8绑定在一起。因为虚拟串口COM4和COM5互相通信,所以用COM5发数据,可以模拟串口COM4的中断接收数据。配置文件为COM4_OUT. txt,把后缀名改为. ini。内容如下[9,10]:
文件的作用是配置COM4的波特率为115 200 bit / s,8个数据位,1个停止位,无校验位,把COM4和STM32的第1个串口绑定在一起,配置COM6的波特率与COM4一样,绑定COM6和STM32的第2个串口在一起,依次类推。把COM4_OUT. ini文件放在工程文件 中,编译后,就可以利 用Real View MDK软件和串口调试软件进行串口的通信仿真测试。
3USART通信发送、接收数据测试
3.1发送数据测试
设置3个发送数组,uart1 _ tx[64 ]、uart2 _ tx [64]、uart3_tx[64],因为COM4和COM5相连接, 当COM4发送数据时,COM5接收数据,由图3可知,当COM4发送数组uart1 _ tx[64]的数据时, COM5的接收区正确显示数组uart1_tx[64]的数据。 COM8和COM9相连,由图4可知,COM9的接收区正确显示数组uart3_tx[64]的数据[11]。
3.2接收数据测试
用uart1_rx[64]、uart2_rx[64]和uart3_rx[64] 分别模拟COM4、COM6和COM8中断接收数据,这时COM5、COM7和COM9分别发出数据。该实验用于测试多串口中断接收通信的准确率[12]。
对比图5和图7可知,uart1_rx[64]正确接收到COM5发出的64个数据,表明COM4中断接收通信正确。对比图6和图8可知,uart2_rx[64]正确接收到COM7发送的64个数据,表明COM6中断接收通信正确。
4结束语
1 系统设计
1.1 硬件设计
51单片机有一个全双工的串行通信口,所以单片机和电脑之间可以方便地进行串口通信。进行串行通信要满足一定的条件,电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路[3],笔者采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但还是用专用芯片更简单可靠。采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD及第3脚的TXD。这是最简单的连接方法,但是对该设计来说已经足够使用了,具体硬件电路如图1所示。MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接[4]。
单片机程序的主要代码如下:
1.2 组态王和单片机通信
单片机与组态王软件通信[5]的解决方案有两种:其一是直接编写支持单片机的驱动程序,就像组态王支持PLC一样;其二是利用组态王软件和Visual Basic都支持DDE的特点,以VB为开发平台,写一个数据通信应用程序,一方面实现与单片机的连接,另一方面实现与组态王的动态数据交换[6]。第1种方案的优点是程序结构比较紧凑,数据通信效率较高;缺点是必须由对组态王软件内核比较清楚的程序员开发,开发周期较长。第2种方案可由一般的程序员开发,缺点是数据通信效率较低。在本设计中,笔者采用了第2种方案。
采用动态数据交换DDE方便实现数据实时交换。因为DLL不被大多数组态软件所支持,OLE不适合串行通信方式。相比之下,DDE是一种简单、高效又被组态软件广泛支持数据交换方法[7]。
用VB编写的数据通信程序作为中间者传递组态王与单片机之间的数据。当组态王需要向单片机发送控制命令时,组态王充当服务器向VB通信程序提供数据,VB通信程序再通过串口实现对单片机的远程控制;当组态王需要向单片机采集数据时,组态王充当客户向VB通信程序请求数据[8]。组态王与单片机通信的数据流向如图2所示。
2 仿真与任务实现
2.1 Kingview作为服务器向VB提供数据
建立Kingview工程项目步骤如下:
a. 建立新项目。工程名称——VBDDE1,工程描述——Kingview向VB传递数据。
b. 定义设备选择。设备/DDE→智能模块→单片机→串口。
c. 定义I/O变量。fromViwetoVB,变量类型选I/O实数,寄存器选AD0,数据类型选UNSHORT,读写属性选“只读”。选中“允许访问DDE”。
定义I/O变量的图形界面如图3所示,画面名称为数据交换,图形画面中有一个文本对象“###”的“模拟值输出”属性与I/O变量“fromViewtoVB”连接,输出格式——整数位数设为1,小数位数设为2。
建立VisualBasic工程项目步骤如下:
a. 建立VisualBasic工程。运行可视化编程工具VisualBasic,新建窗体Form1,在窗体中加入两个Text控件(Text1、Text2)。以“vbdde1.Frm”及“vbdde1.Vbasicp”存储工程。
b. 编写VisualBasic应用程序。双击Form1窗体中任何没有控件的区域,在代码编辑框口中编写Form_Load子程序,代码如下:
调试运行时,先运行Kingview画面程序,再启动VisualBasic应用程序。
2.2 Kingview作为顾客程序从VisualBasic得到数据
建立VB工程项目。运行可视化编程工具VisualBasic,新建窗体Form1,在窗体中加入一个Text控件:Text。
建立KingView工程项目步骤如下:
a. 建立新项目。工程名——VBDDE2,工程描述——Kingview与VisualBasic动态数据交换。
b. 定义DDE设备。在工程浏览器中,从左边的工程目录显示区中选择“设备/DDE”然后在右边双击“新建”图标,弹出“设备配置向导”进行配置,选择DDE设备,DDE逻辑设备名称——PCIDDE(用户自己定义),服务器名称——vbdde2(必须与VisualBas1应用程序工程名一致),话题名——FormToView(必须与VisualBasic应用窗口LinkTopic属性值一致),数据交换方式——选择标准的Windows项目交换[9]。
2.3 运行结果
将单片机系统与PC机的串口连接起来,在“我的电脑管理设备管理器”中查看串口,并在软件中修改好。启动VisualBasic应用程序。再运行KingvView画面程序。单片机就会每隔一段时间向VisualBasic发送一个数据,在VisualBasic文本框中可以看到,在KingView监控程序中能看到数据的变化。在KingView的消息记录窗口有文本记录,可以保存成文档[10]。
3 结束语
在点对点串行通信的硬件讨论中,涉及到RS-232与TTL电平之间的转换问题,笔者给出了实际的硬件电路。软件设计实现了单片机与PC机点对点可靠的串行通信,系统地介绍了DDE技术。该设计通过VisualBasic作为中间程序实现PC机与单片机的实时数据交换,实现与组态王的实时动态数据交换,具有编程简单、开发周期短及易于移植等优点,有很大的实用价值。
摘要:设计了典型单片机与PC机串口通信系统,详细介绍了基于组态王的PC端上位机软件设计程序及下位机单片机端的硬件设计。利用组态王软件和Visual Basic都支持DDE的特点,以VB为开发平台,写出一个数据通信应用程序,一方面实现与单片机的连接,另一方面实现与组态王的动态数据交换。
关键词:单片机,VB,串行通信,PC机,组态王
参考文献
[1]桂万如,卢结成.基于VB6.0的光谱数据实时采集系统设计[J].江南大学学报(自然科学版),2004,12(5):445~447.
[2]蒋学润,毛宗源.利用VB开发与智能模块通信的ActiveX控件[J].控制工程,2004,11(s1):11~13,16.
[3]汪炼,韩震宇.基于AVR单片机的串口通信[J].中国测试技术,2003,29(2):52~53.
[4]曾自强,王雨菡.用VC++实现单片机与PC机串口通信的三种方法[J].自动化与仪器仪表,2005,19(3):60~63.
[5]宗风强,王振友.用Visual Basic6.0实现组态王和单片机的串口通信[J].山东理工大学学报(自然科学版),2005,19(3):60~63.
[6]吕俊亚.单片机串口通信中的纠错编解码[J].煤炭技术,2010,29(7):156~157.
[7]朱建平,吕春峰.基于LabVIEW的单片机串口通信实现[J].机械工程与自动化,2008,(4):157~158.
[8]夏建芳,赵世富.虚拟仪器与单片机串口通信的实现[J].机械工程与自动化,2006,(2):136~142.
[9]刘杰,王慧.组态王与单片机多机串口通信的设计[J].电子设计工程,2009,17(7):7~11.
1 基于SP2338的串行口扩展
SP2338是采用低功耗CMOS工艺设计的通用异步串行口扩展芯片, 它可轻松地将主机原有的1个串行口扩展成3个全新的全双工串行口。SP2338适用于1个起始位、8个数据位、1个停止位的多串口系统, 也就是说其帧格式是不可编程的。主机通过改变ADRI1, ADRI0地址线状态的方式选择3个子串口中的任意1个, 3个子串口的地址分别为00, 01, 10。地址11用于执行SP2338芯片本身的复位指令0x35或0x B5、睡眠指令0x55或0x D5、延时指令0x00。向RX0~RX3中的任意1个接收端口写任意数据即可将SP2338唤醒, 但由于SP2338的唤醒时间需要25ms左右, 故用于芯片唤醒的数据将不会被主机接收。因此, 可以先发送1个字节数据用于唤醒芯片, 延时25ms后即可进行正常的数据传输。
当单片机要向串口设备发送数据时, 其工作过程是:
(1) 先向SP2338的串口地址线ADRI0、ADRI1送地址信号 (ADRI0、ADRI1=00子串口0, ADRI0、ADRI1=01子串口1, ADRO0、ADRO1=10子串口2) ;再向与自已相连的母串口的通信线上送数据;
(2) SP2338的母串口收到单片机串口送来的数据后就根据ADRI0和ADRI1的状态, 把数据送往相应的子串口;
(3) 该子串口再把数据送往相连的串口设备。
当串口设备向单片机发送数据时, 其工作过程是:
(1) SP2338的某个子串口从串口设备接收到数据时, 送给母串口;
(2) SP2338的母串口把该数据再送给单片机串口, 同时在ADRO0和ADRO1线上送出子串口的地址;
(3) 单片机根据SP2338接收地址线ADRO0、ADRO1上的信号判定出是由哪个串口设备发出的。
由于SP2338的每个串口都有自己的发送缓冲区和接收缓冲区, 因此扩展后的3个串口就可以完全独立地同时通信, 就好像单片机同时拥有3个串口似的, 若1个单片机有2个串口, 那么配上2片SP2338就可以扩展到6个串口。
SP2338每个子串口的波特率都可以达到9600bps, SP2338工作时需要配1个晶振, 该晶振Fosc的频率与母串口的波特率有如下关系:
与子串口波特率的关系如下:
因此, 如果子串口采用9600波特率, 根据以上公式, Fosc=20MHz, 而母串口的波特率必须达到388400bps。这样与SP2338的母串口相连的单片机串口的波特率达到388400bps, 若单片机采用非11.0592M的工作晶振, 则波特率会有偏差, 不过, SP2338允许波特率误差为2.5%
未使用的输入端口, 如RX0、RX1、RX2等必须连接到VCC;未使用的输出端口, 如TX0、TX1、TX2等必须悬空;未使用的ADRI0、ADRI1必须连接到GND。
2 软件模拟法
软件模拟法可根据串行通讯的传送格式, 利用定时器和主机的I/O口来模拟串行通讯的时序, 以达到扩展串口的目的。接收过程中需要检测起始位, 这可以使用查询方式, 或者, 在端口具有中断功能的主机中也可以使用端口的中断进行处理。接收和发送过程中, 对定时的处理既可以使用查询方式也可以使用定时器中断方式。为了确保数据的正确性, 在接收过程中可以在检测异步传输的起始信号处加上一些防干扰处理, 在接收每个位时可以采用多次采样。
例:软件设计中, 89C51单片机的P1.0和P1.1口分别模拟串行通信的发送和接收, 其接口程序主要由INPUT发送子程序和OUTPUT接收子程序组成。通信速率1200 bit/s, 帧格式为N.8.1。发送时, 先发送一个起始位 (低电平) , 接着按低位在先的顺序发送8位数据, 最后发送停止位。接收时, 先判断P1.1接收端口是否有起始低电平出现, 如有则按低位在先的顺序接收8位数, 最后判断P1.1口是否有停止高电平出现, 如有则完成一个数据接收, 否则继续等待。模拟串行通信程序清单如下:
3 使用双串口单片机
W77E58是与MCS51系列单片机兼容的可多次编程的快速微处理器, 内部集成有2个增强型的全双工串行口, 其串口增强性特征在于特有的地址自动识别和帧出错诊断功能。值得注意的是, 串行口1只能使用定时器1作为其波特率发生器;而串行口0既可以使用定时器0, 也可以使用定时器1。若使用时2串口通信波特率相同, 则可以同时使用定时器1, 从而减少占用1个定时器0。
(1) 自动帧错误检测。自动帧错误检测指的是在数据传输的过程中, 如果由于噪音等随机干扰造成接收方接收不到正确的停止位, W77E58能够自动检测出并设置标志FE (FE_1) , 此标志被定位在SCON.7 (SCON1.7) , 用户可以访问, 并且必须软件清除。
(2) 多机通讯自动地址识别。在标准的8051系列单片机中, 当进行多机通讯时, 发送9位数据, 最后一位只当作地址/数据识别位, 但是并不能区分准确地址, 准确地址须靠软件识别, 而在W77E58中, 增加了地址特殊寄存器SADDR和地址屏蔽特殊寄存器SADEN, 只有SADEN中的某一位为1, 计算实际地址时相对应的SADDR的位才有效, 若SADEN中某一位是0, 则进行实际地址计算时忽略对应的SADDR中的位。例如:
在进行多机通讯时, 只有接收到的地址帧和根据SADDR, SADEN计算出的地址完全相同时, 从机才会置位中断标志, 这完全由硬件自动完成, 而不是像标准8051系列那样必须靠软件完成。
参考文献
[1]李之棠.单片机通信技术与工程实践[M].北京:人民邮电出版社, 2005.
【单片机串口通信实验】推荐阅读:
实验单片机指导书07-19
单片机技术实验指导书10-04
单片机实验指导书下10-30
单片机第三次实验思考题10-03
单片机编程经验07-23
单片机编程心得10-12
课程小结单片机11-22
单片机实习报告07-20
单片机说课稿10-11
单片机工程师11-07