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

📄 dmjv11.bak

📁 C51环境下的有线投票器的源代码
💻 BAK
字号:
;USE AT89C2051
;PEI 2004.3 大卖家
;v1.1 修正RCVBUF中的Bug,并开通了CRC效验

P_STB	BIT	P3.1
P_SCK	BIT	P1.1
P_SD	BIT	P1.0

PLED	BIT   P3.7
led2    bit p1.7
tr      bit p3.3
PID	BIT   P3.7

;------BITS------
CMDOK       BIT 7FH ;pc serial command ok
TREADY      BIT 7EH
BOK	    BIT 7DH
FB_DP       BIT 7CH

SENDSTOP    BIT 6EH  ;发送停止
SENDEMPTY   BIT 6DH  ;BUFF空
;-----RAMS------
;BITCNT      EQU 30H
;ADDR        EQU 31H

SEND_BUF    EQU 32H
REC_BUF     EQU 33H
SHOWLEN     EQU 34H
TOT         EQU 36H    ;Timer Count
;DELAY       EQU 37H
;DELAY1      EQU 38H
ID          EQU 39H

RDD         EQU 40H  ;串口临时数据
RDN         EQU 41H  ;接收数据计数
RCVTAIL     EQU 42H  ;接收数据尾指针
RCVHEAD     EQU 43H  ;接收数据头指针
SENDHEAD    EQU 44H  ;发送数据头指针
SENDTAIL    EQU 45H  ;发送数据尾指针
CMD         EQU 46H  ;串口命令
RCVNN       EQU 47H
CHKSUM      EQU 48H

SHOWD0      EQU 50H  ;显示数据区
SHOWD1      EQU 51H
SHOWD2      EQU 52H
SHOWD3      EQU 53H
SHOWD4      EQU 54H
SHOWD5      EQU 55H
SHOWD6      EQU 56H
SHOWD7      EQU 57H

;----常数------
TON        EQU 20     ;lamp flash time const

RCVADDR    EQU 60H ;Recv Buffer Start
RCVLEN     EQU 10H ;Recv Buffer Length

COMH0      EQU 0AAH;串口命令头
COMH1      EQU 55H
CMD1H      EQU 21H
CMD2H      EQU 22H


;*********************************

          ORG 0000H
START:    LJMP INIT                 ;goto initializing program
          ORG 0003H
          LJMP INT0INT
          ORG 000BH
          LJMP T0INT                 ;goto T0 interrupt scanning program
          ORG 0023H
          LJMP SERINT               ;goto series port interrupt program

          ORG 0030H
INIT:     CLR EA
          MOV PSW,#00H
          MOV SP,#07H
          MOV IE,#13H               ;enable series port and T0,INT0 interrupt
          MOV IP,#10H               ;series port interrupt priority high
          MOV PCON,#80H             ; pcon:baud rate double( PCON address: 87H)
          MOV TCON,#00000101B       ; tcon:
          MOV TMOD,#21H             ;T1 working at MODE 2     T0 working at MODE 1
          MOV TL0,#98H              ;TIMER T0 interrupt every 17 ms
          MOV TH0,#0BDH
          MOV TH1,#0FDH     ;11.059M  19200Baud(SMOD=1) 9600B(SMOD=0)
          MOV TL1,#0FDH
          MOV SCON,#50H             ;series port working at MODE 1
          SETB REN ;
          ;
          setb tr;CLR RCVE      ;MAX1487 RCV MODE
	  ;
INIT1:    MOV  R0 , #30H
	  CLR  A
INIT11:   MOV  @R0 , A                   ;
          INC  R0                        ;
          CJNE R0 , #80H , INIT11

	  MOV A,P1
	  RR A
	  RR A
	  ANL A,#03FH
	  MOV ID,A     ;地址编号
          ;mov id,#1

        MOV  TOT,#TON
        CLR CMDOK
        SETB TR0        ;Start T0,T1
        SETB TR1
        SETB IT0        ;int0下跳沿有效
        SETB EA         ;Enable IRQ

        ;CALL SHOWID     ;
;####### MAIN PROCESS ######
;main processing program
MAIN:   NOP
        NOP
        JNB TREADY,MAIN1
        CLR TREADY
        CPL PLED
        ;CALL DISP       ;刷新显示
MAIN1:  JNB CMDOK,MAIN2
        LCALL PROCESS
MAIN2:
MAIN3:
MAIN4:  SJMP MAIN

PROCESS:;Process Serial Command...
        CLR CMDOK;;;;
        CALL CHECKCMD
        JNB  BOK,PRORT
        cpl led2
        ;CALL SHOWMODE1
PRORT:  RET

CHECKCMD:
        CLR BOK
        MOV  A,RCVADDR+1     ;Board ID
        XRL  A,ID            ;是我的接收地址?
        JNZ  CCMDERR
        MOV  A,RCVADDR+2     ;Command
        MOV  CMD,A
        CJNE A,#CMD1H,CCMD1  ;是我可以处理的命令?
        SJMP CRCCHK
CCMD1:  CJNE A,#CMD2H,CCMD11
        SJMP CRCCHK
CCMD11:
CCMD12: SJMP CCMDERR

CRCCHK: ;SJMP CCRCOK
	MOV  R0,#RCVADDR
        MOV  CHKSUM,#0
        MOV  A,@R0
        CJNE A,#RCVLEN,CCRC1
CCRC1:  JNC  CCMDERR
        MOV  A,@R0
        MOV  R1,A ;LEN
        INC  R0
CCRC2:  MOV A,@R0
        XRL A,CHKSUM
        MOV CHKSUM,A
        INC R0
        DJNZ R1,CCRC2
        MOV A,CHKSUM
        CJNE A,#0,CCRC3
CCRCOK:
        SETB BOK
        RET
CCRC3:  ;要求重发数据

CCMDERR:CLR BOK
        RET

SHOWMODE1:
        MOV R0,#RCVADDR+3
        MOV R1,#SHOWD0
        MOV A,RCVADDR
        CLR C
        SUBB A,#3
        MOV R3,A
        MOV SHOWLEN,A
SHOWM2: ;
        MOV A,@R0
        MOV @R1,A
        INC R0
        INC R1
        DJNZ R3,SHOWM2
        JMP DISP

SHOWID:
	MOV R0,#SHOWD0
	MOV R3,#10
	MOV SHOWLEN,#10
	CLR A
	JNB PID,SHOWID1
SHOWT1: MOV @R0,A
	INC R0
	INC A
	DJNZ R3,SHOWT1
	JMP DISP
SHOWID1:;SHOW ID   显示地址编号
	MOV A,ID
	MOV B,#10
	DIV AB
	MOV SHOWD0,A
	MOV SHOWD1,B
	MOV R0,#SHOWD0+2
	MOV R3,#8
	MOV A,#0FH
	JMP SHOWT1
;****************
INT0INT:
	RETI

;series port interrupt program
SERINT:
          CLR EA
          JNB RI,SENDINT ;receiving interrupt? N goto SEND
          JMP SIN       ;call SIN sub_program
SENDINT:  JNB TI,SINTRT
          ;CALL SOUT
          CLR TI
SINTRT:   SETB EA
          RETI
;receiving sub_program
SIN:      PUSH PSW
          PUSH ACC
          MOV A,SBUF                ;read SBUF
          MOV RDD,A
          MOV A,RDN
          CJNE A,#00,SIN1
SIN0:     MOV A,RDD
          CJNE A,#COMH0,SIERR;判断3个命令头数据
          SJMP SINS;
SIN1:     CJNE A,#01,SIN12
          MOV A,RDD
          CJNE A,#COMH1,SIERR;
          SJMP SINS
SIN12:    CJNE A,#02,SIN2
          MOV A,RDD
          MOV RCVNN,A   ;后继数据包长度
          INC RCVNN
          ;注意:从长度数据开始保存
SIN2:     MOV A,RDD
          CALL RCVBUF   ;写缓冲区
          DJNZ RCVNN,SINS   ;数据接收完毕?
          SETB CMDOK
          MOV RDN,#0
          MOV RCVTAIL,#0
          SJMP SIRT
          ;
SIERR:    MOV RDN,#0
          SJMP SIRT
SINS:     INC RDN
SIRT:     CLR RI        ;clear RI flag
          POP ACC
          POP PSW
          SETB EA
          RETI          ;!!

RCVBUF:   ;写串口接收缓冲区
          PUSH 00H       ;save R0 ( address: 00H)
          PUSH ACC       ;Data
          MOV A,RCVTAIL
          CJNE A,#RCVLEN,RCVBF2
          ;Stop数据包超长,数据不再保存
          ;mov rdn,#0 ;Bug?yes!没有清除RcvTail,使后继命令不能正常保存
          POP ACC
          POP 00H
          RET
RCVBF2:   MOV A,#RCVADDR       ;
          ADD A,RCVTAIL        ;get RCV buffer tail pointer point_to_address
          MOV R0,A
          POP ACC        ;Data
          MOV @R0,A
          INC RCVTAIL
          POP 00H
          RET



; T0 interrupt scanning program
T0INT:    PUSH PSW
          CLR TR0                   ;stop TIMER T0 run
          MOV TL0,#00H         ;low 8 bits of T0 initializing value    17ms
          MOV TH0,#0F0H        ;high 8 bits of T0 initializing value ;OK..
          SETB TR0
          DJNZ TOT,T0RET
          SETB TREADY
          MOV TOT,#TON
T0RET:    POP PSW
          RETI


;***************************
DISP:
	CLR	P_STB		;CLR SCK,STB
	CLR	P_SCK
	MOV     A,SHOWLEN
	ADD     A,#SHOWD0-1
	MOV	R1,A
	MOV	R4,SHOWLEN
DIS1:
;	MOV	A,R4
;	CJNE	A,#1,DIS2
;	SETB	FB_DP
;	AJMP	DIS3
;DIS2:
	CLR	FB_DP
;DIS3:
	MOV	A,@R1
	JNB     ACC.4,DIS4
	SETB    FB_DP
	CLR     ACC.4
DIS4:
	ACALL	SEND
	DEC	R1
	DJNZ	R4,DIS1
DISE:
	SETB	P_STB
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	P_STB
	RET
;***************************
;SEND 1 DIGIT
;IN: A IS ONE BCD
;OUT: 74595 HAVE BIG7
;USE: R2
;***************************
SEND:	ACALL	GET_BIG7
	JNB	FB_DP,SEND0
	CLR	ACC.0
SEND0:
	MOV	R2,#8
SEND1:	RLC	A
	JC	SEND2
	CLR	P_SD
	AJMP	SEND3
SEND2:	SETB	P_SD
SEND3:	NOP
	NOP
	NOP
	NOP
	SETB	P_SCK
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	P_SCK
	DJNZ	R2,SEND1
	RET
;***************************************
GET_BIG7:
	MOV     DPTR,#DTAB
	MOVC    A,@A+DPTR
	RET
;***************************************
;显示译码 ABCDEFGP
;***************************************
DTAB:   DB      03H     ;0000 0011 0
	DB      9FH     ;1001 1111 1
	DB      25H     ;0010 0101 2
	DB      0DH     ;0000 1101 3
	DB      99H     ;1001 1001 4
	DB      49H     ;0100 1001 5
	DB      41H     ;0100 0001 6
	DB      1FH     ;0001 1111 7
	DB      01H     ;0000 0001 8
	DB      09H     ;0000 1001 9
	DB	0FFH	;1111 1111 A(HIDE)
	DB	0FEH	;1111 1110 .
	DB	0FFH
	DB 	0FFH
	DB 	0FFH
	DB	0FFH

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -