?? master.asm
字號:
;----------------------------------
; 單片機與單片機通信實例(主機)
;功能:通過串口與從機與主機的通信,對從機1發出問詢幀,然后接收從機1
; 的脈沖數,通過簡單計算得出電壓控制值,通過串口發給從機2
;-----------------------------------
ORG 0000H
JMP START ; 程序開始
ORG 000BH
JMP Timer0_ISR ; 定時器T0中斷向量
START:
MOV SP,#60H ; 將堆棧位置設為60H
CALL Init ; 進行串口及相關寄存器的初始化
MOV 30H,#7FH ; 將30h設為7fh
MOV R3,#0H ; 將觸發標志位清零
Init:
;---------------------------------
; 程序初始化,包括串口、定時器T1、中斷的初始化
;---------------------------------
MOV SCON,#11010000B ; 串口控制寄存器初始化
ORL PCON,#10000000B ; 把SMOD位置1
SETB EA ; 中斷允許總控制位使能
SETB ET0 ; 定時器T0中斷使能
SETB PT0 ; 把定時器T0中斷設為高優先級
CALL Timer0_Init ; 進行定時器T0的初始化
CALL Timer1_Init ; 進行定時器T1的初始化
RET
Timer0_Init:
;-------------------------
; T0作為定時器,T0溢出一次為一個控制周期
;-------------------------
ORL TMOD,#00000001B ; 定時器T0工作在方式1
ORL TCON,#00010000B ; 定時器T0使能
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
MainLoop:
CJNE R3,#0,MainLoop ; 等待中斷觸發
MOV R1,#01H ; R1中存放地址字節
MOV R2,#0FEH ; R2中存放命令字節
CALL Serial_TX ; 放送給從機1命令幀
NOP
CALL Serial_RX ; 等待接收從機1返回的脈沖數
MOV A,R1
SUBB A,#01H ; 脈沖數減256
JC UP_POWER ; 比256小則電壓加大,反之則減小
DOWN_POWER:
MOV R0,#30H ; 30h中存儲電壓控制值
MOV A,@R0 ; 將電壓控制值增加2
INC A
INC A
MOV @R0,A ; 將電壓控制值寫回緩存
JMP Send_Con
UP_POWER:
MOV R0,#30H
MOV A,@R0 ; 將電壓控制值減小2
DEC A
DEC A
MOV @R0,A ; 將電壓控制值寫回緩存
Send_Con:
MOV R1,#02H ; R1地址字節
MOV R0,#30H ; 讀取電壓控制值
MOV A,@R0
MOV R2,A ; R2中存放電壓控制值
CALL Serial_TX ; 放送從機2的命令幀
MOV R3,#0 ; 清除觸發標志位
JMP MainLoop
Serial_TX:
;-----------------------
; 串口發送,采用查詢的方式
;-----------------------
Serial_TX_LOOP1:
MOV A,R1
MOV SBUF,a ; 將一個字節寫入串口緩存中
SETB C
MOV TB8,C ; 將發送的第9位置為1,此字節為地址
Serial_TX_WAIT1:
JNB TI,Serial_TX_WAIT1 ; 等待該字節數據發送完成
NOP
CLR TI ; 軟件清除串口發送中斷標志位
Serial_TX_LOOP2:
MOV A,R2
MOV SBUF,a ; 將一個字節寫入串口緩存中
CLR C
MOV TB8,C ; 將發送的第9位置為0
Serial_TX_WAIT2:
JNB TI,Serial_TX_WAIT2 ; 等待該字節數據發送完成
NOP
CLR TI ; 軟件清除串口發送中斷標志位
RET
Serial_RX:
;-------------------
; 串口接收,采用查詢RI位的方式
;-------------------
Serial_RX_WAIT1: ; 等待下一個字節數據的接收
JNB RI,Serial_RX_WAIT1
MOV A,SBUF ; 將接收到的數據寫入A
MOV R1,A ; 將接收的數據寫入接收數據緩存區
CLR RI ; 軟件清除串口接收中斷標志位
Serial_RX_WAIT2: ; 等待下一個字節數據的接收
JNB RI,Serial_RX_WAIT2
MOV A,SBUF ; 將接收到的數據寫入A
MOV R2,A ; 將接收的數據寫入接收數據緩存區
CLR RI
RET
Timer0_ISR:
PUSH PSW
INC R3 ; 設置標志位,表示定時器T0觸發
POP PSW
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -