51 单片机的串口通信与控制
扫描二维码
随时随地手机看文章
有个题目,要求用两台单片机进行串口通信,互相控制。
其电路图有些松散,重画如下:
;设计要求:
;甲机
;K1(P1.0, P3.3)控制乙机 L1(P2.0)亮、L2(P2.1)灭;
;K2(P1.1, P3.3)控制乙机 L1(P2.0)灭、L2(P2.1)亮;
;K3(P3.2)两机都亮。
;乙机
;K4(P3.3)控制串口向甲机发送按下的次数,此数字通过数码管(P0)显示。
;两台单片机的硬件资源是不同的,应该编写两个不同的程序。
;做而论道把它们融合在了一起,只是编写了一个程序,就综合管理了两部分资源。
;通过串口,共需要发送数据 0~9 和三种 LED 控制命令,这些,可以用一个字节来代表。
;数据 0~9,仅用一个字节的低四位即可,高四位可以令其为零。
;在高四位设置上 1,就可以当做命令使用。
;接收方根据最高位的状态,即可区分数据和命令。
;故此,根据电路的特点,设计三条命令如下:
;1000 0000 ;全亮
;1000 0001 ;L1 灭
;1000 0010 ;L2 灭
;在命令中的最低两位,就是直接控制 LED 的。
;由电路可以看出,按键,都是输入到外部中断引脚,因此,程序就应该用中断方式,以利高速响应按键。
;对于串口通信,可以使用常见的方法:查询式发送、中断式接收。
;做而论道写的程序,基本都是使用汇编语言编写。
;全部代码如下:
;===================================
sbit L1 = P2.0
sbit L2 = P2.1
sbit K1 = P1.0
sbit K2 = P1.1
sbit K3 = P3.2
sbit K4 = P3.3
sfr S_BUF = 30H
;----------------------------------
ORG 0000H
JMP START
ORG 0003H
JMP X0_INT
ORG 0013H
JMP X1_INT
ORG 0023H
JMP UART_INT
START:
MOV PCON, #0
MOV SCON, #50H
MOV TMOD, #20H
MOV TH1, #0FDH
MOV TL1, #0FDH
SETB TR1
MOV IE, #10010101B
MOV R7, #0
MOV P0, #0C0H
SJMP $ ;初始化完毕,等待中断
;-----------------------------
X0_INT: ;K3, 两机都亮
CLR L1
CLR L2
MOV S_BUF, #10000000B
CALL UART_SEND
JNB K3, $
RETI
;-----------------------------
X1_INT: ;K4, K1, K2
JNB K1, K1_PRO
JNB K2, K2_PRO
K4_PRO:
INC R7
CJNE R7, #10, $ + 5
MOV R7, #0
MOV S_BUF, R7
CALL UART_SEND
JMP X1_END
K1_PRO:
MOV S_BUF, #10000010B
CALL UART_SEND
JNB K1, $ ;等待按键释放
JMP X1_END
K2_PRO:
MOV S_BUF, #10000001B
CALL UART_SEND
JNB K2, $ ;等待按键释放
;K1(P1.0, P3.3)控制乙机L1(P2.0)亮,L2(P2.1)灭;
;K2(P1.1, P3.3)控制乙机L1(P2.0)灭,L2(P2.1)亮;
X1_END:
JNB K4, $ ;等待按键释放
RETI
;-----------------------------
UART_INT: ;中断接收
JB TI, U_END
CLR RI
MOV A, SBUF
JNB ACC.7, DISP
MOV P2, A
RETI
U_END:
RETI
;-----------------------
DISP: ;显示数码
MOV DPTR, #TAB
MOVC A, @A + DPTR
MOV P0, A
RETI
TAB:
DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H, 90H
;-----------------------
UART_SEND: ;查询发送
MOV SBUF, S_BUF
JNB TI, $
CLR TI
RET
;-----------------------------
END
;===================================
把上述的这一个程序,写入两台单片机,它们即可实现串行通信与控制。
仿真画面,可见前面的插图。
----
为了缩小仿真图的篇幅,本题目,也可以仅用一个单片机,自发、自收,进行按键通信控制。
有兴趣的朋友,可以自己试试。