天天看點

《單片機序列槽通信及測控應用實戰詳解》——6.2 單片機端程式設計

本節書摘來異步社群《單片機序列槽通信及測控應用實戰詳解》一書中的第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所示。

《單片機序列槽通信及測控應用實戰詳解》——6.2 單片機端程式設計

中斷方式通信流程:當序列槽接收到資料時,硬體系統将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

繼續閱讀