基于单片机的双机通信程序设计.docx

上传人:b****2 文档编号:13979509 上传时间:2023-06-19 格式:DOCX 页数:19 大小:1.01MB
下载 相关 举报
基于单片机的双机通信程序设计.docx_第1页
第1页 / 共19页
基于单片机的双机通信程序设计.docx_第2页
第2页 / 共19页
基于单片机的双机通信程序设计.docx_第3页
第3页 / 共19页
基于单片机的双机通信程序设计.docx_第4页
第4页 / 共19页
基于单片机的双机通信程序设计.docx_第5页
第5页 / 共19页
基于单片机的双机通信程序设计.docx_第6页
第6页 / 共19页
基于单片机的双机通信程序设计.docx_第7页
第7页 / 共19页
基于单片机的双机通信程序设计.docx_第8页
第8页 / 共19页
基于单片机的双机通信程序设计.docx_第9页
第9页 / 共19页
基于单片机的双机通信程序设计.docx_第10页
第10页 / 共19页
基于单片机的双机通信程序设计.docx_第11页
第11页 / 共19页
基于单片机的双机通信程序设计.docx_第12页
第12页 / 共19页
基于单片机的双机通信程序设计.docx_第13页
第13页 / 共19页
基于单片机的双机通信程序设计.docx_第14页
第14页 / 共19页
基于单片机的双机通信程序设计.docx_第15页
第15页 / 共19页
基于单片机的双机通信程序设计.docx_第16页
第16页 / 共19页
基于单片机的双机通信程序设计.docx_第17页
第17页 / 共19页
基于单片机的双机通信程序设计.docx_第18页
第18页 / 共19页
基于单片机的双机通信程序设计.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的双机通信程序设计.docx

《基于单片机的双机通信程序设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的双机通信程序设计.docx(19页珍藏版)》请在冰点文库上搜索。

基于单片机的双机通信程序设计.docx

基于单片机的双机通信程序设计

前言

单片机的通信接口是各台仪表之间或仪表与计算机之间进行信息交换和传输的联络装置。

主要有五种类型,串行通信接口、并行通信接口、USB接口、现场总线接口以及以太网接口。

串行通讯是单片机的一个重要应用。

本设计就是利用两块单片机来完成一个系统,实现单片机之间的串行通讯。

 

随着计算机的不断普及,在我们的周围可能会同时出现多台微型计算机,而且这些计算机的牌号,后型号不同,而且有的格式不兼容。

于是利用单片机串行口实现不同计算机之间的相互通信,以达到信息或程序的共享是非常有用的。

从智能家用电器到工业上的控制系统都采用了上位机与下位机基于串行通信的主从工作方式,这样就充分利用了微机分析处理能力强、速度快的特点及下位机(单片机)面向控制、使用灵活方便的优势。

利用多机通讯构成的分布式系统逐渐普及。

本实验就点对点的双机通信进行训练。

学习串口的工作方式,初始化编程,和单片机与单片机点对点通信的编程方法以及硬件电路的设计方法。

 

1.总体设计方案

1.1串口通信的设计原理

复位电路复位电路

单片机单片机

电源电路电源电路

时钟电路时钟电路

按键输入1位LED数码管

显示电路

图1串口通信的设计原理框图

本次设计用于两片89S51,PC机的串行口采用的是标准的RS232接口,单片机的串行口电平是FTL电平,而TTL电平特性与RS232的电气特性不匹配,因此为了使单片机的串行口能与RS232接口通信,必须将串行口的输入/输出电平进行转换。

通常用MAX232芯片来完成电平转换。

单片机的发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。

接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。

接收方接收后,在数码管上显示接收的信息,实现串口通讯数据的发送和接收,该系统可采用max232进行串口通讯数据传送。

可用LED显示发送的相应据。

1.2数据传输方案比较与选折

在串行通信中,数据是在两个站之间传送的。

按照数据传送方向,串行通信可采用三种方案。

方案一:

单工制式

单工制式是指甲乙双方通信只能单向传送数据。

图2单工制式

方案二:

半双工制式

半双工制式是指通信双方都具有发送器和接收器,双方既可发送也可接收,但接收和发送不能同时进行,即发送时就不能接收,接收时就不能发送。

 

图3半双工制式

方案三:

全双工制式

全双工制式是指通信双方均设有发送器和接收器,并且将信道划分为发送信道和接收信道,两端数据允许同时收发,因此通信效率比前两种高。

 

图4全双工制式

因此,本文选择方案三,全双工制式来实现数据传送。

1.3控制部分的电路

由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。

由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数,使编写程序变得非常简单。

且经过上学期对单片机课程的学习,我们对单片机的应用比较熟悉,运用灵活,所以用单片机来实现本次课程设计。

2.硬件系统设计

本设计选用以89S51单片机为主控单元,显示部分采用8段LED数码管动态显示。

2.1时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

此电路采用12MHz的石英晶体。

时钟电路如下图:

图5时钟电路

2.2复位电路

复位是单片机的初始化操作,进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。

RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,若使用频率为12MHz的晶振,则复位信号持续时间应超过4s才能完成复位操作。

复位操作有上电自动复位和按键手动复位两种方式。

上电自动复位是通过外部复位电路的电容充电来实现的。

按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。

在本设计中采用了按键电平方式如下图:

图6按键电平的连接方式

2.3单片机串行通信功能

51单片机的串行接口是一个全双工的接口,它可以作为通用异步接受和发送器用,也可以作为同步移位寄存器用。

51单片机串行接口的结构如下图所示:

图7单片机串行接口的结构

(1)数据缓冲器(SBUFF)

接受或发送的数据都要先送到SBUF缓存。

有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。

(2)串行控制寄存器(SCON)

SM0,SM1:

串行接口工作方式选择位,串行接口工作方式可有以下四种工作方式:

表1工作方式

SM0

SM1

工作方式

功能

波特率

0

0

0

8位同步移位寄存器(用于I/O扩展)

fORC/12

0

1

1

10位异步串行通信(UART)

可变(T1溢出率*2SMOD/32)

1

0

2

11位异步串行通信(UART)

fORC/64或fORC/32

1

1

3

11位异步串行通信(UART)

可变(T1溢出率*2SMOD/32)

定时器TI溢出率=(fosc/12)*(1/(2^k-初值))式中T1计数率=fORC/12,(2^k-初值)为生溢产出所需机器周期数,K为定时器位数,与定时器设定工作方式有关:

方式0时K=13;方式1时K=16;方式2时K=8。

SM2:

多机通信控制位。

主要用于方式2,3.当SM2=1时可以利用收到的RB8来控制是否激活RI,当SM2=0时均可以将数据送入缓存器,并激活RI。

REN:

接收允许控制位。

软件置1允许接收;软件置0禁止接收。

TB8:

方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。

RB8:

在方式2或3时,RB8位接收到的第9位数据,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。

TI:

发送中断标志。

发送完一帧数据后由硬件自动置位,并申请中断。

必须要软件清零后才能继续发送。

RI:

接收中断标志。

接收完一帧数据后由硬件自动置位,并申请中断。

必须要软件清零后才能继续接收。

(3)输入移位寄存器

接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。

(4)波特率发生器

波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。

(5)电源寄存控制器(PCON)

其最高位为SMOD即波特率倍增位,当SMOD=1时波特率提高一倍,复位时,SMOD=0。

2.4MAX232芯片

电平转换芯片MAX232专用于进行将TTL电平转换为RS232电平的芯片,MAX232内部有泵电源,能将+5V电源电压在芯片内提高到RS232电平所需的+10V或者-10V电平。

引脚介绍:

第一部分是电荷泵电路。

由1、2、3、4、5、6脚和4只电容构成。

功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14脚构成两个数据通道。

其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。

8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。

第三部分是供电。

15脚GND、16脚VCC(+5v)。

图8MAX232芯片

2.5整体连接原理图

P1.7——P1.0口分别接DP,G,F,E,D,C,B,A,其整体连接图如下:

图9整体连接原理图

3.软件设计

3.1串行通信软件设计

软件部分,通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。

主机收到BBH后就把数码表TAB[16]中的10个数据送给从机,并发送检验和。

从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。

从机收到16个正确数据后送到一个数码管显示。

3.2程序流程图

(1)

发送端

 

图10发送端程序流程图

串行口工作于方式1,用定时器1产生9600bit/s的波特率,工作于方式2,即TMOD=0x20。

功能:

将本机ROM中数码表TAB[16]中的16个数发送到从机,并保存在从机内部ROM中,从机收到这16个数据后送到一个数码管循环显示。

通信协议:

主机首先发送连络信号(AAH),从机接收到之后返回一个连络信号(BBH)表示从机已准备好接收。

(2)接收端

通信过程使用校验和校验。

从机接收到16个数据后,进行校验和检查,若数据没有错误,则返回00H,否则返回FFH。

主机发送一个数据后,等待从机返回数据;若为00H,则继续发送下一个数据,若为FFH,则重新发送数据。

 

图11接收端程序流程图

3.3LED显示原理

LED多数情况用于显示数字,对于十六进制的,要将0~F的数字用7段显示,必须将数字转换为LED对应七段码的信息,比如,要显示“0”,就是让a、b、c、d、e和f段发光,显示“1”,让b和c段发光,等等如表所示。

然后根据LED是共阴极还是共阳极接法确定LED各输入端应接逻辑1还是逻辑0,我选用的是共阴接法,要显示“0”时,a、b、c、d、e和f段就要输入逻辑1,即其段码为3F,通过从机的P1口将编码输出给LED。

4.系统调试与仿真结果

4.1软件调试

系统软件设计利用Keil进行C语言编写。

在系统的软件设计中采用了模块

化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。

实验的程序通过Keil软件编译,打开Keil软件,首先,建立工程文件,然后新建一文档,输入自己编写的程序,保存为.C文件。

然后再单击AddFilestoGroupSourceGroup1。

然后勾选生成.HEX文件,最后点击编译。

图12编译输出结果

此过程是在Keil软件中编写双机通信的C语言程序,通过Keil软件验证程序的对错与否,在此基础上来改正,直至程序编写成功,并由此软件生成HEX文件,可通过此文件调试开发板,验证所做的双机通信是否成功。

4.2仿真结果

通过Proteus进行仿真,将所生成的“.HEX”文件加载到已绘制好的Proteus原理图中,使Proteus与Keil真正连接起来,实现联合调试。

调试结果如图所示:

可以看到,接收端已将接受到的数据完整的显示了出来。

按下“开始”后,数码管开始工作,仿真结果如附录所示。

5.设计总结

本次课程设计实现的是单片机双机串行通信的功能。

在进行设计的初期,先查询了书本知识,了解了相关的原理之后,先进行了自发自收通信功能的设计,由于设计电路比较简单,而且程序也比较好懂,所以在原理方面没有遇到什么问题,主要的问题就是熟悉两个软件KEIL和PROTEUS的使用。

但是在后来调试实物的时候,由于单片机整块板子上面有许多可以利用的电路,所以为了方便,修改了一些程序,把输出显示接在了P0口,因为P0口与流水灯相连接,利用流水灯来完成相关的显示,刚开始的时候仿真总是不出来,后来才发现P0口没有自带的上拉电阻,所以在P0口加了上拉电阻之后,仿真开始正常进行。

在设计双机串行通信的功能时,由于根据题目的要求甲机发送而乙机接收,所以就选择做了单工通信的功能。

对于显示电路来说,由于传送的是两位数据,所以选用了两个数码管进行显示。

程序编程方面,刚开始在KEIL中进行编程生成.HEX文件时,总是生成不了,后来经过查询资料得知有可能是我装的软件不是破解版的,当进行短程序编程时可以正常进行,但是当程序比较长时,就不能生成.HEX文件。

还有就是程序运行正常之后,数码管的显示跳得太快了,根本无法捕捉到所有数据的显示,刚开始还比较迷茫,不知道该从哪个地方开始调,后来经过同学的帮忙,修改了单片机中的频率之后,可以清楚地看到接收的每一个数据。

经过本次课程设计,我知道了团队的力量,一个人是完成不了这么多的。

我们不仅掌握了双机串行通信的相关原理和实现方式,还深化了对汇编语言中断程序设计的了解。

其实,这整个课程设计不仅需要个人知识的储备,还需要在不断的实践中发现自己存在的不足。

同时,与同学的交流不仅能让自己进步,有时候还能点醒自己在哪些方面做得不对,哪些方面需要改正。

从这种实践课程我学到了从书本上学不到的知识,提高了我的实践能力和解决问题的能力。

6.参考文献

[1]谭浩强.C语言程序设计[M].清华大学出版社,1999.12.125-142

[2]杨恢先,黄辉先.单片机原理与应用[M].人民邮电出版,2009.7.234-256

[3]朱定华.单片机原理与接口技术[M].电子工业出版社,2001.4.276-284

[4]王威.HCS12微控制器原理及应用[M].北京航空航天大学出版社,2007.10.167-179

[5]龚运新.单片机C语言开发技术[M].北京清华大学出版社,2006.10.145-163

[6]胡洪波.单片机原理与应用实验教程[M].湘潭大学出版社,2009.7.68-83

[7]汪道辉.单片机系统设计与实践[M].电子工业出版社,2006.5.89-104.116-135

[8]李明,李君君.单片机原理与接口技术[M].大连理工大学出版,2006.5.89-104.116-135

 

附录

附录一:

元件清单

元件名称

型号

数量

单片机

AT89C51

2

电平转换芯片

Max232

2

数码管

八段LED

1

电阻

RES

4

晶振

CRYSTAL

2

电容

CAP

12

 

附录二:

源程序

1.主机发送程序

#include//头文件

#defineucharunsignedchar//定义数据类型

voidinit();//定义子程序

voidsend();

ucharTAB[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码表

uchari,sum;//定义变量

intj;

main()//主程序

{init();

send();

}

voidinit(void)//程序初始化

{EA=1;//开CPU中断

ES=1;//允许串行口中断

TMOD=0x20;//设定时器T1为方式2

TH1=0xfd;//赋初值

TL1=0xfd;

PCON=0x00;//令SMOD=0波特率不倍增

SCON=0x50;//串行口为方式1

TR1=1;//启动T1

}

voidsend(void)//发送子程序

{do

{SBUF=0xaa;//主机送AAH给从机

while(!

TI);//等待一帧发送结束

TI=0;//发送完后清零

while(!

RI);//等待一帧接收结束

RI=0;//接收完后清零

}

while((SBUF^0xbb)!

=0);//等待从机回答,返回BBH后继续

do

{sum=0;//清校验和

for(i=0;i<=15;i++)

{SBUF=TAB[i];//主机发送数据

sum+=TAB[i];//求检验和

while(!

TI);

TI=0;

}

SBUF=sum;//发送校验和

while(!

TI);

TI=0;

while(!

RI);

RI=0;

}

while(SBUF!

=0);//等待

}

2.从机接收程序

#include//头文件

#defineucharunsignedchar//定义数据类型

#defineuintunsignedint

voiddelay(int);//定义子程序

voidreceive(void);

voidinit(void);

uchari,sum;

intj;

ucharTAB[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码表

voidmain()//主程序

{init();

receive();

}

voidinit(void)//程序初始化

{EA=1;

ES=1;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

PCON=0x00;

SCON=0x50;

TR1=1;

}

voiddelay(intx)//延时子程序

{inti,j;

for(i=0;i

for(j=1;j<=150;j++);

}

voidreceive(void)

{ucharTABS[16];

do

{while(!

RI);RI=0;}

while((SBUF^0xaa)!

=0);//等待主机发送AAH

SBUF=0xbb;//从机收到BBH后向主机回复BBH

while(!

TI);TI=0;

while

(1)

{sum=0;

for(i=0;i<=15;i++)

{while(!

RI);RI=0;

TABS[i]=SBUF;//接收数据保存

sum+=TABS[i];//求接收校验和

}

while(!

RI);RI=0;

if((SBUF^sum)==0)//判断发送与接收的校验和是否相等

{SBUF=0x00;//校验和相等发送00H给主机

while(!

TI);

TI=0;

break;//跳出接收循环

}

else

{SBUF=0xff;//校验和不等,发送FFH给主机

while(!

TI);

TI=0;//发送成功,清零,进入下一次接收循环

}

}

while

(1)//显示输出

{for(i=0;i<=15;i++)

{P1=TABS[i];

delay(500);

}

}

}

附录三:

原理图

 

附录四:

仿真图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2