📄 pcall2.asm
字号:
;********家用大功率发射器的程序(使用764)***********此程序用来给标做实验
;本程序只是把从数传电台传出来的安防数据,然后把数据编程POCSAG码发送出去
;本程序没有分频,仿真时,注意仿真头的设置.以及WDT使用,现在是使用WDT有问题,不使用WDT 没有问题
;此程序用2分频,CALL 机的群呼地址是做进去了:1000000。住户地址是根据从从数传电台传出来的来定的
SEND_PTT BIT P0.2
POC_TMD BIT P0.3 ;数据输出口,注意反向
PDAT BIT P0.6
PCLK BIT P0.7
PEN BIT P0.5
LED1 BIT P1.3 ;状态灯
LED2 BIT P1.2 ;PTT高的时候就亮
SYS_STATUS EQU 20H
F_SEND BIT 0BH ;发送数据完成的标志
F_RECE_END BIT 010H ;接收完成了置数
F_FIRST_DATA BIT 011H ;是否是接收的第一个数据
F_SECOND_DATA BIT 012H ;是否是接收的第二个数据,
F_CRC_WRONG BIT 014H ;CRC校验的标志位.=1时,错误
POC_NUM EQU 30H ; POCSAG DATA 1ST BYTE
; HIGH 4 BIT POCSAG NUM (32BIT=1)
; LOW 4 BIT ZHENG_HAO , 8 = ALL
CRC_DATA EQU 31H ;进行CRC处理的区间地址,处理完的CRC也放在第一位
;LED_TIME EQU 3FH
S_IN_DATA EQU 40H ;接收的数据存放区,最长的数据是10个(去掉了头) 50---56H
S_IN_LENGTH EQU 40H ;接收的数据存放区的第一位是数据的长度(不包含字头 和自身)
S_IN_ANFANG EQU 41H ;接收到的表号\特征码,放在第2位
S_IN_ADDRESS1 EQU 42H
S_IN_ADDRESS2 EQU 43H
S_IN_ADDRESS3 EQU 44H
S_IN_ANFANG_NO EQU 45H ;安防数据
S_IN_CRC EQU 46H
CRC_COUNT EQU 48H ;CRC校验的个数
CRC_LOOP EQU 49H
SEND_BYTE EQU 4AH
SEND_BIT_NUM EQU 4BH
SEND_BYTE_NUM EQU 4CH
SEND_STRU EQU 4DH
DELAY_TIME0 EQU 4EH
DELAY_TIME1 EQU 4FH
GET_BUFFER EQU 50H ;放置要发送的信息
ADDRESS1 EQU 54H
ADDRESS2 EQU 55H
ADDRESS3 EQU 57H
ADDRESS4 EQU 58H
ADDRESS5 EQU 59H
ADDRESS6 EQU 5AH
OUT_DATA1 EQU 5CH ;要发送出去的报警信号
OUT_DATA2 EQU 5DH
DATA_BUFFER EQU 060H
POCSAG_BUFFER EQU 70H ; 70-- 7F 8 BYTE只有第一桢发送
;*******764*******************
ORG 0000H
NOP
AJMP SYS_START
ORG 0003H ;X INT 0
CLR EX0
RETI
NOP
ORG 000BH ; TIME0
NOP
NOP
LJMP POCSAG_SEND
ORG 0013H ;
NOP
NOP
LJMP TEST ;此段程序专门用来测试
ORG 001BH
CLR ET1 ;
NOP
RETI
ORG 0023H ; COM I/O
NOP
LJMP S_INT
NOP
ORG 002BH ;掉电检测中断服务程序
ANL PCON, #0DFH ;清除 BOF 标志
RETI
ORG 003BH ;键盘中断服务程序
ANL AUXR1, #7FH ;清除 KBI 溢出标志
CLR EKB ;禁止 KBI 中断
RETI
ORG 0043H ;比较器2中断服务程序
ANL CMP2, #0FEH ;清除 CMP2 溢出标志
RETI
ORG 0053H ;看门狗定时器中断服务程序
CLR EWD ;禁止 WDT 中断
ORL AUXR1, #08H ;软件复位
RETI
ORG 0063H ;比较器1中断服务程序
ANL CMP1, #0FEH ;清除 CMP1 溢出标志
RETI
NOP
ORG 0080H
;**************************************************************
SYS_START:
NOP
CLR EA
INIT_WDT:
MOV WDCON, #017H ;开启看门狗定时器(溢出时间约为131ms)
MOV WDRST,#01EH ;WDT
MOV WDRST,#0E1H
MOV SP,#010H ;堆栈
MOV TCON,#054H ;TIMER0和TIMER1启动,外部中断选择是下降沿触发
;MOV P0M1,#00000000B ;
;MOV P0M2,#00000001B ;;
;MOV P1M1,#00000000B ;
;MOV P1M2,#11001100B
ORL P1,#00000011B ;置P1.0/P1.1(TXD/RXD)为高.此句非常重要,而且一定要放在前面
MOV PCON,#00H ;SMOD=1加倍,SMOD=0,不加倍
MOV SCON,#01010000B ;10位,方式1,允许串口接收,一个起始位,一个停止位,8个数据
MOV TMOD,#021H ;定时器T1为方式2,T0为16位计时器
MOV TH1,#0FAH ;11.0592M,4.8kBPS
MOV TL1,#0FAH
SETB EX1
SETB ES
SETB EA ;使能中断
CLR SEND_PTT
SETB LED2
;***********************************************************************
MOV C,PSW.5 ;上电标志
JC SYS_START0 ;判断是否是热启动
MOV PSW,#00H
SETB PSW.5
;***********************************************************************
CLEAR_RAM:
MOV R0,#020H
CLEAR_RAM0:
MOV @R0,#00H
INC R0
MOV A,R0
NOP
NOP
CJNE A,#080H,CLEAR_RAM0
NOP
;***************开机先把其它的数据确定***************************
SYS_START0:
MOV R1,#00H ;
MOV R0,#GET_BUFFER
MOV DPTR,#0FB0H
GET_DATA:
MOV A,R1
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
CJNE R1,#0CH,GET_DATA
;**************主程序循环区***********************************
SYS_START1:
NOP
NOP
JNB F_RECE_END,TO_SYS_START2
NOP
NOP
JNB F_RECE_END,TO_SYS_START2
CLR F_RECE_END
MOV A,S_IN_ANFANG
CJNE A,#06CH,TO_SYS_START2 ;检查是否是安防信号
MOV R1,#S_IN_DATA ;检查是否CRC校验错误
MOV R0,#CRC_DATA
MOV R3,S_IN_LENGTH
NOP
NOP
LCALL MOV_TO_CRC
MOV CRC_COUNT,S_IN_LENGTH ;CRC处理的数据数据共有6个(不含CRC数据).
NOP
NOP
LCALL CRC_CAL
MOV A,S_IN_CRC
NOP
NOP
CJNE A,CRC_DATA,CRC_WRONG_DATA
NOP
NOP
AJMP SYS_START5
TO_SYS_START2:
NOP
NOP
LJMP SYS_START2
;-----------把地址码和安防信息码放进相应的区----------------
SYS_START5:
MOV A,S_IN_ADDRESS1
ANL A,#0F0H
SWAP A
MOV ADDRESS1,A
MOV A,S_IN_ADDRESS1
ANL A,#0FH
MOV ADDRESS2,A
MOV A,S_IN_ADDRESS2
ANL A,#0F0H
SWAP A
MOV ADDRESS3,A
MOV A,S_IN_ADDRESS2
ANL A,#0FH
MOV ADDRESS4,A
MOV A,S_IN_ADDRESS3
ANL A,#0F0H
SWAP A
MOV ADDRESS5,A
MOV A,S_IN_ADDRESS3
ANL A,#0FH
MOV ADDRESS6,A
MOV A,S_IN_ANFANG_NO
ANL A,#0F0H
SWAP A
MOV OUT_DATA1,A
MOV A,S_IN_ANFANG_NO
ANL A,#0FH
MOV OUT_DATA2,A
MOV R0,#056H ;加入间隔的符号
MOV @R0,#0DH ;"-"
MOV R0,#5BH
MOV @R0,#0CH ;" "空格
MOV R1,#GET_BUFFER
MOV R0,#DATA_BUFFER
MOV R3,#0EH
CALL MOV_TO
MOV A,#DATA_BUFFER ;
MOV R7,A
MOV A,#0EH
NOP
NOP
LCALL TELDATA
NOP
NOP
SETB ET0 ;此处开TIMER0中断,使开始发送!
SYS_START4:
NOP
NOP
JNB F_SEND,SYS_START4
NOP
NOP
JNB F_SEND,SYS_START4
NOP
NOP
CLR ET0 ;关闭TIMER0中断
CLR F_SEND
NOP
NOP
AJMP SYS_START2
CRC_WRONG_DATA:
SYS_START2:
MOV WDRST,#01EH ;WDT
MOV WDRST,#0E1H
NOP
NOP
AJMP SYS_START1
;***************************************************************************
;
; POCSAG SEND TIMER 0 INTERRUPT PROGRAM
; 发送POCSAG码
;***************************************************************************
POCSAG_SEND: PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
MOV ACC,R0
PUSH ACC
MOV WDRST,#01EH ;WDT
MOV WDRST,#0E1H
MOV A,SEND_BYTE
RLC A
CPL C
MOV POC_TMD,C
MOV SEND_BYTE,A
MOV TH0,#0FDH ; FREQUENCY 11.0592 MHZ
DEC SEND_BIT_NUM
MOV A,SEND_BIT_NUM
NOP
NOP
JZ POC_SEND0
NOP
NOP
LJMP POC_SEND_RET
POC_SEND0: MOV SEND_BIT_NUM,#08H
MOV DPTR,#SEND_CHANG
MOV A,SEND_STRU
CLR C
RL A
CLR C
RL A
NOP
NOP
JMP @A+DPTR
SEND_CHANG: NOP
AJMP STRU0
NOP
NOP
AJMP STRU1
NOP
NOP
AJMP STRU2
NOP
NOP
AJMP STRU3
NOP
NOP
AJMP STRU4
NOP
NOP
AJMP STRU5
NOP
NOP
AJMP STRU6
NOP
NOP
STRU0:
MOV SEND_BYTE,#0AAH
DJNZ SEND_BYTE_NUM,STRU0_1
MOV SEND_BYTE_NUM,#00H
;MOV SEND_STRU,#01H
MOV SEND_STRU,#02H ;使发送的前置码为少一点
STRU0_1:
NOP
NOP
AJMP POC_SEND_RET
STRU1:
MOV SEND_BYTE,#0AAH
DJNZ SEND_BYTE_NUM,STRU1_1
MOV SEND_STRU,#02H
STRU1_1:
AJMP POC_SEND_RET
STRU2:
MOV SEND_BYTE,#07CH
MOV SEND_STRU,#03H
NOP
NOP
AJMP POC_SEND_RET
STRU3:
MOV SEND_BYTE,#0D2H
MOV SEND_STRU,#04H
NOP
NOP
AJMP POC_SEND_RET
STRU4:
MOV SEND_BYTE,#015H
MOV SEND_STRU,#05H
NOP
NOP
AJMP POC_SEND_RET
STRU5:
MOV SEND_BYTE,#0D8H
MOV SEND_STRU,#06H
MOV SEND_BYTE_NUM,#00H
NOP
NOP
AJMP POC_SEND_RET
; TONGBU_TABPEN: DB 07CH,0D2H,015H,0D8H
; KONXIAN_TABPEN: DB 07AH,089H,0C1H,097H
STRU6: MOV A,#POCSAG_BUFFER
ADD A,SEND_BYTE_NUM
MOV R0,A
MOV A,@R0
MOV SEND_BYTE,A
INC SEND_BYTE_NUM
MOV A,SEND_BYTE_NUM
;ANL A,#0FH ;只有F个
CJNE A,#0FH,POC_SEND_RET ;只有12个
NOP
NOP
AJMP STRU11_1
;JZ STRU6_1
; NOP
; NOP
;JZ STRU11_1 ;直接去最后
; NOP
; NOP
;AJMP POC_SEND_RET
STRU11_1:
CLR SYS_STATUS.0
NOP
NOP
JNB SYS_STATUS.1,STRU_END
MOV SEND_STRU,#02H
NOP
NOP
AJMP POC_SEND_RET
STRU_END: MOV SEND_STRU,#00H
CLR SEND_PTT ; SEND_END
SETB LED2
SETB F_SEND
POP ACC
MOV R0,ACC
POP DPL
POP DPH
POP PSW
POP ACC
CLR ET0
NOP
NOP
RETI
NOP
NOP
POC_SEND_RET:
POP ACC
MOV R0,ACC
POP DPL
POP DPH
POP PSW
POP ACC
NOP
NOP
RETI
;***********************************************************************
;
; INIT SYSTEM
;
;***********************************************************************
INIT_POCSAG: MOV R2,#08H
MOV R0,#POCSAG_BUFFER
INIT_POCSAG1: MOV @R0,#07AH ; CPENAR POCSAG BUFFER
INC R0
MOV @R0,#089H
INC R0
MOV @R0,#0C1H
INC R0
MOV @R0,#097H
INC R0
NOP
NOP
DJNZ R2,INIT_POCSAG1
NOP
NOP
RET
NOP
NOP
;**************************************************************
; R7 DATA_BUFFER ADDRESS
;
; OUTPUT: POCSAG TO SEND BUFFER / NO OUTPUT
;改动设想:单呼。在受到的信息位之前加住户地址信息(不是CALL机地址)
;**************************************************************
TELDATA:
MOV R2,A
MOV A,R7
MOV R0,A ;数据区起始地址
NOP
NOP
LCALL POC_START
NOP
MOV A,R2
CLR C
SUBB A,#04H
MOV B,#05H ;如果以后数据位不固定,仍然回到以前的方式
DIV AB
MOV R3,A
INC R3
MOV A,B
JZ TELDATA_2
INC R3
TELDATA_2: MOV A,R3
SWAP A
ANL A,#0F0H ; POC_NUM HIHG 4 BIT =
MOV POC_NUM,A ; POCSAG DATA NUMBER (32BIT=1)
;AJMP TELDATA_3
TELDATA_3: MOV A,R7 ; NO QUN HU
MOV R0,A
MOV A,@R0
MOV B,#0AH
MUL AB
MOV R2,A
INC R0
MOV A,@R0
ADD A,R2 ; ADDRESS 100??XX : ??
MOV B,#064H ; ?? -> ??00
MUL AB
MOV R4,A
MOV R5,B
INC R0
MOV A,@R0
MOV B,#0AH
MUL AB
MOV R2,A
INC R0
MOV A,@R0
ADD A,R2 ; ADDRESS 100??XX : XX
ADD A,R4 ; ??00 + XX
MOV R2,A
MOV A,#00H
ADDC A,R5
MOV R3,A
MOV A,R2
ANL A,#07H
ORL A,POC_NUM ; ZHENG_HAO
MOV POC_NUM,A
MOV A,R2
ANL A,#0F8H
ADD A,#040H ; ??XX + 1000000
MOV R2,A
MOV A,R3
ADDC A,#042H
MOV R3,A
CLR A
ADDC A,#0FH
MOV R4,A
MOV R5,#03H
MOVE_10XX: MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
NOP
NOP
DJNZ R5,MOVE_10XX
MOV A,R7
MOV R0,A
MOV A,R4
MOV @R0,A
INC R0
MOV A,R3
MOV @R0,A
INC R0
MOV A,R2
ANL A,#0C0H
MOV @R0,A
MOV A,R7
CLR C
NOP
NOP
LCALL POCSAG_BUILD
NOP
TELDATA_4: ;开始转换信息码
MOV A,POC_NUM ; INFORMATION POCSAG DATA
SWAP A
ANL A,#0FH
DEC A
MOV R3,A ; POCSAG INFORMATION DATA NUMBER
MOV A,R7
ADD A,#04H
MOV R0,A
MOV R1,A
TELDATA_5: MOV DPTR,#INFOR_BCD
MOV A,@R0
MOVC A,@A+DPTR
SWAP A
MOV R4,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ORL A,R4
MOV @R1,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -