单片机双机之间的串行通信设计.docx
《单片机双机之间的串行通信设计.docx》由会员分享,可在线阅读,更多相关《单片机双机之间的串行通信设计.docx(16页珍藏版)》请在冰点文库上搜索。
单片机双机之间的串行通信设计
单片机双机之间的串行
通信设计
专业方向课程设计报告
题目:
单片机双机之间的串行通信设计
单片机双机之间的串行通信设计
1.设计要求:
两片单片机利用串行口进行串行通信:
串行通信的波
特率可从键盘进行设定,可选的波特率为1200.2400、
4800和9600bit/so
二、方案论证:
方案一:
以两片51单片机作为通信部件,以4*4矩阵键盘作为数据输入接口,通过16个不同键值输入不同的信息,按照51单片机的方式3进行串口通信,从机采用中断方式接收信息并按照通信协议改变波特率或者用I/O口输出、CD4511译码、数码管显示相关数据,整个系统的软件部分采用C语言编写。
方案二:
整个系统的硬件设计与方案一样,但是通信方式采用方式一进行通信,主从机之间的访问采用查询方式,数据输出直接由单片机的译码程序输出译码数据,同时软件编写采用汇编语言。
两种方式从设计上来说各有特色,而且两种方式都应该是可行的。
方案一中按照方式三通信可以输出九位数据而方式一只能输出八位数据,但就本题的要求来说方式一就可以了。
主从机之间的交流采用中断方式是一种高效且保护
单片机的选择,但是相比之下本人对查询方式的理解更好一些。
数码管的显示若采用CD4511译码则直接输出数据就可以了,但是这样会增加硬件陈本,而且单片机的资源大部分都还闲置着,所以直接编写一段译码程序是比较好的做法。
另外在软件编写上,采用C语言在后续设计中对硬件的考虑稍少一些,换言之采用汇编可以使自己对整个通信过程及单片机的部分结构有更清晰地认识所以综合考虑采用方案二。
三、理论设计:
采用AltiumDesigner绘制的原理图(整图)
本系统主要包括五个基本模块:
单片机最小系统(包括晶振电路、电源、复位电路及相关设置电路)、4*4矩阵键盘、功能控制电路、数据显示电路、波特率更改指示电路。
本设计的基本思路是通过控制口选择将要实现的功能,然后矩阵键盘输入数据,单片机对数据进行处理(加校验码、设置功能标志位),然后与从机握手,一切就绪之后后就开始发送数据,然后从机对接收数据校验,回发校验结果,主机根据校验结果进行下一步动作,或者重发,或者进入下一数据的发送过程,然后按照此过程不段
循环,直到结束。
单片机最小系统:
接上电源和地,
晶振电路提供脉冲,加上复位电路,将EA接入高电电平选择片内程序存储器。
这是一个单片机能够工作的最低设置。
「A
亠
厂A
厂A
厂H
L—I—.
A&兀~~
亠
—<—*
亠
厂A
■
叫曲
hl
匚席
「4
厂4
「4
J也
4*4矩阵键盘:
将矩阵键盘接入p1口通过按键扫描程序读写P1口从而判断有无安键按下,通过查键值程序确定其键值从而得到输入数据。
这
VCC
是整个系统的输入接口。
功能控制电路:
控制键(图中为K3)被按下时为低电平,否则为高电平,这样就可以根据读入的的电平差别控制通信系统的功能。
高电平时让
从机显示接收到的数据,低电平从机更改波特率。
主机软件流程图从机软件流程图
><•/*>尸Sep**
議•亍♦
chuankow•ISK^ofwxvooMl(AninvMiti今)
$e«zceCrl>pTe<^4«te»4p
<•
指示灯未亮表明此时从机来谏
JL波特率,以初始氷轻率工作
控聃悅未被扶下
L.
q
H
lE
控辆键未祓按
下时,从机JL示接收列刘的数据
Hr75c*»EcftT©«4>D*exg«Gr^ph
D:
・疲a詡口♦
小3巧0BMC
ouiRjr砂PCXaCR
QMOIVOeus
2DN»U1GU:
|AMM\T»CSCCCCC皿Rmi3,N切
幻”S以卜竝UxcryTeM松Heb
专毀纯傀ZXHH*4♦■壬:
ruM4uQ3>-'"m/A?
cor
【匕恥・勺
指示灯亮表明通信系统此时以指定波特率
控制键被按下时,从机不显示数据
下图是系统软件仿真的结果,以下现象表明系统能正常工作并实现预设结果。
五、作品功能和使用说明:
接上电源系统开始工作,功能件控制从机功能,键盘输入数据,主机发送数据,从机接收数据。
当控制键未
被按下时,从机显示接收到的数据;控制键被按下时从机不再显示数据,只更改波特率,同时点亮相应的指示灯。
指示灯会指示当前工作的波特率,灯不亮时单片机以默认波特率工作。
系统断电时结束通信。
六、心得体会:
经过这几天的努力终于将设计完成了。
整个过程虽然遇到很多问题,但是确实感觉又学到了了不少东西。
整个系统的设计很快就决定下来了,但是在软件编写完之后进行软件仿真时,一直不能不能成功。
然后一步步的查错,从功能流程图开始,一步步检查,理清系统的时序逻辑关系。
确保逻辑功能没问题后,对软件进行调试,逐步调试、设置相关寄存器、查看相应的io口,然后发现这里也没什么问题。
于是直接在程序中设置标志位,观察程序的运行情况。
后来发现问题主要出现在两个地方:
一是软件不能自动返回,重复执行,于是在程序中增加了循环语句和返回语句;二是没有正确保存数据和取数据,主要体现在查键值后没有保护数据及进行校验后没有进行重取原数据,这是两个非常易错的问题。
另外功能上单片机之间的“握手”和等待通讯过程也是非常重要的。
另外在硬件制作时也遇到了一些问题,主要是在制作PCB板时由于腐蚀过度导致出现了很多断路,以至调试时得检查电路,同时对整个系统的美观造成很大影响。
不过,这次设计确实让我对通信过程有更深的理解。
七、参考文献
[1]李建忠.单片机原理及应用(第二版.西安电子科技大学出版
⑵何小艇.电子系统设计(第四版.浙江大学出版社)
系统程序:
/*****************************導*******$*****************************
*约定:
主机发送呼叫信号nOEH;咨询从机是否可以接受数据*
*从机发送"01H”表示可以接受,否则发送”02H"表示暂时不能接受数据*
*主机只有收到了应答信号"01H”才向从机发送数据,否则继续呼叫*
*主机收到“OFH”表示发送正确,收到“FOH”表示发送错误**设置:
串口工作于方式1,定时器做波特率发生器工作于方式2,SMOD=L*
*波特率为1200时计数初值为DO,2400-E8H,4800-F4H,9600-FAH*
*两片单片机开始波特率设为4800*
*通过按键进行功能选择,按下=0设置波特率未按=1数据显示*
主机程序:
/**$***$*★*$***#**发送程序*$*$***$*$***$*$****/
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVTMOD,#20H:
置定时器/计数器1工作于方式2定时
MOVTL1,#OF4H
:
置定时器/计数器1初值,初始波特率为4800
MOVTH1,#OF4H
:
置重装值
MOVPCON,#80H
;SMOD=1
MOVSCON,#5()H
;串行口工作于方式1
SETBTRI
/****************首先进行查键子程序***************/
REGAIN:
ACALLKEY
MOVR1,A
ACALLHUJIAO
AJMPREGAIN
/**$*$*$***$*按键扫描之*****$***$*****/
KEY:
ACALLKS1;调用判断有无键按下子程序
JNZLK1;有键按下(A)=0,
AJMPKEY
LK1:
ACALLDELAY
ACALLKS1
JNZCKEY
AJMPKEY
CKEY:
MOVR2,#7FH
MOVR4,#00H
CKEY1:
MOVP1,R2
JB,LONE
MOVA,#00H
A.JMPLPK;转到键值计算子程序
LONE:
JB,LTVVO
MOVA,#04H
AJMPLPK
LTWO:
JB,LTHR
MOVA,#08H
AJMPLPK
LTHR:
JB,NEXT0
MOVA,#0CH
LPK:
ADDA,R4
PUSHACC
LK3:
ACALLKS1
JNZLK3
ACALLDELAY
POPACC
RET
NEXTO:
INCR4
MOVA,R2
JNB,KEND
RRA
MOVR2,A
AJMPCKEY1
KEND:
AJMPKEY
KS1:
MOVP1,#OFH
MOVA,Pl
CPLA
ANLA,#0FH
RET
/************然后呼叫从机***************/
HUJIAO:
CALLDELAY
MOVA,#0EH
CPL
MOVSBUF,A
WAITl:
JBCTI,TXYES;等待发送完成
SJMPVVAIT1
TXYES:
JBCRI,NEXT1;等待从机回答
SJMPTXYES
NEXTl:
MOVA,SBUF;判断从机是否同意,不同意则继续呼叫
CJNEA,#01H,HUJIAO
PANDUAN:
JB,XSHU;功能键被按下,则发送数据设置波特率,否则只显示发送数据
SHEZ:
MOVA.R1
SETB口显示=0设置波特率
MOVCf
MOV,C
MOVSBUF,A
VVAIT2:
JNBTIJVAIT2
CLRTI
VVAITC1:
JNBRIJVAITC1
CLRRI
CPL
MOVASBUF
CJNEA,#0FH,SHEZ
MOVA,R1
ANLA,#0FH
CJNEA,#00H,Ll
MOVTL1,#0D()H;重设波特率为1200
MOVTHl,#0D0H
LJMPFH
LI:
CJNEA,#01H,L2
MOVTH1,#OE8H
LJMPFH
L2:
CJNEA,#02H,L3
;重设波特率为4800
MOVTL1,#0F4H
MOVTH1,#OF4H
LJMPFH
L3:
CJNEA,#03H,FH
;重设波特率为9600
MOVTH1,#OFAH
LJMPFH
XSHU:
MOV
A,R1
MOV
C,p
MOV
c
MOVSBUF,A
VVAIT3:
JNBTIJVAIT3
CLR
TI
VVAITC:
.
JNB
RIJVAITC
CLR
RI
MOVTL1,#OFAH
;只显示数字时,A的高位不处理直接发送
MOVA$BUF
CJNEA,#0FH,XSHU
CLR
FH:
RET
/**********延时子程序*********/
DELAY:
MOVR6,#0FFH
LOOP1:
DJNZR6,LOOP1
RET
JS:
END
从机程序:
/*************稈命********************/
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
;置定时器/计数器1工作于方式2定
RSTRT:
MOVTMOD,#20H
时
;置定时器/计数器1初值,初始波特率
;置重装值
;SMOD=1
;串行口工作于方式1
MOVTL1,#0F4H
为4800
MOVTH1,#0F4H
MOVPCON,#80H
MOVSCON,#50H
SETBTRI
JIESHOU:
CLRTI
JNBRIJIESHOUCLRRI
MOVA,SBUF
CJNEA,#0EH,FA2
FA1:
MOVA,#01H
MOVSBUF,A
CPL
VVAIT1:
JBCTI,RX
SJMPVVAIT1
FA2:
MOVA,#02H
MOVSBUF,A
VVAIT2:
JBCTIJIESHOU
SJMPWAIT2
RX:
CLRTI
JNBRI,RX
CLRRI
MOVA,SBUF
MOVC,P
MOVR1,A
JCFAFO
FAOF:
MOVA,#0FH
MOVSBUF,A
VVAIT3:
JNBTI,VVAIT3
CLRTI
SJMPCHULI
FAFO:
MOVA,#0F0H
MOVSBUF,A
VVAIT4:
JNBTI,WAIT4
CLRTI
LJMPRX
CHULI:
MOVA,R1
JB,SHEZ冃显示=0设置波特率
XIANS:
ANLA,#0FH
LCALLDISPLAY
MOVTH1,#0F4H
;重设波特率为9600
;0
MOVP1,#OFBH
LJMPJS
L3:
CJNEA,#03H,JIE
MOVTL1,#0FAH
MOVTH1,#OFAH
MOVPl,#0F7H;CLR
JIE:
LJMPJS
/**********延时子程序*********/
DELAY:
MOVR6,#03FH
LOOP1:
DJNZR6,LOOP1
RET
/**********■^码序**********/
DISPLAY:
CJNEA,#00H,LTl
MOVA,#OO11X111B
SJMPLAST
LT1:
CJNE
LT2:
CJNE
LT3:
CJNE
LT4:
A,#01H,LT2
MOVA,#00000110BSJMPLASTA,#02H,LT3
MOVA,#01011011BSJMPLAST
A,#03H,LT4
MOVA,#010011116
SJMPLAST
A,#04H,LT5
;2
;3
CJNE
MOVA,#01100110B
SJMPLAST
CJNEA,#05H,LT6
MOVA,#01101101B
SJMPLAST
CJNEA,#06H,LT7
MOVA,#011111016
SJMPLAST
LT7:
CJNEA,#07H,LT8
MOVA,#00000111B
;7
SJMPLAST
LT8:
CJNEA,#08H,LT9
MOVA,#011111116
SJMPLAST
LT9:
CJNEA,#09H,LT10
MOVA,#01101111B
SJMPLAST
LT10:
CJNEA,#OAH,LT11
MOVA,#0111011IB
;8
;9
SJMPLAST
LT11:
CJNEA,#0BH,LT12
MOV
SJMPLAST
LT12:
CJNEA,#0CH,LT13
MOVA,#00111001B
SJMPLAST
LT13:
CJNEA,#0DH,LT14
MOV
SJMPLAST
LT14:
CJNEA,#0EH,LT15
MOVA,#01111001B
;C
;D
;E
SJMPLAST
LT15:
CJNEA,#0FH,LAST
MOVA,#01110001B
LAST:
MOVP2,A
RET
LJMPJIESHOU
END