?? pro1.asm
字號:
ORG 0000H
LJMP START
ORG 0003H
LJMP INT0
ORG 000BH
LJMP T0IN
ORG 0023H
LJMP SEVER
ORG 0050H
START: LCALL CHEAKREADY ;判斷計算機是否就緒
MOV 64H, #00H
MOV 65H, #00H
AG:
DADD DATA 40H ;數據暫存地址
ADDR DATA 6DH ;AD通道數
DN DATA 6EH ;數據濾波長度
DATALEN1 DATA 73H
DATALEN2 DATA 74H ;存貯數據長度,2為高位
DATASTR1 DATA 00H
DATASTR2 DATA 00H
MOV SP, #30H
SETB ES
SETB EX0
SETB EA
MOV 60H, DATALEN1
MOV 61H, DATALEN2
MOV 62H, #DATASTR1
MOV 63H, #DATASTR2 ;數據存貯器地址
MOV A, DATALEN1
MOV B, ADDR
MUL AB
MOV 7DH, A ;通道1~4數據占的總長度,7D為低字節
MOV 7EH, B
MOV A, DATALEN2
MOV B, ADDR
MUL AB
ADD A, 7EH
MOV 7EH, A ;7E為高字節
AGAIN: LCALL INDATA ;執行采集程序
LCALL COMPUTE ;執行數據濾波程序,并轉存數據
LCALL WAIT100mS ;延時100mS再采
MOV R0, 60H
MOV R1, 61H
CJNE R0, #00H, NEXT1
DEC R1
NEXT1: DEC R0
MOV 60H, R0
MOV 61H, R1
CJNE R0, #00H, AGAIN
CJNE R1, #00H, AGAIN ;未完再采
LCALL TRANSFER
SETB ES ;開中斷
STAY: MOV A, 79H
CJNE A, #0F0H, AG ;若79H不為F0則繼續
CLR ET0 ;否則關T0和外部中斷
CLR EX0
SJMP STAY ;等待串口中斷
ORG 0200H
INDATA:
MOV DPTR, #0B000H ;選口地址,并指向通道0
MOV R0, #DADD ;數據暫存地址
MOV R7, DN ;數據濾波次數
NEXTT: MOV R6, ADDR ;通道數
MOV A, #00H
READ: MOVX @DPTR, A ;啟動轉換
LCALL DELAY ;等待轉換結束
MOVX A, @DPTR ;讀取數據
MOV @R0, A ;存放數據
INC R0 ;存放數據地址加1
INC DPTR ;選擇下一個通道
DJNZ R6, READ ;通道未完則繼續
MOV DPTR, #0B000H ;完則返回指向通道0
DJNZ R7, NEXTT ;采集次數未達到數據則繼續
RET
ORG 0400H
COMPUTE: ;軟件濾波,R3為AD后數據地址
;R6為通道數,R7為濾波次數
;通道0計算后放0000H
;通道1計算后放2000H
;通道2計算后放4000H
MOV DPL, 62H
MOV DPH, 63H ;選擇數據存儲器
MOV R3, #DADD
MOV R7, DN
MOV R6, ADDR ;通道數
NEXTC: MOV A, R3 ;待處理數據地址
MOV R0, A ;計算時的被加數地址
MOV R1, #20H ;計算后數據暫存地址
LCALL SUB ;前兩個數相加,程序運行后R0+2*ADDR,R1+1
LCALL SUB ;后兩個數相加
MOV A, 20H
MOV R0, #21H
ADD A, @R0 ;再相加
RRC A ;除2
MOVX @DPTR, A ;送至DPTR
INC R3 ;轉至下一通道數據
MOV A, DPL
ADD A, DATALEN1
MOV DPL, A
MOV A, DPH
ADD A, DATALEN2 ;指向下一通道存放數據地址
MOV DPH, A
DJNZ R6, NEXTC ;通道未完則繼續
INC DPTR ;存儲地址加1
CLR C
MOV A, DPL
SUBB A, 7DH ;DPL減00,DPTR變為原來值
MOV DPL, A
MOV A, DPH
SUBB A, 7EH ;DPH減60,變為00
MOV DPH, A
MOV 62H, DPL
MOV 63H, DPH ;DPTR轉存62H,63H
RET
SUB: ;除2子程序
MOV A, R0 ;被加數
MOV 7FH, @R0
ADD A, ADDR
MOV R0, A ;加數
MOV A, @R0
ADD A, 7FH
RRC A ;除2
MOV @R1, A ;存至R1
MOV A, R0
ADD A, ADDR ;指向下兩個數的首位
MOV R0, A
INC R1 ;存儲地址加1
RET
ORG 0600H
CHEAKREADY: ;檢察是否與計算機正常通訊
ORL TMOD, #20H ;設定T1為工作方式2
MOV TH1, #0FAH
MOV TL1, #0FAH ;定時器初值,f=6MHZ,N=FC若f=11.0592,N=FA
SETB TR1 ;啟動T1工作
MOV PCON, #80H ;置SMOD=1
MOV SCON, #70H ;串口方式1,允許接收
SETB EA ;開CPU中斷
CLR ES
SHAKE: MOV SBUF, #0FCH ;主動與計算機建立握手
JNB TI, $
CLR TI
MOV A,#100D
WWW: JB RI, RR2 ;接收計算機返回的數據
DEC A
JZ SHAKE
SJMP WWW
RR2: CLR RI
MOV A, SBUF ;判斷是否握手成功
CJNE A, #0FCH, SHAKE ;不成功則重發
SETB ES ;開串口中斷
HERE: MOV A,79H ;79H為允許狀態,
;單片機可隨時查看
;以確定是否停止
CJNE A, #0FEH, HERE ;若不是FE,則中止工作,等待中斷
RET
ORG 0800H
TRANSFER:
MOV DPL, #DATASTR1
MOV DPH, #DATASTR2 ;欲發送數據首地址
MOV 75H, ADDR ;通道數
MOV A, DATALEN2
CJNE A, 67H, GOON
GOON: JC LIGHT ;若數據長度高字節<67H,則數字通道滿
MOV A, 66H ;若二者相等則比較低字節
CJNE A, DATALEN1, GOON2
GOON2: JC NOLIGHT
LIGHT: INC 75H ;AD通道+光電通道
MOV 64H, #00H
MOV 65H, #00H
NOLight:CLR ES ;關串口中斷,以順序方式發送
MOV SBUF, #0FDH ;發送數據標示
JNB TI, $
CLR TI
MOV SBUF, 75H
JNB TI, $
CLR TI
MOV R3, #00H ;R3為當前發送數據的通道數
NEXTTT: MOV SBUF, R3
JNB TI, $
CLR TI
MOV R0, DATALEN1 ;塊長低字節送R0
MOV SBUF, R0 ;發送塊長低字節
JNB TI, $
CLR TI
MOV R1, DATALEN2 ;塊長高字節送R1
MOV SBUF, R1 ;發送塊長高字節
JNB TI, $
CLR TI ;清TI
MOV 76H, #00H ;校驗和清0
SDATA: MOVX A, @DPTR ;發送數據字節送A
MOV SBUF, A
ADD A, 76H ;校驗和
MOV 76H, A
CJNE R0, #00H, CC1 ;塊長(R1,R0)減1
DEC R1
CC1: DEC R0
INC DPTR
JNB TI, $
CLR TI
CJNE R1, #00H, SDATA
CJNE R0, #00H, SDATA ;數據未完,則繼續
MOV SBUF, 76H ;數據已完,則發和校驗
JNB TI, $
CLR TI
JNB RI, $
CLR RI
MOV A, SBUF
JNZ NEXTTT
INC R3
MOV A, R3
CJNE A, 75H, NEXTTT
SETB ES
RET
ORG 0A00H
SEVER: ;中斷服務程序
PUSH A
PUSH PSW
CLR ES ;關中斷
JNB RI, RBACK ;若是發送中斷,則返回
CLR RI
MOV A, SBUF
CJNE A, #0FFH, TT1 ;若為參數設置則TT1
JNB RI, $ ;若為就緒標志,則接收
CLR RI
MOV A, SBUF
MOV 79H, A ;就緒標志存79H
SJMP RBACK
TT1: CJNE A,#0FCH, TT2 ;若為握手信息,則返回FC
MOV SBUF, A
JNB TI, $
CLR TI
SJMP RBACK
TT2: CJNE A, #0FDH, RBACK ;若不為設置參數標志,則返回
JNB RI, $
CLR RI
MOV A, SBUF
MOV 73H, A ;數據長度低字節放73H
JNB RI, $
CLR RI
MOV A, SBUF
MOV 74H, A ;數據長度高字節放74H
JNB RI, $
CLR RI
MOV A, SBUF
MOV 6EH, A ;濾波長度放6EH
JNB RI, $
CLR RI
MOV A, SBUF
MOV 6FH, A ;延時長度放6FH
JNB RI, $
CLR RI
MOV A, SBUF
MOV 6DH, A ;通道數放6DH
DEC 6DH
RBACK:
SETB ES
POP PSW
POP A
RETI
ORG 0C00H
WAIT100MS: ;延時100ms子程序
PUSH PSW
SETB PSW.3
MOV R7, 6FH ;延時長度由6FH送R7
DL: MOV R6, #250D ;設晶振為6MHz,機器周期為2us
DJNZ R6, $ ;250x4=1000us=1ms
DJNZ R7, DL ;1x100=100ms
POP PSW
RET
DELAY:
PUSH PSW
SETB PSW.4
MOV R7, #40D
DJNZ R7, $ ;40x4=160us
POP PSW
RET
ORG 0D00H
INT0:
PUSH PSW
PUSH DPH
PUSH DPL
PUSH A
MOV A, 65H ;檢查數據指針是否為0
JNZ INIT ;
MOV A, 64H
JNZ INIT
MOV A, 7DH ;若為0則重置數據首地址
ADD A, #DATASTR1
MOV 64H, A
MOV A, 7EH
ADDC A, #DATASTR2
MOV 65H, A ;放置通道5數據的首地址
MOV 67H, #00H
MOV 66H, #00H
INIT: ORL TMOD,#01H ;選定時器0,方式1
MOV A, TH0
JZ INT0BACK
MOV A, TL0
JZ INT0BACK
GETDATA:MOV DPL, 64H
MOV DPH, 65H
MOV A, TL0
MOVX @DPTR, A
INC DPTR
MOV A, TH0
MOVX @DPTR, A
INC DPTR
MOV TH0, #00H
MOV TL0, #00H
MOV 65H, DPH
MOV 64H, DPL
MOV DPL, 66H
MOV DPH, 67H
INC DPTR
INC DPTR
MOV 66H, DPL
MOV 67H, DPH
INT0BACK: ;中斷返回
SETB ET0
SETB TR0
POP A
POP DPL
POP DPH
POP PSW
RETI
T0IN: ;定時器0中斷程序
CLR TF0
ORL TMOD, #01H
MOV TH0, #00H
MOV TL0, #00H
SETB TR0
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -