单片机实验
微机实验:双机双向串行通讯
实验目的
掌握串行通讯的原理和编程
实验内容:
在两次实验板之间进行串行通讯,其连接线路如图9-1示。
本实验将在两机之间实现双向通讯,既可以甲机向乙机发送,也可以乙机向甲机发送,两机具有相同的硬件配置和程序软件。
实验中,发送的数据由键盘输入。为了获得16进制数,键盘布置如同实验八中图8-2。两机的显示格式也相同,如图9-2示。
在一台机上,利用键盘输入16进制数后,一方面显示于本机的最左两只数码管,另一方面又通过串行通讯接口传送到另一台机上。该机接收到数据后,在本机的最右两只数码管上显示出来。
为实现上述功能,流程框图见图9-3。参考程序如下。
ORG 0000H |
|||
LJMP MAIN |
|||
ORG 0023 |
|||
LJMP COM |
|||
ORG 0780 |
;主程序 | ||
MAIN: |
MOV SP, #60H |
;设堆栈 | |
MOV DPTR, #0B000H |
;8155初始化 | ||
MOV A, #03H |
;A、B口输出,C口输入 | ||
MOVX @DPTR, A |
|||
MOV A, #11H |
;初始显示全“一” | ||
MOV R0, #2AH |
|||
MP0: |
MOV @R0, A |
||
INC R0 |
|||
CJNE R0, #30H, MP0 |
|||
MOV TMOD, #20H |
;T1方式 | ||
MOV TH1, #0F4H |
;波特率 | ||
MOV TL1, #0F4H |
|||
SETB TR1 |
;启动T1 | ||
MOV SCON, #50H |
;串行口方式,允许接收 | ||
MOV PCON, #00H |
|||
MOV PSW, #00H |
|||
CLR 00H |
;标志“00H”清零 | ||
SETB EA |
;开CPU中断 | ||
SETB ES |
;开串行中断 | ||
DIS: |
LCAL DISP |
;调用显示 | |
LCAL KS1 |
;键按下? | ||
JZ MP1 |
;无键按下,转 | ||
LCALL KEYP |
;键值送2AH、2BH | ||
MP1: |
SETB RS0 |
;选用工作区1 | |
MOV R0, #2AH |
;置传送数据块首地址 | ||
MOV SBUF, @R0 |
;发送第一字节 | ||
INC R0 |
|||
CLR RS0 |
;恢复工作区0 | ||
LJMP DIS |
|||
ORG 07D0 |
|||
COM: |
PUSH PSW |
;PSW入栈保护 | |
SETB RS0 |
;工作区1 | ||
JB R1 ,RX |
;若是接收,转 | ||
TX: |
CLR T1 |
;发送 | |
CJNE R0, #2C, TX1 |
;未发送完,转 | ||
SJMP TX2 |
;发送完 | ||
TX1: |
MOV SBUF, @R0 |
;继续发送 | |
INC R0 |
|||
TX2: |
POP PSW |
;恢复PSW | |
RETI |
|||
RX: |
JB 00H, RX1 |
;接收的不是第一个数据,转 | |
MOV R0, #2E |
;置接收数据块的首地址 | ||
SETB 00H |
|||
RX1: |
MOV @R0, SBUF |
;接收 | |
INC R0 |
|||
CJNE R0, #30H, RX2 |
;未接收完,转 | ||
CLR “00” |
;接收完,“00”位复0 | ||
RX2: |
POP PSW |
||
RETI |
实验要求:
将两次实验板按图9-1接线。把上述程序同时输入甲、乙两机,然后连续运行。在一台机上按键输入发送数据,检查另一台机上的接线数据。如出现不正常,可用单步或断点法检查。
思考题:
1、上述程序上,通讯波特率是多少?
2、串行通讯程序中,如何开始发送数据?又如何判别该数据已经发送?
3、串行通讯程序中,如何判断已经接收数据?又如何读出接收数据?
4、把甲机CPU内RAM 30~3FH的一组数据向乙机发送,乙机收到的数据放在片内RAM 30~~3FH。对显示和键输入没有要求。试编写程序。
全部0条评论
快来发表一下你的评论吧 !