?? slave2.asm
字號:
;----------------------------------
; 單片機與單片機通信實例(從機2)
;功能:通過串口接收主機的控制信號,然后通過數模轉換輸出模擬信號
;-----------------------------------
ORG 0000H
JMP START ; 程序開始
ORG 0023H
JMP Serial_RX_ISR ; 串口中斷向量
START:
MOV SP,#60H ; 將堆棧位置設為60H
CALL Init ; 進行串口及相關寄存器的初始化
MainLoop:
;-----------------------
; 主循環:
;-----------------------
JMP MainLoop
Init:
;---------------------------------
; 程序初始化,包括串口、定時器T1、中斷的初始化
;---------------------------------
MOV SCON,#11110000B ; 串口控制寄存器初始化
ORL PCON,#10000000B ; 把SMOD位置1
SETB EA ; 中斷允許總控制位使能
SETB ES ; 串口中斷使能
SETB PS ; 把串口中斷設為高優先級
CALL Timer1_Init ; 進行定時器T1的初始化
RET
Timer1_Init:
;-------------------------
; 定時器T1作為串口的波特率發生器
; (2^SMOD)*fosc/32*12*(256-th1)=57600
;-------------------------
ORL TMOD,#00100000B ; 定時器T1工作在方式2
ORL TCON,#01000000B ; 定時器T1使能
MOV TH1,#0FFH ; 設定定時器T1的初始值
RET
DA_Operation:
;-------------------------
; DAC0832的操作
; 電壓控制值存放在ACC中
;-------------------------
CLR P3.6 ; 將WR設為低
MOV DPTR,#0EFFFH ; 選中片選信號
MOVX @DPTR,A ; 輸出控制電壓
RET
Serial_RX_ISR:
;-----------------------------------
; 串口接收中斷服務程序,需要在程序開始時在2FH處寫入緩存區首地址
;-----------------------------------
PUSH PSW ; 程序狀態字壓棧
PUSH 1 ; R1壓棧
PUSH 2 ; R2壓棧
MOV C,TI
CLR TI
JC OUT_ISR
MOV A,SBUF
CJNE A,#02,Out_ISR ; 判斷是否為從機2的命令幀
CLR SM2 ; 把SM2清零
CLR ES ; 禁止串口中斷
CLR RI ; 軟件清除串口接收中斷標志
NOP
Serial_RX_WAIT: ; 等待下一個字節數據的接收
JNB RI,Serial_RX_WAIT
MOV A,SBUF ; 將接收到的數據寫入A
CALL DA_Operation ; 模擬輸出
SETB SM2 ; SM2置1
Out_ISR:
CLR RI ; 軟件清除串口接收中斷標志位
POP 2 ; R2 出棧
POP 1 ; R1 出棧
POP PSW ; 程序狀態字出棧
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -