单片机实验
微机实验:双机双向串行通讯
实验目的
掌握串行通讯的原理和编程
实验内容:
在两次实验板之间进行串行通讯,其连接线路如图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条评论
快来发表一下你的评论吧 !