⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcall2.asm

📁 餐饮呼叫系统的汇编源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********家用大功率发射器的程序(使用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 + -