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

📄 newfx.asm

📁 用于高速公路收费处的语音收费系统的下位机部分的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	LCALL	H_YUAN
	RET

	;************************************** 状态查询指令 *******************************
STA_QRY:
	CLR	ES
	MOV	A,#0DDH		;状态发送命令
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	MOV	A,#00H
	JNB	DSP_FLG1,S_SND1
	MOV	A,#01H		;"1"车型显示
S_SND1:	JNB	DSP_FLG2,S_SND2
	ADD	A,#02H		;"2"金额显示,"3"车型、金额显示
S_SND2:	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	XRL	A,#0DDH
	MOV	SBUF,A
	JNB	TI,$	
	CLR	TI
	SETB	ES
	RET


	;************************************ 以下为子程序 *********************************


	;放音程序

SND_PLY:
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	MOV	R0,#PLY_BUF
	MOV	A,@R0
	INC	R0
	MOV	PLY_ADD,R0
	MOV	DPTR,#TABLE1
	MOVC    A,@A+DPTR     	;查找播放语音地址
	MOV	P0,#0FFH 	;输出ISD地址信号
	LCALL	DELAY1MS
        MOV	P0,A	 	;输出ISD地址信号
	LCALL	DELAY1MS
	LCALL	DELAY1MS
        LCALL	DELAY1MS
	CLR	PLAYL		;开始播放
	SETB	PLY_FLG      	;放音标志置'1'
	SETB	EX0
	RET

	;外部INT0中断EOM放音结束信号

PLY_OVR1:LJMP	PLY_OVR

I0_INT:	
	PUSH	DPL
	PUSH	DPH
	PUSH	ACC
	MOV	A,R0
	PUSH	ACC
	MOV	A,R1
	PUSH	ACC
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	JNB	PLY_FLG,PLY_OVR1;放音标志无效,则不继续放音
	SETB	PLAYL
	MOV	R0,PLY_ADD
	MOV	A,@R0
	CJNE	A,#0FFH,PLY_GO
	LJMP	PLY_OVR
PLY_GO:	INC	R0
	MOV	PLY_ADD,R0
	MOV	DPTR,#TABLE1
	MOVC    A,@A+DPTR     	;查找播放语音地址
        MOV	P0,A	 	;输出ISD地址信号
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	LCALL	DELAY1MS
	CLR	PLAYL		;开始播放
	SETB	PLY_FLG
	POP	ACC
	MOV	R1,A
	POP	ACC
	MOV	R0,A
	POP	ACC
	POP	DPH
	POP	DPL
	AJMP	THE_OVR
PLY_OVR:CLR	PLY_FLG      	;放音标志置'0'
	CLR	EX0
	SETB	PLAYL
	POP	ACC
	MOV	R1,A
	POP	ACC
	MOV	R0,A
	POP	ACC
	POP	DPH
	POP	DPL
THE_OVR:RETI

	;串行中断接收部分

RECIVE:	
	PUSH	DPL
	PUSH	DPH
	PUSH	ACC
	MOV	A,R0
	PUSH	ACC
	MOV	A,R1
	PUSH	ACC
	MOV	A,R2
	PUSH	ACC
	MOV	R0,CHK_ADD
	MOV	A,SBUF
	MOV	@R0,A
	INC	R0
	MOV	CHK_ADD,R0
	INC	BYT_NUM
	MOV	R2,BYT_NUM
	CJNE	R2,#05H,RETURN
	LJMP	ONE_CMD
RETURN:	CLR	RI
	POP	ACC
	MOV	R2,A
	POP	ACC
	MOV	R1,A
	POP	ACC
	MOV	R0,A
	POP	ACC
	POP	DPH
	POP	DPL
	RETI

ONE_CMD:MOV	BYT_NUM,#00H
	LCALL	CHECK
	MOV	CHK_ADD,#CHK_BUF
	LJMP	RETURN


	;定时器0中断50MS一次,看门狗复位

T0_INT:	
	LCALL	RST_WDOG
	MOV	TL0,#0B0H	;定时常数3CB0H=15536D,50MS定时中断
	MOV	TH0,#3CH	;
	SETB	TR0		;启动定时器0
	RETI



	;串行上报信息程序
SEND:	
	MOV	A,#0BBH
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	MOV	R0,#CHK_BUF
	INC	R0
	MOV	A,@R0
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	XRL	A,#0BBH
	MOV	SBUF,A
	JNB	TI,$	
	CLR	TI
	RET


	;命令校验程序

CHECK:	
	MOV	A,#CHK_BUF
	MOV	R0,A		;第四字节为前三字节的异或和
	MOV	A,@R0
	INC	R0
	XRL	A,@R0	
	INC	R0
	XRL	A,@R0	
	INC	R0
	XRL	A,@R0
	INC	R0
	XRL	A,@R0
	JNZ	ERROR
	LCALL	SEND		;上报成功接收信息
	MOV	A,#CHK_BUF	;将正确命令送到命令缓冲区
	MOV	R0,A
	MOV	R1,ANA_ADD
	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1	
	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1	
	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1	
	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1	
	MOV	A,@R0
	MOV	@R1,A
	INC	R1
	MOV	ANA_ADD,R1
	SETB	CMD_FLG
	INC	CMD_NUM
	MOV	A,CMD_NUM
	CJNE	A,#6,MYRET
	MOV	ANA_ADD,#CMD_BUF
	AJMP	BACK
MYRET:	CJNE	A,#7,BACK
	MOV	CMD_NUM,#1
BACK:	RET	

	;接收错误处理

ERROR:	
	MOV	A,#0CCH		;错误接受命令
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	MOV	R0,#CHK_BUF
	INC	R0
	MOV	A,@R0
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	XRL	A,#0CCH
	MOV	SBUF,A
	JNB	TI,$	
	CLR	TI
	RET


CHG_OUT:
	MOV	DPTR,#TABLE2
	MOVC	A,@A+DPTR
	MOV	P0,A
	RET


	; 显示程序

DISPLAY_0:
	MOV	A,#DSP_BUF
	MOV	R0,A
	MOV	A,@R0
	PUSH	DPH
	PUSH	DPL
DISP:	LCALL	CHG_OUT
	SETB	LED_0		;锁存车型数据
	LCALL	DLY
	CLR	LED_0
	LCALL	DLY
	SETB	DSP_FLG1	;车型显示标志,供状态查询用
DISP_OVR0:
	POP	DPL
	POP	DPH
	RET
	
DISPLAY_1:
	PUSH	DPH
	PUSH	DPL
	LCALL	H_YUAN		;关闭金额显示
	CLR	DSP_HIG
	MOV	R0,#DSP_BUF
	MOV	A,@R0
	CJNE	A,#0H,DISP_Q
LED_BAI:INC	R0
	MOV	A,@R0
	CJNE	A,#0,DISP_B
	JB	DSP_HIG,DISP_B	;千位有数据,百位0要显示
LED_SHI:INC	R0
	MOV	A,@R0
	CJNE	A,#0,DISP_S
  	JB	DSP_HIG,DISP_S	;千/百位有数据,十位0要显示
LED_GE:	INC	R0
	MOV	A,@R0
	LJMP	DISP_G
DISP_Q:	LCALL	CHG_OUT
	SETB	LED_1		;锁存千位数据
	CALL	DLY
	CLR	LED_1
	CALL	DLY
	SETB	DSP_HIG
	LJMP	LED_BAI
DISP_B:	LCALL	CHG_OUT
	SETB	LED_2		;锁存百位数据
	CALL	DLY
	CLR	LED_2
	CALL	DLY
	SETB	DSP_HIG
	LJMP	LED_SHI
DISP_S:	LCALL	CHG_OUT
	SETB	LED_3		;锁存十位数据
	CALL	DLY
	CLR	LED_3
	CALL	DLY
	LJMP	LED_GE
DISP_G:	LCALL	CHG_OUT
	SETB	LED_4		;锁存个位数据
	CALL	DLY
	CLR	LED_4
	CALL	DLY
	SETB	DSP_FLG2	;金额显示标志,供状态查询用
DISP_OVR1:
	POP	DPL
	POP	DPH
	RET

DLY:	
	NOP
	NOP
	NOP
	NOP
	NOP
	RET



	;********************************** X25045操作命令 ************************************


	;X25045写使能命令

WREN_CMD:
	CLR	SCK
	CLR	CS
	MOV	A,#WREN_INST
	LCALL	OUTBYT
	CLR	SCK
	SETB	CS
	RET


	;X25045复位写使能命令

WRDI_CMD:
	CLR	SCK
	CLR	CS
	MOV	A,#WRDI_INST
	LCALL	OUTBYT
	CLR	SCK
	SETB	CS
	RET


	;X25045写状态寄存器命令(写看门狗定时)

WRSR_CMD:
	CLR	SCK
	CLR	CS
	MOV	A,#WRSR_INST
	LCALL	OUTBYT
	MOV	A,#STATUS_REG
	LCALL	OUTBYT
	CLR	SCK
	SETB	CS
	LCALL	WIP_POLL
	RET

	;X25045读状态寄存器命令(写看门狗600MS定时)

RDSR_CMD:
	CLR	SCK
	CLR	CS
	MOV	A,#RDSR_INST
	LCALL	OUTBYT
	LCALL	INBYT
	CLR	SCK
	SETB	CS
	RET

	;X25045单字节写命令

BYTE_WRITE:
	MOV	DPTR,#BYTE_ADDR
	CLR	SCK
	CLR	CS
	MOV	A,#WRITE_INST
	MOV	B,DPH
	MOV	C,B.0
	MOV	ACC.3,C
	LCALL	OUTBYT
	MOV	A,DPL
	LCALL	OUTBYT
	MOV	A,#BYTE_DATA
	LCALL	OUTBYT
	CLR	SCK
	SETB	CS
	LCALL	WIP_POLL
	RET


	;X25045复位看门狗命令

RST_WDOG:
	CLR	CS
	SETB	CS
	RETI

	;X25045写处理检测命令

WIP_POLL:
	MOV	R1,#MAX_POLL
WIP_POLL1:
	LCALL	RDSR_CMD
	JNB	ACC.0,WIP_POLL2
	DJNZ	R1,WIP_POLL1
WIP_POLL2:
	RET

	;X25045字节输出命令

OUTBYT:
	MOV	R0,#08H
OUTBYT1:CLR	SCK
	RLC	A
	MOV	SI,C
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB	SCK
	DJNZ	R0,OUTBYT1
	CLR	SI
	RET

	;X25045字节输入命令

INBYT:
	MOV	R0,#08H
INBYT1:	SETB	SCK
	CLR	SCK
	MOV	C,SO
	RLC	A
	DJNZ	R0,INBYT1
	RET

DELAY1MS:
	MOV	R7,#05H
DLY0:	MOV	R6,#0F7H
	DJNZ	R6,$
	DJNZ	R7,DLY0
	RET

DELAY1S:MOV	R7,#14H
DLY01:	MOV	R6,#0C8H
DLY00:	MOV	R5,#0F7H
	DJNZ	R5,$
	DJNZ	R6,DLY00
	DJNZ	R7,DLY01
	RET
	END

⌨️ 快捷键说明

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