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

📄 newfx.asm

📁 用于高速公路收费处的语音收费系统的下位机部分的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;费显程序《单片机89C51,晶振11.0592MHZ》

	ORG	0000H
	LJMP	MAIN

	ORG	0003H		;INT0中断,EOM放音结束信号
	LJMP	I0_INT

	ORG	000BH		;定时器0中断,看门狗复位
	LJMP	T0_INT
	
	ORG	0023H		;串行中断
	LJMP	RECIVE

	ORG	0100H

CMD_ADD		EQU	10H		;命令缓冲区指针
PLY_ADD		EQU	11H		;放音缓冲区指针
DSP_ADD		EQU	12H		;显示缓冲区指针
CHK_ADD		EQU	13H		;命令校验地址指针
ANA_ADD		EQU	14H		;命令处理地址指针


BYT_NUM		EQU	15H		;命令字节计数器
CMD_NUM		EQU	16H		;命令条数计数器
CMD_CUR		EQU	17H		;当前命令条数计数器

DSP_BUF		EQU	18H		;显示缓冲区,内部RAM
PLY_BUF		EQU	21H		;放音缓冲区,内部RAM
CHK_BUF		EQU	30H		;命令校验缓冲区,内部RAM
CMD_BUF		EQU	40H		;命令缓冲区,内部RAM

PLY_FLG		EQU	00H		;放音标志,内部位寻址区
CMD_FLG		EQU	01H		;命令缓冲区标志
DSP_HIG		EQU	02H		;高位显示标志
HIG_FLG		EQU	03H		;金额高位标志
ZER_FLG		EQU	04H		;金额高位零标志
DSP_FLG1	EQU	05H		;车型显示状态标志
DSP_FLG2	EQU	06H		;金额显示状态标志

PSW0		EQU	00H		;寄存器区0
PSW1		EQU	08H		;寄存器区1


WREN_INST	EQU	06H		;X25045操作指令定义
WRDI_INST	EQU	04H
WRSR_INST	EQU	01H
RDSR_INST	EQU	05H
WRITE_INST	EQU	02H
READ_INST	EQU	03H
BYTE_ADDR	EQU	55H
BYTE_DATA	EQU	11H
INIT_INST	EQU	09H
STATUS_REG	EQU	20H		;状态寄存器	D7 D6 D5  D4  D3  D2  D1  D0
;看门狗定时200MS			;状态位标志	X  X  WD1 WD0 BL1 BL0 WEL WIP
					;看门狗时间(WD1,WD0)   0   0 ------1.4 S
MAX_POLL	EQU	99H		;		       0   1 ------600 MS
INIT_STATE	EQU	09H		;		       1   0 ------200 MS
					;		       1   1 ------DISABLE



LED_0	BIT	P2.0		;车型位选
LED_1	BIT	P2.3		;千位选
LED_2	BIT	P2.4		;百位选
LED_3	BIT	P2.5		;十位选
LED_4	BIT	P2.6		;个位选
PLAYL	BIT	P2.7		;电平播放信号

EOM	BIT	P3.3		;播放结束信号

CS	BIT	P1.0		;X25045功能定义
SI	BIT	P1.1
SCK	BIT	P1.2
SO	BIT	P1.3



			;放音段各段起始地址表
TABLE1:
	DB	4			;"零" -----------------	0
	DB	9			;"一"			1
	DB	14			;"二" -----------------	2
	DB	19			;"三"			3
	DB	24			;"四" -----------------	4
	DB	29			;"五"			5
	DB	34			;"六" -----------------	6
	DB	39			;"七"			7
	DB	44			;"八" -----------------	8
	DB	49			;"九"			9
	DB	54			;"十" -----------------	10
	DB	59			;"百"			11
	DB	64			;"千" -----------------	12
	DB	69			;"元"			13
	DB	76			;"型车"---------------- 14
	DB	74			;"一型车"		15
	DB	82			;"二型车" ------------- 16
	DB	90			;"三型车"		17
	DB	98			;"四型车" ------------- 18
	DB	106			;"五型车"		19
	DB	114			;"六型车" ------------- 20
	DB	122			;"请交"			21
	DB	129			;"您好" --------------- 22
	DB	135			;再见,欢迎下次光临"     23

		;七段显示码表
TABLE2:
		;0   1   2   3   4   5   6   7   8   9
	DB	3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH


	;89C51主程序

MAIN:	
	MOV	8EH,#0FFH
	MOV	SP,#60H	
	MOV	PSW,#PSW0	;状态字寄存器,工作寄存器组0
	MOV	PCON,#00H	;电源控制寄存器
	MOV	SCON,#50H	;串行方式1,波特率可变
	MOV	TMOD,#21H	;定时器1,方式2,8位自动装入;定时器0,方式1,16位定时
	MOV	TL1,#0FDH	;波特率9600 BIT/S
	MOV	TH1,#0FDH	;
	SETB	TR1		;启动定时器1
	MOV	TL0,#0B0H	;定时常数3CB0H=15536D,50MS定时中断
	MOV	TH0,#3CH	;
	SETB	TR0		;启动定时器0
	CLR	RI		;清中断接收标志
	CLR	EX0		;请外部中断0
	MOV	IP,#10H		;串行口高优先级中断
	MOV	IE,#93H		;中断允许寄存器,允许串行口、定时器0、外部0中断
	MOV	R0,#10H
	MOV	R7,#70H
	MOV	A,#00H
CLEAR:	MOV	@R0,A		;清标志寄存器,计数器
	INC	R0
	DJNZ	R7,CLEAR
	MOV	R0,#00H		;放音段号寄存器
	MOV	R1,#00H		;命令校验地址寄存器
	MOV	A,#CMD_BUF	;指针初始化
	MOV	CMD_ADD,A
	MOV	ANA_ADD,A
	MOV	A,#PLY_BUF
	MOV	PLY_ADD,A
	MOV	A,#DSP_BUF
	MOV	DSP_ADD,A
	MOV	A,#CHK_BUF
	MOV	CHK_ADD,A
	MOV	P1,#INIT_INST	;初始化看门狗电路
	LCALL	WREN_CMD
	LCALL	WRSR_CMD
	MOV	P0,#00H		;关闭显示
	CLR	LED_0
	CLR	LED_1
	CLR	LED_2
	CLR	LED_3
	CLR	LED_4
	
	;命令处理程序
CMD_ANA:
	JNB	CMD_FLG,$
	MOV	A,CMD_CUR
	CJNE	A,CMD_NUM,NEXT
	MOV	CMD_CUR,#0
	MOV	CMD_NUM,#0
	CLR	CMD_FLG
	MOV	CMD_ADD,#CMD_BUF
	MOV	ANA_ADD,#CMD_BUF
	LJMP	CMD_ANA
NEXT:	INC	CMD_CUR
	MOV	R0,#CMD_BUF
	MOV	A,CMD_CUR
	CJNE	A,#7,GO_ANA
	MOV	A,#1
	MOV	CMD_CUR,A
GO_ANA:	DEC	A
	MOV	B,#5
	MUL	AB
	ADD	A,R0
	MOV	R0,A
	INC	R0		;命令的第二字节为命令类型
	MOV	CMD_ADD,R0
	MOV	A,@R0
	CJNE	A,#01H,NEXT1
	LCALL	D_TYPE		;带头显示车型指令
	LJMP	CMD_ANA	
NEXT1:	CJNE	A,#02H,NEXT2
	LCALL	O_TYPE		;纯显示车型指令
	LJMP	CMD_ANA
NEXT2:	CJNE	A,#03H,NEXT3
	LCALL	H_TYPE		;消隐车型显示指令
	LJMP	CMD_ANA
NEXT3:	CJNE	A,#04H,NEXT4
	LCALL	D_YUAN		;显示金额指令
	LJMP	CMD_ANA
NEXT4:	CJNE	A,#05H,NEXT5
	LCALL	H_YUAN		;消隐显示金额指令
	LJMP	CMD_ANA
NEXT5:	CJNE	A,#06H,NEXT6
	LCALL	CAR_PASS	;过车指令
	LJMP	CMD_ANA
NEXT6:	CJNE	A,#07H,NEXT7
	LCALL	STA_CHK		;状态自检指令
	LJMP	CMD_ANA
NEXT7:	CJNE	A,#08H,NO_CMD
	LCALL	STA_QRY		;状态查询指令
	LJMP	CMD_ANA
NO_CMD:	MOV	CMD_CUR,#0
	MOV	CMD_NUM,#0
	CLR	CMD_FLG
	MOV	CMD_ADD,#CMD_BUF
	MOV	ANA_ADD,#CMD_BUF
	LJMP	CMD_ANA

	
	;******************************* 带头显示车型指令 *********************

D_TYPE:	
	CLR	PLY_FLG
	SETB	PLAYL		;停止所有前面放音
	MOV	A,#PLY_BUF
	MOV	R0,A		;R0放音缓冲区指针
	MOV	A,#22		;"您好"
	MOV	@R0,A
	INC	R0
	MOV	R1,CMD_ADD	;R1命令缓冲区指针
	INC	R1		;取车型字节
	MOV	A,@R1		;R1命令缓冲区指针可以释放
	SUBB	A,#30H
	MOV	R1,#DSP_BUF	;R1显示缓冲区区指针
	MOV	@R1,A		;车型送显示缓冲区
	CJNE	A,#07,N07
	MOV	@R0,A		;车型号(7)
	INC	R0
	MOV	A,#14
	MOV	@R0,A		;型车
	INC	R0
	AJMP	DOVR
N07:	CJNE	A,#08,N08	
	MOV	@R0,A		;车型号(8)
	INC	R0
	MOV	A,#14
	MOV	@R0,A		;型车
	INC	R0
	AJMP	DOVR
N08:	ADD	A,#14		;计算型车的位置
	MOV	@R0,A		;车型号(1-6)
	INC	R0
DOVR:	MOV	A,#0FFH		;语音结束标记
	MOV	@R0,A
	LCALL	SND_PLY
	LCALL	DISPLAY_0
	RET

	;*********************************** 纯显示车型指令 **************************

O_TYPE:	
	MOV	A,#DSP_BUF
	MOV	DSP_ADD,A
	MOV	A,#PLY_BUF
	MOV	R0,A
	MOV	R1,CMD_ADD
	INC	R1		;取车型字节
	MOV	A,@R1
	SUBB	A,#30H
	MOV	R1,#DSP_BUF
	MOV	@R1,A		;车型送显示缓冲区
	CJNE	A,#07,ON07
	MOV	@R0,A		;车型号(7)
	INC	R0
	MOV	A,#14
	MOV	@R0,A		;型车
	INC	R0
	AJMP	OOVR
ON07:	CJNE	A,#08,ON08	
	MOV	@R0,A		;车型号(8)
	INC	R0
	MOV	A,#14
	MOV	@R0,A		;型车
	INC	R0
	AJMP	OOVR
ON08:	ADD	A,#14		;计算型车的位置
	MOV	@R0,A		;车型号(1-6)
	INC	R0
OOVR:	MOV	A,#0FFH		;语音结束标记
	MOV	@R0,A
	LCALL	DISPLAY_0
	LCALL	SND_PLY
	RET

	;********************************* 消隐显示车型指令 ***************************

H_TYPE:	
	MOV	P0,#00h
	SETB	LED_0
	CALL	DLY
	CLR	LED_0
	CALL	DLY
	CLR	PLY_FLG
	SETB	PLAYL		;停止放音
	CLR	DSP_FLG1	;车型显示标志,供状态查询用
	RET


	;********************************* 显示金额指令 ********************************

D_YUAN:	
 	JB	PLY_FLG,$
	CLR	HIG_FLG
	CLR	ZER_FLG
	MOV	A,#PLY_BUF
	MOV	R0,A
	MOV	A,#21		;"请交"
	MOV	@R0,A
	INC	R0
	MOV	R1,CMD_ADD
	INC	R1		;取金额除以一百的整数
	MOV	CMD_ADD,R1
	MOV	A,@R1
	MOV	B,#10
	DIV	AB
	DA	A
	PUSH	ACC	
	MOV	R1,#DSP_BUF
	MOV	@R1,A		;千位数据送显示缓冲区
	INC	R1
	MOV	A,B
	DA	A
	MOV	B,A
	MOV	@R1,A		;百位数据送显示缓冲区
	INC	R1
	MOV	DSP_ADD,R1
	POP	ACC
	MOV	R2,A
	CJNE	R2,#0,QIAN
	LJMP	BAI_ANA		;千位为零转百位处理
QIAN:	MOV	@R0,A		;千位不为零
	INC	R0
	MOV	A,#12		;"千"
	MOV	@R0,A
	INC	R0
	SETB	HIG_FLG		;表示千位有数据
BAI_ANA:MOV	A,B
	CJNE	A,#0,BAI
	JNB	HIG_FLG,GET_MOD	;千位为零,百位为零转其余处理
	MOV	@R0,A		;千位不为零,百位为零
	INC	R0
	SETB	ZER_FLG		;表示有百位零数据
	LJMP	GET_MOD
BAI:	MOV	@R0,A		;百位不为零
	INC	R0
	MOV	A,#11		;"百"
	MOV	@R0,A
	INC	R0
	SETB	HIG_FLG		;表示百位有数据	
GET_MOD:MOV	R1,CMD_ADD
	INC	R1		;取金额除以一百的余数
	MOV	A,@R1
	MOV	B,#10
	DIV	AB
	DA	A
	PUSH	ACC
	MOV	R1,DSP_ADD
	MOV	@R1,A		;十位数据送显示缓冲区
	INC	R1
	MOV	A,B
	DA	A
	MOV	B,A
	MOV	@R1,B		;个位数据送显示缓冲区
	POP	ACC
	CJNE	A,#0,SHI
	JB	ZER_FLG,GE_ANA	;百位已经有过零
	JNB	HIG_FLG,GE_ANA	;百位没有过零,高位也没有数据
	MOV	@R0,A		;百位没有过零,但高位有数据
	INC	R0
	LJMP	GE_ANA
SHI:	CJNE	A,#1,GOGO
	LJMP	NO_YI
GOGO:	MOV	@R0,A		;十位不为零
	INC	R0
NO_YI:	MOV	A,#10		;"十"
	MOV	@R0,A
	INC	R0
GE_ANA:	MOV	A,B
	CJNE	A,#0,SET_GE
	DEC	R0
	MOV	A,@R0
	CJNE	A,#0,FUK
	LJMP	FUKUAN
FUK:	INC	R0
	LJMP	FUKUAN
SET_GE:	MOV	@R0,A		;个位不为零
	INC	R0
FUKUAN:	MOV	A,#13		;"元"
	MOV	@R0,A	
	INC	R0
	MOV	A,#0FFH		;结束标记
	MOV	@R0,A
	LCALL	DISPLAY_1
	LCALL	SND_PLY
	RET

	;************************************* 消隐显示进金额指令 *************************

H_YUAN:	
	MOV	A,#0
	MOV	P0,A
	SETB	LED_1
	CALL	DLY
	CLR	LED_1
	CALL	DLY
	SETB	LED_2
	CALL	DLY
	CLR	LED_2
	CALL	DLY
	SETB	LED_3
	CALL	DLY
	CLR	LED_3
	CALL	DLY
	SETB	LED_4
	CALL	DLY
	CLR	LED_4
	CALL	DLY
	CLR	PLY_FLG
	SETB	PLAYL		;停止放音
	CLR	DSP_FLG2	;金额显示标志,供状态查询用
	RET


	;************************************** 过车指令 **********************************
CAR_PASS:	
	JB	PLY_FLG,$
	MOV	A,#PLY_BUF
	MOV	R0,A
	MOV	A,#23		;"再见"
	MOV	@R0,A
	INC	R0
	MOV	@R0,#0FFH
	LCALL	H_TYPE
	LCALL	H_YUAN
	LCALL	SND_PLY
	RET


	;************************************** 状态自检指令 *******************************
STA_CHK:
	JB	PLY_FLG,$
	MOV	R4,#10
	MOV	R0,#0
NEXT_DISP:
	MOV	A,R0
	LCALL	CHG_OUT
	SETB	LED_0
	CALL	DLY
	CLR	LED_0
	CALL	DLY
	SETB	LED_1
	CALL	DLY
	CLR	LED_1
	CALL	DLY
	SETB	LED_2
	CALL	DLY
	CLR	LED_2
	CALL	DLY
	SETB	LED_3
	CALL	DLY
	CLR	LED_3
	CALL	DLY
	SETB	LED_4
	CALL	DLY
	CLR	LED_4
	CALL	DLY
	LCALL	DELAY1S
	INC	R0
	DJNZ	R4,NEXT_DISP
	LCALL	H_TYPE

⌨️ 快捷键说明

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