?? fiber-232-485-422.src
字號:
;
; uiU10Sec250 ++; // 用于250毫秒鐘計時
; SOURCE LINE # 128
INC uiU10Sec250+01H
MOV A,uiU10Sec250+01H
JNZ ?C0026
INC uiU10Sec250
?C0026:
; if (uiU10Sec250 >= 25000) b250MilSecPassed = 1; // 已經過了250毫秒, LED-RUN
; SOURCE LINE # 129
CLR C
SUBB A,#0A8H
MOV A,uiU10Sec250
SUBB A,#061H
JC ?C0004
SETB b250MilSecPassed
; }
; SOURCE LINE # 130
?C0004:
POP PSW
POP ACC
RETI
; END OF timer0
CSEG AT 00003H
AJMP extINT0
;
; // 外部中斷0服務程序
; void extINT0() interrupt 0
RSEG ?PR?extINT0?FIBER_232_485_422
USING 0
extINT0:
PUSH ACC
PUSH PSW
; SOURCE LINE # 133
; {
; if (bHardMode == cnHalf485) // 半雙工485
; SOURCE LINE # 135
MOV A,bHardMode
CJNE A,#01H,?C0007
; {
; SOURCE LINE # 136
; if (b_RE485 == cnRS485_RecvMode) // 若RS485處于接收狀態
; SOURCE LINE # 137
JB b_RE485,?C0007
; {
; SOURCE LINE # 138
; b_RE485 = cnRS485_SendMode; // 使RS485處于發送狀態
; SOURCE LINE # 139
SETB b_RE485
; uiUs10Count = 0; // 重新計數
; SOURCE LINE # 140
MOV uiUs10Count,#00H
MOV uiUs10Count+01H,#00H
; }
; SOURCE LINE # 141
; }
; SOURCE LINE # 142
; }
; SOURCE LINE # 143
?C0007:
POP PSW
POP ACC
RETI
; END OF extINT0
;
; main()
RSEG ?PR?main?FIBER_232_485_422
main:
USING 0
; SOURCE LINE # 145
; {
; SOURCE LINE # 146
; long lCharDelay; // 1個字節的時間要求(按1B、8D、1P、1S計算)
;
; // 一個字節的延時 = 11 * 1000000 / Baudrate
; // Baudrate = 75 * (1 << ((P1 >> 2) & 0x0F))
; // 1位時間結果 = 1000000 / (75 * (1 << ((P1 >> 2) & 0x0F))
; //
; lCharDelay = (P1 >> 2) & 0x0F; // P1.5432(實際波特率 = 2^P1.5432 * 75 bps,范圍:75~2,457,600 bps),默認為9600、0111
; SOURCE LINE # 153
MOV A,P1
RRC A
RRC A
ANL A,#0FH
MOV R7,A
CLR A
MOV lCharDelay?440+03H,R7
MOV lCharDelay?440+02H,A
MOV lCharDelay?440+01H,A
MOV lCharDelay?440,A
; lCharDelay = 1 << lCharDelay; // 計算 2^P1.5432
; SOURCE LINE # 154
INC A
MOV R6,#00H
MOV R0,AR7
INC R0
SJMP ?C0028
?C0027:
CLR C
RLC A
XCH A,R6
RLC A
XCH A,R6
?C0028:
DJNZ R0,?C0027
MOV R7,A
MOV A,R6
RLC A
SUBB A,ACC
MOV lCharDelay?440+03H,R7
MOV lCharDelay?440+02H,R6
MOV lCharDelay?440+01H,A
MOV lCharDelay?440,A
; lCharDelay = 75 * lCharDelay; // 波特率 = 計算 2^P1.5432 * 75
; SOURCE LINE # 155
MOV R5,A
MOV R4,lCharDelay?440
CLR A
MOV R3,#04BH
MOV R2,A
MOV R1,A
MOV R0,A
ACALL ?C?LMUL
MOV lCharDelay?440+03H,R7
MOV lCharDelay?440+02H,R6
MOV lCharDelay?440+01H,R5
MOV lCharDelay?440,R4
; lCharDelay = 1000000 / lCharDelay; // 1位時間 = 1000000 / 75 /(2^P1.5432)
; SOURCE LINE # 156
MOV R3,lCharDelay?440+03H
MOV R2,lCharDelay?440+02H
MOV R1,lCharDelay?440+01H
MOV R0,lCharDelay?440
MOV R7,#040H
MOV R6,#042H
MOV R5,#0FH
MOV R4,#00H
ACALL ?C?SLDIV
MOV lCharDelay?440+03H,R7
MOV lCharDelay?440+02H,R6
MOV lCharDelay?440+01H,R5
MOV lCharDelay?440,R4
; lCharDelay = 11 * lCharDelay; // 11位時間
; SOURCE LINE # 157
CLR A
MOV R3,#0BH
MOV R2,A
MOV R1,A
MOV R0,A
ACALL ?C?LMUL
MOV lCharDelay?440+03H,R7
MOV lCharDelay?440+02H,R6
MOV lCharDelay?440+01H,R5
MOV lCharDelay?440,R4
;
; uiUs10Count = 0; // 用于10us計時
; SOURCE LINE # 159
CLR A
MOV uiUs10Count,A
MOV uiUs10Count+01H,A
; uiU10Sec250 = 0; // 用于250毫秒鐘計時
; SOURCE LINE # 160
MOV uiU10Sec250,A
MOV uiU10Sec250+01H,A
; b250MilSecPassed = 0; // 已經過了250毫秒, LED-RUN
; SOURCE LINE # 161
CLR b250MilSecPassed
;
; bRunLed = 0; // 運行指示LED
; SOURCE LINE # 163
CLR bRunLed
; bWdiClr = 0; // 看門狗清零
; SOURCE LINE # 164
CLR bWdiClr
;
; //////////////////////
; // 硬件引腳功能定義 //
; //////////////////////
; b485_232 = 0xFF; // 硬件接口模式檢測:0-RS232模式,1-RS485/422模式(方向:輸入)
; SOURCE LINE # 169
SETB b485_232
; if (b485_232) // 1-RS485/422
; SOURCE LINE # 170
JNB b485_232,?C0008
; {
; SOURCE LINE # 171
; b_RE485 = 0xFF; // 全半雙工檢查,RS485收發控制:0-RS485接收使能(狀態),1-RS485發送使能(狀態)(方向:輸入/出)
; SOURCE LINE # 172
SETB b_RE485
; if (b_RE485)
; SOURCE LINE # 173
JNB b_RE485,?C0009
; bHardMode = cnHalf485; // 半雙工485
; SOURCE LINE # 174
MOV bHardMode,#01H
SJMP ?C0010
?C0009:
; else
; bHardMode = cnFull422; // 半雙工422
; SOURCE LINE # 176
MOV bHardMode,#02H
?C0010:
;
; b_RE485 = cnRS485_RecvMode; // 使RS485處于接收狀態
; SOURCE LINE # 178
CLR b_RE485
; }
; SOURCE LINE # 179
SJMP ?C0011
?C0008:
; else // 0-RS232
; {
; SOURCE LINE # 181
; bHardMode = cnFull232; // 半雙工232
; SOURCE LINE # 182
CLR A
MOV bHardMode,A
; b_RE485 = cnRS485_SendMode; // 使RS485處于發送狀態
; SOURCE LINE # 183
SETB b_RE485
; }
; SOURCE LINE # 184
?C0011:
;
; vInterruptInitialize(); // 中斷初始化
; SOURCE LINE # 186
ACALL vInterruptInitialize
?C0014:
;
; do
; {
; SOURCE LINE # 189
; if (b250MilSecPassed)
; SOURCE LINE # 190
JNB b250MilSecPassed,?C0015
; {
; SOURCE LINE # 191
; b250MilSecPassed = 0; // 已經過了250毫秒, LED-RUN
; SOURCE LINE # 192
CLR b250MilSecPassed
; vHitWdFlashRunLed(); // 運行/調試狀態指示LED:強制閃爍,使RUN狀態LED閃爍周期小于1.5s
; SOURCE LINE # 193
ACALL vHitWdFlashRunLed
;
; // 提高外部硬件接口的可靠性
; switch(bHardMode)
; SOURCE LINE # 196
MOV A,bHardMode
ADD A,#0FEH
JZ ?C0019
ADD A,#02H
JNZ ?C0015
; {
; SOURCE LINE # 197
; case cnFull232: // 全雙工232
; SOURCE LINE # 198
?C0017:
; b_RE485 = cnRS485_SendMode; // 使RS485處于發送狀態
; SOURCE LINE # 199
SETB b_RE485
; break;
; SOURCE LINE # 200
SJMP ?C0015
; case cnHalf485: // 半雙工485
; SOURCE LINE # 201
; // nothing
; break;
; SOURCE LINE # 203
; case cnFull422: // 全雙工422
; SOURCE LINE # 204
?C0019:
; b_RE485 = cnRS485_RecvMode; // 使RS485處于接收狀態
; SOURCE LINE # 205
CLR b_RE485
; break;
; SOURCE LINE # 206
; }
; SOURCE LINE # 207
; }
; SOURCE LINE # 208
?C0015:
;
; if (bHardMode == cnHalf485) // 半雙工485
; SOURCE LINE # 210
MOV A,bHardMode
CJNE A,#01H,?C0014
; if (b_RE485 == cnRS485_SendMode) // 若RS485處于發送狀態
; SOURCE LINE # 211
JNB b_RE485,?C0014
; if (bRxdTTL) // 接收TTL處于“1”狀態
; SOURCE LINE # 212
JNB bRxdTTL,?C0014
; if (uiUs10Count >= lCharDelay) // 已經達到1個字節的時間要求
; SOURCE LINE # 213
MOV R6,uiUs10Count
MOV R7,uiUs10Count+01H
CLR A
MOV R4,A
MOV R5,A
MOV R3,lCharDelay?440+03H
MOV R2,lCharDelay?440+02H
MOV R1,lCharDelay?440+01H
MOV R0,lCharDelay?440
SETB C
ACALL ?C?SLCMP
JNC ?C0014
; b_RE485 = cnRS485_RecvMode; // 使RS485處于接收狀態
; SOURCE LINE # 214
CLR b_RE485
; } while(1);
; SOURCE LINE # 215
SJMP ?C0014
; END OF main
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -