单片机(串口中断)双机通信
(注释部分需看看)
接收端:
#include<reg52.h>//包含单片机对应的头文件
#include<intrins.h>
sbit LED=P3^0;
void delay_ms(unsigned int time) //延时毫秒数
{
unsigned int i,j;
for(i=time;i>0;i--)//i不断减一,知道i大于0条件不成立为止
{
for(j=125;j>0;j--)//i不断减一,知道i大于0条件不成立为止
{;}
}
}
unsigned int po[10]={0x02,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
void uart(void)
{
SCON=0x40; //选择工作方式二(工作方式寄存器)
//PCON=0x00;//不选择波特率倍增(电源控制寄存器)
REN=1; //允许接收数据
TH1 = 0xCC; //由于用到串口,设置波特率
TL1 = 0xCC;
/*
TH1 TL1 这两个等于0XFD 必须一样吗? 单片机的指令
不一定一样,看你需要做什么用了?
如果是8位自动重装载的,就必须一样。
如果是13位或16位定时器,就不必一样。*/
TMOD = 0x20; //工作方式2:自动装入8位计数器 (TMOD:工作方式寄存器)
TR1 = 1; //启动定时器(定时控制寄存器TCON)
//TI=0; //清零发送标志
RI=0; //清零接受标志
ES = 1; //允许总中断(1)
EA =1; //允许串口中断(2)二者可以写成IE = 0x90;
}
void main(void)
{
uart();
while(1);
}
void uart_int(void) interrupt 4 //串口中断函数
{
while(RI == 0);
P0= SBUF;
P2=0xfe;
RI = 0;
delay_ms(500);
P2=0xff;
}
发送端:
#include<reg52.h>//包含单片机对应的头文件
#include<intrins.h>
void delay_ms(unsigned int time) //延时毫秒数
{
unsigned int i,j;
for(i=time;i>0;i--)//i不断减一,知道i大于0条件不成立为止
{
for(j=125;j>0;j--)//i不断减一,知道i大于0条件不成立为止
{;}
}
}
unsigned int po[10]={0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void uart(void)
{
SCON=0x40; //选择工作方式一
PCON=0x00;//不选择波特率倍增
REN=1; //允许接收数据
TH1 = 0xcc; //由于用到串口,设置波特率
TL1 = 0xcc;
/*
TH1 TL1 这两个等于0XFD 必须一样吗? 单片机的指令
不一定一样,看你需要做什么用了?
如果是8位自动重装载的,就必须一样。
如果是13位或16位定时器,就不必一样。*/
TMOD = 0x20; //工作方式2:自动装入8位计数器 (TMOD:工作方式寄存器)
TR1 = 1; //启动定时器(定时控制寄存器TCON
TI=0; //清零发送标志
RI=0; //清零接受标志
}
void main(void)
{
int i;
uart();
delay_ms(100);
for(i=0;i<10;i++)
{
SBUF=po[i];
while(TI == 0);
TI=0;
P0=po[i];
delay_ms(1000);
}
}
如图:
第二篇:单片机多机通信中从机串口中断服务程序设计
第6期20xx年12月
微 处 理 机
MICROPROCESSORS
No.6
Dec.,2008
?微机应用?
单片机多机通信中从机串口中断服务程序设计
洪 沙,阳翰凌
(重庆大学软件学院,重庆400030)
摘 要:论述了在单片机多机通信中从机侧带有数据校验和重发机制的串口中断服务程序的
设计。首先介绍了单片机中串口的工作方式,然后给出硬件连接环境,最后在论述从机侧串口中断服务程序设计的时候给出了单片机多机通信中使用的数据结构、通信流程、序流程图以及状态迁移图。
关键词:单片机;多机通信;串口;从机;中图分类号:TP202 文献标识码:B ()-03
TheDesignofSlave’sSrialiMulti-communication
HONGHan-ling
SoftChongqingUniversity,Chongqing400030,China)
Thisdescribesthedesignofslave’sserialISRwhichcanverifydataandretransmitdatainchipmulti-communication.First,describestheworkmodeofserialport,andthenshowsthehardwareconnectiondiagram,anddescribesthedesignofserialISRfinally.
Keywords:Single-chip;Multi-communication;Serialport;Slave;ISR
1 引 言
单片机与外界的通信主要靠串口进行,而串口发送和接收数据又主要靠串口中断服务程序来控制,因此串口中断服务程序的编写是单片机多机通信中的关键环节,而拥有消息验证和重发机制的串口中断服务程序无疑给单片机多机通信中消息的正确传输带来了更高的可靠性。
行数据通信的控制。其单元地址为98H,位地址为98H~9FH。寄存器内容如表1所示,解释如下:
表1 串口控制寄存器
位序D7
位地址9FH位名SM0
D6
9EHSM1
D5
9DHSM2
D4
9CHREN
D39BHTB8
D29AHRB8
D1D099H98HTIRI
1)SM0、SM1:串口工作方式选择位。其状态组合如表2所示。
表2 串口工作方式选择
SM0SM1工作方式功能描述波特率
fosc/1200方式08位同步移位寄存器
01方式110位UART可变
focs/32或focs/6410方式211位UART
11方式311位UART可变
2 串口介绍
对于单片机来说,为实现串行通信,在单片机内
部都设计有串口电路。MCS-51的串口是一个可编程的全双工串行通信接口,通过软件编程可以用作通用异步接收和发送器(UART),也可以用作同步移位寄存器。其帧格式有8位、10位和11位,并能设置各种波特率,使用灵活方便。
MCS-51的串口是可编程接口,通过对两个特殊功能寄存器SCON和PCON的初始化编程,可以实现对串口的控制。2.1 串口控制寄存器(SCON)
SCON是一个可位寻址的专用寄存器,用于串
2)SM2:多机通信控制位。
3)REN:接收使能位。
4)TB8:发送数据的第九位。5)RB8:接收数据的第九位。6)TI:发送使能位。
7)RI:接收使能位。2.2 电源控制寄存器(PCON)
电源控制寄存器内容如表3所示。最高位
作者简介:洪沙(1962-),男,重庆人,工学博士,副教授,硕士生导师,主研方向:控制工程及智能计算、数字图像处理、软件工程。
收稿日期:2006-10-20
? 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.
?154?
微 处 理 机20xx年
SMOD是串口波特率增倍位。当SMOD=1时,串口
的波特率加倍。系统复位时,SMOD=0。
表3 电源控制寄存器
位序
D7
D6/
D5/
D4/
D3GF1
D2GF2
D1PD
D0IDL
数据帧,但不是发给本机的,此时RI不置1,SBUF
中所接收的数据将全部丢失。
串口的工作方式3与工作方式2相似,不同的仅仅是波特率。
位名SMOD
2.3 串口的工作方式
3 从机侧串口中断服务程序设计
多机通信的硬件环境可以抽象地描述为主机和
从机都通过串口连接到UART总线上,从而形成一个主机多个从机的通信环境,其具体硬件连接在此不进行讨论。在单片机多机通信中,为了保证消息的正确发送和接收,3.,其值是从机地址,9位TB8置1。3.2主机与从机间验证消息结构
验证消息是主从机之间用来确认传输的数据是否正确的一个特殊消息,它包括以下几个方面:
(1)字节数:表示验证消息的长度,但是不将自身所占字节数包括在内,这里为一个固定值3,即表示验证消息中地址占一个字节,关键字占一个字节,表示上一组消息是否正确的标志占一个字节;
(2)地址:从机的地址,与查询帧中的地址一致;
(3)关键字:表示这一条消息为验证消息,由主机和从机之间约定,比如0xff;
(4)上组消息是否正确:表示主机与从机之间的上一次通信是否正确(说明见下文)。3.3 主机与从机间通信的一组消息结构
主机与从机间通信的一组消息结构,如图1所示
。
在单片机多机通信中,串口的工作方式主要为方式2或者方式3,所以首先介绍一下串口的这两种工作方式。如上所述,串口工作方式的选择是通过SCON特殊功能寄存器中的SM0、SM1两位来实现的,将串口的工作方式选择为2或者3,只需把SM0,SM1两位设为1、0或者1、1即可。
在工作方式2下,串口为11位帧格式的异步通信接口。接收或发送一帧数据的格式为:1个起始位,8位数据位,1位可编程位和1。
发送前,TB8(奇偶校验位或地址),据写入S写S”指令把8位数据转入S,TB8装入发送移位寄存器的第9位上TXD(P3.1)端输出。一帧数据发送完毕后,由硬件将TI置位,并申请中断。
接收时,先将REN置1,使串口处于接收状态,同时还要将RI清0。在满足此条件的前提下,再根据SM2的状态和所接收到的RB8的状态决定串口在数据到来后是否使RI置1,并申请中断,接收数据。
当SM2=0时,不管RB8是0还是1,RI都置1,接收发来的信息,并申请中断。
当SM2=1,且RB8是1时,表示在多机通信状态下,接收的信息为地址帧,此时RI置1,串口接收发来的信息,并申请中断。
当SM2=1,且RB8是0时,表示接收的信息为
图1 一组消息结构
(1)长度:这一组消息的字节总数,不包括本身所占字节;
(2)消息个数:这一组消息中包含的消息个数;(3)消息:主机与从机之间共同定义的数据传输格式;
(4)CRC校验:应用特定CRC(循环冗余校验)算法得出的一个值,用来校验数据传输的正确性。主机在发送一组消息之前,用特定的算法就这一组消息的内容得出一个占一个字节的值。当从机全部
接收完这一组数据之后,应用相同的算法重新计算这一组消息的CRC值,并用重新计算的值与主机下发下来的值进行比较,正确则表示传输的数据正确,那么下一次通信的验证消息中的上组消息是否正确标志位为真,否则为假。3.4 从机与主机通信流程
从机与主机通信流程如图2所示。这里首先要说明的是,主机与从机间的通信,只有在发送查询帧时第9位TB8才为1,发送其它数据时TB8都为0。
? 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.
6期洪 沙等:单片机多机通信中从机串口中断服务程序设计
?155?
主机对从机的访问采用轮询的方式,主机每隔10ms
向一个从机发送一帧查询帧,帧的内容为从机地址。从机接收到主机的查询帧以后,如果与本机地址不符,则将SCON寄存器中的SM2位置1,不接收主机下发下来的数据;如果与本机地址相符,则给主机回一个查询帧,内容与主机的查询帧一致,同时将SCON寄存器中的SM2位清0,准备接收主机下发的数据。然后从机再向主机发送一条验证消息来告诉主机上一次下发的一组消息中是否有错误,如果有错误,主机要重新传送上一次的数据;主机收到从机发来的验证消息后也给从机回一条验证消息来告诉从机上一次上传的消息中是否有错误,如果有错误则从机也要重新传送上一次的数据,当同一组消息的重传次数大于3次后,不再重传,开始传送新的一组消息。如果双方的验证消息都正确,接开始新的一组消息的传送
。
图2 从机与主机通信流程
3.5 从机侧串口中断服务程序流程图
从机侧串口中断服务程序流程图如图3
所示。
的时候需要将串口的中断优先级设为高级,即将中断
优先级控制寄存器(IP)中的PS位置1。为了保证可以重传上一组消息,在从机传送完一组消息以后,仍然把该组消息保存在队列中,等确定传送正确或者重传次数超过3次以后再从队列中将其删除。3.6 串口收发状态设计
根据主从机之间的通信流程,为了实现对从机串口收发的严格控制,可以给串口的收发分别加上状态控制。现将单片机串口收发时的状态描述如下:
(1)接收状态包括:接收空闲;接收验证消息;接收一组消息;
(2)发送验证消息;;
;
(4)当接收到主机下发的查询帧的时候,将接收和发送状态分别置为接收验证消息和发送验证消息状态;
(5)当发送完验证消息以后,如果已经接收了主机下发的验证消息,则将发送状态置为发送一组消息状态,如果还没接收主机下发的验证消息,则将发送状态置为发送空闲状态;
(6)当接收完主机的验证消息,如果已经发送完了验证消息,则将接收状态置为接收一组消息状态,并将发送状态置为发送一组消息状态,开始发送数据,如果还没发送完验证消息,则将接收状态置为接收空闲状态;
(7)当发送和接收完一组消息后,发送和接收的状态分别回到发送空闲和接收空闲的状态。状态迁移图如图4
所示。
图4 串口收发状态迁移图
4 结束语
在单片机中,串口是唯一对外通信的接口。在
多机通信环境中,串口担负着从机与主机之间的通信任务,而串口数据的收发又主要靠串口中断服务
(下转第158页)程序来控制,
图3 从机侧串口中断服务程序流程图
在从机侧为了保证通信的正常,在单片机初始化
? 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.
?158?
微 处 理 机20xx年
糊规则进行模糊推理,查询模糊矩阵表在线对Kp、Ki和Kd进行调整
[3]
。
误差等方面明显优于传统PID控制。在位置调节器
中采用自适应模糊PID控制使得系统在参数变化时依然具有较快的响应能力和较强的鲁棒性
。
图3 自适应模糊PID控制器结构
其中u(k)=Kpe(k)+Ki∑e(k)+Kdec(k)
根据上式可以看出|e|和|ec|的大小变化对系统输出u的影响程度是不同的,为了使控制对象具有良好的动态性能和静态性能,参数Kp、Ki和Kd的在线模糊自整定应遵循如下规则:
(1)当|e|较大时,即误差较大,为了加快系统的响应速度,应把Kp取得大一点;为防止|ec过大,Kd应该取较小一点的值的超调,,即取Ki=0(2)当|,为使系统的超调量减小,Kp、Ki和d都不宜取大,应取较小的Kp,而Ki和Kd大小应适中,以保证系统的响应速度。
(3)当|e|较小时,为使系统具有良好的稳态性能,应增大Kp、Ki的值,同时为提高系统的抗干扰能力并避免系统在设定值附近出现震荡现象,应选取适当的Kd值,其原则为:当|ec|较小时,Kd应取大一些;当|ec|较大时,Kd应取小一些。
图PIPID调节的比较
DSP为主处理器,CPLD为协处理器的无刷直流电机控制系统较以往单独以DSP作为控制核心的系统而言,利用了CPLD强大的逻辑功能及对电流的斩波功能大大减轻了DSP的工作负担,使DSP能够完成更为复杂的控制算法且控制的实时性得到了保障。其中对位置环采用模糊自适应PID的控制策略。仿真结果表明,与传统PID控制方式相比,系统的响应能力、控制精度、稳态性等方面均得到明显改善。
参考文献:[1] 王晓明,王玲.电动机的DSP控制[M].北京:北京航
空航天出版社,2004.[2] 刘和平.TMS320LF240XDSP结构、原理及应用[M].
北京:北京航空航天出版社,2002.[3] 刘金琨.先进PID控制MATLAB仿真[M].北京:电子
工业出版社,2004.[4] HZLI.ZGONG.Dsp-basedmotioncontrolofanon-commutatedDClinearmotormodule[J].International
JournalofSoftwareEngineering,2005.[5] CongJ,RomesisM.Performance-drivenmulti-level
clusteringwithapplicationtohierarchicalFPGAmapping[C].DesignAutomationConference[S.l.],2002.
4 实验结果及分析
应用MATLAB仿真软件对位置控制器进行了
仿真,给定位置电压为U=1.2V,其中传统PID的参数选取为Kp=2,Ki=0.04,Kd=0.1,仿真结果如图4所示,模糊自适应PID算法明显比传统PID控制算法的效果要好。基于模糊推理的自适应模糊PID控制在降低超调量、加快调节速度和减少稳态
(上接第155页)
所以说串口中断服务程序是单片机与外界通信的关键。为了保证数据间的正确传输,虽然可以加入传输数据的校验和重发机制,但是数据的正确传输并不是单靠一个拥有传输数据校验和重发机制的串口中断服务程序所能保证的,还需要考虑多方面因素。因此,在如上所述的单片机多机通信环境中,从机侧的串口中断服务程序只能够保证数据在出现有限次错误的情况下(如3次)正确传输,当数据传输错误超过规定次数时,为了保证系统正常运行,只能丢失数据。对于这种情况,只能靠编写错误统计代码来
实现对丢失数据的统计,以便查找问题出现的原因。
参考文献:[1] 胡健.单片机原理及接口技术[M].北京:机械工业出
版社,2004.[2] 唐俊翟.单片机原理与应用[M].北京:冶金工业出版
社,2003.[3] 李华.MCS-51系列单片机实用接口技术[M].北京:
北京航空航天大学出版社,1993.[4] 朱宇光.单片机应用新技术教程[M].北京:电子工业
出版社,2000.[5] 李勋.单片机实用教程[M].北京:北京航空航天大学
出版社,2000.
? 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.