本節書摘來異步社群《單片機序列槽通信及測控應用實戰詳解》一書中的第6章,第6.2節,作者:李江全,聶晶,梁習卉子,劉新英,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
單片機序列槽通信及測控應用實戰詳解
6.2.1 使用查詢方式c51程式設計
序列槽在發送資料和接收資料完成時均會引起序列槽中斷,進而使接收标志位ri和發送标志位ti置1。查詢方式和中斷方式的差別就在于cpu檢視ri和ti方式不同,以及處理資料的效率不同。
查詢方式是指通過cpu定時的查詢scon序列槽控制寄存器中的接收标志位ri和發送标志位ti來接收和發送資料。此種方式下,當序列槽發送資料或接收資料完成時,僅僅将相應的标志位置1而不會以任何形式通知主程式。主程式隻能通過定時查詢發現标志位狀态的改變,進而進行相應的處理,如标志位的清0。這種方式下資料的發送和接收是半雙工的,占用cpu時間長,工作效率低。
中斷方式是在接收和發送資料時,cpu不必連續地查詢接收标志位ri和發送标志位ti。當序列槽發送資料或接收資料完成時,cpu自動轉入中斷服務程式對接收到的資料進行處理,隻需要在中斷服務程式中通過檢視是ri還是ti來判斷資料是接收還是發送,進而跳轉至相應的處理部分。這種方式下可以實作全雙工通信,cpu可以騰出時間處理其他任務,效率高,速度快。
查詢方式通信流程:當序列槽接收到資料時,硬體系統将ri置1。在主程式中當cpu首次查詢到ri = 1時,首先判斷接收的首位元組是否為本機位址,如果不是則将接收緩沖區裡的資料清0傳回重新查詢接收;如果是則驅動繼電器動作、通過數位管顯示資料和位址,并将資料傳回給上位機;然後繼續下一次循環。
各個單片機開發闆c51程式基本相同,隻是位址不同,在常量聲明“#define”語句中展現。
/**
** 1号從機機程式(單片機與多個單片機序列槽通信)
** 晶 振 頻 率:11.0592mhz
** 線 路:單片機實驗開發闆b
**/
a_byte equ 40h
b_byte equ 41h
c_byte equ 42h
d_byte equ 43h
mcu_data equ 45h
mcu_addr equ 01h
ps0 bit p2.4 //數位管個位
ps2 bit p2.6 //數位管百位
main:mov sp,#60h
loop:clr ri
mov a,sbuf
clr ri
cjne a,#mcu_addr,loop
mov mcu_data,sbuf
clr ti
mov sbuf,#mcu_addr
jnb ti,$
mov sbuf,mcu_data
swap a
anl a,#0fh
mov b_byte,a
mov a,mcu_data
mov a_byte,a
acall sw_out
mov c_byte,#mcu_addr
mov d_byte,#0h
rr1:acall display
djnz r3,rr1
sw_out:mov a,mcu_data //資料輸出
setb jdq1 //接收到pc發來的資料00,關閉繼電器1和2
setb jdq2
sjmp ss0
ss1:cjne a,#01h,ss2
clr jdq2
ss2:cjne a,#10h,ss3
clr jdq1 //接收到pc發來的資料10,繼電器1打開,繼電器2關閉
ss3:cjne a,#11h,ss0
clr jdq1 //接收到pc發來的資料11,打開繼電器1和2
ss0:ret
init_serial: //序列槽初始化函數
ret
display: mov a,r0
dpl1: mov r1,#25 ;顯示1000次
dplop: mov a,a_byte ;取個位數
setb ps1
clr ps1
clr ps2
clr ps3
pop acc
mov r0,a
d1ms: mov r7,#80 ;1ms延時
;實驗闆上的7段數位管0~9數字的共陰顯示代碼
numtab: db 0fch,60h,0dah,0f2h,66h,0b6h,0beh,0e0h,0feh,0f6h
将彙程式設計式編譯生成hex檔案,然後采用stc-isp軟體将hex檔案下載下傳到單片機中。
打開“序列槽調試助手”程式(scomassistant.exe),首先設定序列槽号com1、波特率9600、校驗位none、資料位8、停止位1等參數(注意:設定的參數必須與單片機設定的一緻),選擇“十六進制顯示”和“十六進制發送”,打開序列槽。
pc通過串行口将十六進制數發送給多個單片機,驅動位址吻合的單片機繼電器動作,并在數位管顯示接收的數。單片機接收到資料後,傳回原資料給pc。
如pc發送十六進制資料“01 11”,驅動1号單片機闆繼電器1和2打開,單片機傳回十六進制資料“01 11”,如圖6-3所示。
中斷方式通信流程:當序列槽接收到資料時,硬體系統将ri置1,觸發程式進入中斷服務程式。由中斷服務程式接收序列槽資料并将其儲存至接收緩沖區。中斷服務程式首先判斷接收的首位元組是否為本機位址,如果不是則清空接收緩沖區,計數變量清0,直接退出中斷服務程式從新等待資料接收;否則繼續接收資料,計數變量c0加1。當接收完資料後,計數變量清0以便于下一次資料的接收,驅動繼電器動作并将資料傳回給上位機。然後退出中斷服務程式,在主程式中通過數位管顯示緩沖區的内容。
** 1号從機機程式(多個單片機與pc序列槽通信)
**/
a_byte equ 40h
recv_num equ 44h
org 0023h
ajmp uart
loop:mov a,mcu_data
setb es
setb ps1
clr ps1
clr ps2
clr ps3
pop acc
mov r0,a
uart:clr ti
mov a,recv_num
cjne a,#0,uu1
inc recv_num
sjmp uu
uu1:cjne a,#1,uu
mov recv_num,#0
uu: reti