有個題目,要求用兩臺單片機(jī)進(jìn)行串口通信,互相控制。
其電路圖有些松散,重畫如下:
;設(shè)計(jì)要求:
;甲機(jī)
;K1(P1.0,?P3.3)控制乙機(jī)?L1(P2.0)亮、L2(P2.1)滅;
;K2(P1.1,?P3.3)控制乙機(jī)?L1(P2.0)滅、L2(P2.1)亮;
;K3(P3.2)兩機(jī)都亮。
;乙機(jī)
;K4(P3.3)控制串口向甲機(jī)發(fā)送按下的次數(shù),此數(shù)字通過數(shù)碼管(P0)顯示。
;兩臺單片機(jī)的硬件資源是不同的,應(yīng)該編寫兩個不同的程序。
;做而論道把它們?nèi)诤显诹艘黄穑皇蔷帉懥艘粋€程序,就綜合管理了兩部分資源。
;通過串口,共需要發(fā)送數(shù)據(jù)?0~9?和三種?LED?控制命令,這些,可以用一個字節(jié)來代表。
;數(shù)據(jù)?0~9,僅用一個字節(jié)的低四位即可,高四位可以令其為零。
;在高四位設(shè)置上?1,就可以當(dāng)做命令使用。
;接收方根據(jù)最高位的狀態(tài),即可區(qū)分?jǐn)?shù)據(jù)和命令。
;故此,根據(jù)電路的特點(diǎn),設(shè)計(jì)三條命令如下:
;1000?0000???;全亮
;1000?0001???;L1?滅
;1000?0010???;L2?滅
;在命令中的最低兩位,就是直接控制?LED?的。
;由電路可以看出,按鍵,都是輸入到外部中斷引腳,因此,程序就應(yīng)該用中斷方式,以利高速響應(yīng)按鍵。
;對于串口通信,可以使用常見的方法:查詢式發(fā)送、中斷式接收。
;做而論道寫的程序,基本都是使用匯編語言編寫。
;全部代碼如下:
;===================================
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,?兩機(jī)都亮
????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)控制乙機(jī)L1(P2.0)亮,L2(P2.1)滅;
;K2(P1.1,?P3.3)控制乙機(jī)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:????????????????;顯示數(shù)碼
????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:???????????;查詢發(fā)送
????MOV???SBUF,?S_BUF
????JNB???TI,?$
????CLR???TI
????RET
;-----------------------------
END
;===================================
把上述的這一個程序,寫入兩臺單片機(jī),它們即可實(shí)現(xiàn)串行通信與控制。
仿真畫面,可見前面的插圖。
----
為了縮小仿真圖的篇幅,本題目,也可以僅用一個單片機(jī),自發(fā)、自收,進(jìn)行按鍵通信控制。
有興趣的朋友,可以自己試試。