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

📄 test.asm

📁 PT2258+SEG2+12M+89C2051+TDA7377 功放程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*	标题:	5.1	PT2258功放程序
;*	硬件:	配原程序的5.1功放单面PCB板DIY套件
;*	文件:	MA035.ASM
;*	日期:	2002-1-2
;*	版本:	1.0
;*	作者:	单片机音响技术网	-	ZHANGSHAOBIN
;*	邮箱:	SHAOBINZ@163.COM
;*	描述:	;*	PT2258+SEG2+12M+89C2051+TDA7377	功放程序
;*	设置:	;*	DIY套件,按清单DIY焊接和指导文件即可成功
	;*	【版权】	COPYRIGHT(C)单片机音响技术网	WWW.MCU51AV.COM	ALL	RIGHTS	RESERVED
	;*	【声明】	此程序仅用于学习与参考,引用请注明版权和作者信息!
	COUNTER	EQU	35H	;显示计数
	REMVOL	EQU	36H	;音量连续控制
	DISPBUFF1	EQU	37H	;个位暂存
	DISPBUFF2	EQU	38H	;十位暂存
	DISPBUFF3	EQU	39H	;指示灯暂存
	DISPBUFF	EQU	3AH	;显示缓冲区
	;-----------------------------------------------------------
	MTD	EQU	30H	;PT2258数据首址(30H-31H,16字节)
	NUMBYT	EQU	3BH	;PT2258数据位数
	;-----------------------------------------------------------
	CS_X1	EQU	3CH	;遥控
	CS0_X1	EQU	3DH
	U0_X1	EQU	3EH	;遥控数据暂存区
	NO_M	EQU	40H	;遥控按键数据码
	;-----------------------------------------------------------
	FRONT	EQU	41H	;前置音量缓存
	REAR	EQU	42H	;环绕音量缓存
	CEN	EQU	43H	;中置音量缓存
	S_UB	EQU	44H	;重低音音量缓存
	RVER	EQU	45H	;环绕微调音量缓存
	CVER	EQU	46H	;中置微调音量缓存
	SVER	EQU	47H	;重低音微调音量缓存
	FVER	EQU	48H	;前置微调音量缓存
	PHONE	EQU	49H
	NO_N	EQU	51H
	;-----------------------------------------------------------
	ORG	0000H
	AJMP	START
	ORG	000BH	;定时器T0入口
	AJMP	ITT0
	ORG	0013H	;外部中断INT1入口地址
	AJMP	INO1	;
	ORG	001BH	;
	AJMP	DISP	;定时器T1入口显示程序
	;-----------------------------------------------------------
START:	;初始化
	MOV	SP,#60H	;指针指向60H
	MOV	PSW,#00H
	MOV	IE,#00H
	MOV	IP,#00H
	CLR	P3.1	;刚开机时7370STANDBY待机
	CLR	EA	;关总中断
	CLR	P3.5	;开LED显示(PNP的管子)
	SETB	P3.7	;数码管不显示
	MOV	P1,#7FH	;电源灯亮(P1.7=0),数码管十位也关了
	SETB	P3.2	;
	SETB	P3.4	;让SDA,SLK保持高电平
	CLR	P3.0	;AC-3输入状态
	SETB	P3.3	;外中断1为脉冲下降沿触发
	MOV	TMOD,#00010001B	;定时器0-1工作在方式1
	MOV	TH1,#0F0H	;定时器1预置
	MOV	TL1,#60H	;(65536-#FO60H)
	MOV	TH0,#00H	;定时器0预置
	MOV	TL0,#00H	;(65536-0)65MS够按键按下的时间即可
	SETB	TR0	;开定时器0中断
	SETB	ET0	;开定时器0中断允许
	SETB	EA	;中断总开关开
	SETB	EX1	;外中断1中断允许
	SETB	IT1	;外中断1INT1为负跳变触发方式
	CLR	EX0	;外中断0中断不允许
	CLR	TR1	;定时器1暂不允许
	CLR	(29H).0	;遥控识别位
	MOV	REMVOL,#02H	;音量连续控制赋值02H
	MOV	COUNTER,#0H	;记数器清0
	MOV	FRONT,#34H	;总音量默认级数34
	MOV	REAR,#34H
	MOV	CEN,#34H
	MOV	S_UB,#34H
	MOV	RVER,#5H	;各声道微跳起始显示5级
	MOV	CVER,#5H
	MOV	SVER,#5H
	MOV	FVER,#5H
	MOV	DISPBUFF,#40H	;数码管准备显示40
	ACALL	DELAY	;刚开机时不能马上给PT2258送数
	NOP	;延时250MS左右,PT2258要求300MS
	ACALL	DELAY
	NOP
	ACALL	DELAY
	NOP
	ACALL	DELAY
	NOP
	ACALL	DELAY
	NOP
	MOV	30H,#0C0H	;PT2258默认1100	0000,CLEAR	REGIST
	MOV	NUMBYT,#01H	;PT2258数据位数赋值01只传8位
	ACALL	WRNBYT	;I2C数据总线
	NOP
	NOP
	MOV	30H,#0D3H	;1101	0011(6CH	10DB/STEP,-30DB)
	MOV	31H,#0E4H	;1110	0100(6CH	1DB/STEP,-4DB)
	MOV	NUMBYT,#02H	;PT2258数据位数赋值02
	ACALL	WRNBYT
	NOP
	MOV	NO_M,#00H	;遥控按键数据码为0,无键按下状态
	MOV	NO_N,#00H
	MOV	DISPBUFF3,#0DFH	;指示灯暂存1101	1111(还未到P1口)
	;============================主程序=========================
MAIN:	SETB	EA	;允许中断总开关开
	CLR	TR1	;定时器1暂不允许
	CLR	ET1	;关定时器1中断允许
	SETB	P3.7	;关数码管个位
	MOV	P1,#7FH	;电源灯可亮,数码管十位也关了
	CLR	P3.5	;开指示灯,电源灯就亮了
	CLR	P3.1	;TDA7370低电平静音
	SETB	P3.2
	SETB	P3.4
	MOV	30H,#0F9H	;1111	1001(2258静音OF8就不静)
	MOV	NUMBYT,#01H	;PT2258数据位数赋值01
	ACALL	WRNBYT	;写入2258	;2258就静掉了
	NOP
PW_1:	SETB	P3.2	;I2C终止
	SETB	P3.4
	MOV	A,NO_M	;调按键标准数(0~10)
	JZ	PW_1	;无键按下就在此处循环
	MOV	NO_M,#00H
	XRL	A,#01H	;
	JNZ	PW_1	;按MUTE键也在此处循环
	SETB	P3.1	;打开功放,NO	STANDBY状态
	SETB	TR1	;开定时器1	;否则数码管有显示
	SETB	ET1	;开中断1
	CLR	(29H).1	;清静音标志位
	ACALL	CLMUT	;2258	NO	MUTE
	NOP
	MOV	R2,#00H
	MOV	R3,#0FH
LOOP:	SETB	P3.2
	SETB	P3.4
	MOV	A,R3
	XRL	A,#0FH	;R3=0FH,则A=0
	JNZ	KEY	;A不为0则转到KEY
	MOV	R3,#00H
	MOV	A,DISPBUFF3
	ORL	A,#01010110B	;(1101	1111	ORL	0101	0110)
	MOV	DISPBUFF3,A	;(ORL后A=1101	1111,AC-3灯亮)
	CLR	(29H).2
	CLR	(29H).3
	CLR	(29H).4
	CLR	(29H).5
	MOV	R5,DISPBUFF	;(#40H放入R5)
	ACALL	DISP_VOL	;调显示音量
	NOP
KEY:	;遥控散转
	MOV	A,NO_M	;键盘转换值0~11,0,1,2,3...
	JZ	LOOP	;键值=0转LOOP
	MOV	NO_M,#00H	;并将键转换值清0
	RL	A	;实现(0-0,1-2,2-4,3-6,4-8倍乘)
	MOV	DPTR,#TAB_KEY
	NOP
	JMP	@A+DPTR
AJMP	LOOP	;入口地址:	TAB_KEY
	AJMP	MAIN	;TAB_KEY+2
	AJMP	MUTE	;TAB_KEY+4
	AJMP	AC_3_IN	;TAB_KEY+6
	AJMP	RESET	;TAB_KEY+8
	AJMP	AUX_IN	;TAB_KEY+10
	AJMP	FRONT_V	;TAB_KEY+12
	AJMP	CEN_V	;TAB_KEY+14
	AJMP	REAR_V	;TAB_KEY+16
	AJMP	SUB_V	;TAB_KEY+18
	AJMP	VOLDN	;TAB_KEY+20
	AJMP	VOLUP	;TAB_KEY+22
	AJMP	LOOP	;
	AJMP	LOOP
	;===========================================================
RESET:	;复位状态
	CLR	P3.0	;AC-3状态
	MOV	FRONT,#34H	;#34H
	MOV	REAR,#34H
	MOV	CEN,#34H
	MOV	S_UB,#34H
	MOV	RVER,#5H
	MOV	CVER,#5H
	MOV	SVER,#5H
	MOV	FVER,#5H
	MOV	DISPBUFF,#40H	;数码管显示40
	MOV	DISPBUFF3,#0DFH	;(1101	1111转AC-3指示)
	MOV	30H,#0D3H	;(1101	0011	6CH	-10DB/STEP	-30DB)
	MOV	31H,#0E4H	;(1110	0100	6CH	-1DB/STEP	-4DB)
	MOV	NUMBYT,#02H	;2258传16位数
	ACALL	WRNBYT
	NOP
	AJMP	INPUT_A	;跳转
	;-----------------------------------------------------------
AC_3_IN:	;5.1CH输入状态
	MOV	30H,#0F9H	;(1111	1001,2258静音)
	MOV	NUMBYT,#01H
	ACALL	WRNBYT
	NOP
	ACALL	DELAY	;(延时50MS)
	NOP
	MOV	DISPBUFF3,#0DFH	;(AC-3灯状态缓存起来TI到时就亮)
	CLR	P3.0	;AC-3输入
	NOP
	AJMP	INPUT_A	;跳转
	;-----------------------------------------------------------
AUX_IN:	;2CH输入状态
	MOV	30H,#0F9H	;(2258静音)
	MOV	NUMBYT,#01H
	ACALL	WRNBYT
	NOP
	ACALL	DELAY
	NOP
	MOV	DISPBUFF3,#0F7H	;(AUX灯状态缓存起来)
	SETB	P3.0	;AUX输入
INPUT_A:	SETB	(29H).1	;保证2258不会静音
	ACALL	DELAY	;延时50MS
	NOP
	MOV	30H,#0F8H	;(1111	1000	2258	NO	MUTE)
	MOV	NUMBYT,#01H	;(2258传8位数)
	ACALL	WRNBYT
	NOP
	MOV	R3,#0FH	;
	MOV	R2,#00H
	NOP
	AJMP	LOOP	;循环
	;-----------------------------------------------------------
MUTE:	CPL	(29H).1	;(29H).1先取反,保证2258	MUTE	ON
	JB	(29H).1,MUT_1	;如果=1,跳转
	CLR	P3.1
	MOV	30H,#0F9H	;(1111	1001,2258	MUTE	ON)
WRN_1:	MOV	NUMBYT,#1H
	LCALL	WRNBYT	;静音数据写入2258
	NOP
	MOV	R2,#00H
	MOV	R3,#0FH
	NOP
	AJMP	LOOP	;循环
MUT_1:	SETB	P3.1
	MOV	30H,#0F8H	;(1111	1000,2258	MUTE)
	MOV	A,DISPBUFF3
	ORL	A,#10000000B	;(原来亮的仍亮,静音灯要熄)
	MOV	DISPBUFF3,A	;(ORL是有1出1,全0出0)
	NOP
	AJMP	WRN_1	;跳转
	;-----------------------------------------------------------
FRONT_V:	SETB	(29H).2	;为FRONT	VOLUP准备条件
	CLR	(29H).3
	CLR	(29H).4
	CLR	(29H).5
	MOV	R5,FVER	;(FEVER=48H,R5=#5H)
	MOV	A,DISPBUFF3
	ANL	A,#11101111B	;先保证前置灯亮,有0出0,全1出1
	ORL	A,#01000110B	;有1出1,全0出0,第4,5位必须为0在或
	NOP
	AJMP	LOOP_D	;跳转
	;-----------------------------------------------------------
REAR_V:	CLR	(29H).2
	SETB	(29H).3	;为REAR	VOLUP准备条件
	CLR	(29H).4
	CLR	(29H).5
	MOV	R5,RVER
	MOV	A,DISPBUFF3
	ANL	A,#10111111B	;保证环绕灯亮
	ORL	A,#00010110B
	NOP
	AJMP	LOOP_D
	;-----------------------------------------------------------
CEN_V:	CLR	(29H).2
	CLR	(29H).3
	SETB	(29H).4	;为CEN	VOLUP准备条件
	CLR	(29H).5
	MOV	R5,CVER
	MOV	A,DISPBUFF3
	ANL	A,#11111101B	;保证中置灯亮
	ORL	A,#01010100B
	NOP
	AJMP	LOOP_D
	;-----------------------------------------------------------
SUB_V:	CLR	(29H).2
	CLR	(29H).3
	CLR	(29H).4
	SETB	(29H).5	;为SW	VOLUP准备条件
	MOV	R5,SVER
	MOV	A,DISPBUFF3
	ANL	A,#11111011B	;保证重低音灯亮
	ORL	A,#01010010B
	;-----------------------------------------------------------
LOOP_D:	MOV	DISPBUFF3,A
	ACALL	DISP_VOL	;调用音量显示
	NOP
	ACALL	CLMUT	;2258要静音
	NOP
	MOV	R2,#00H
	MOV	R3,#00H
LOOP_A:	NOP
	AJMP	LOOP
	;/////////////////////////////////////////////////////////
CN_VOLUP_1:	NOP
	AJMP	CN_VOLUP
SB_VOLUP_1:	NOP
	AJMP	SB_VOLUP
VOLUP:	;实现2258衰减数减,即音量变大,PHONE是-,反过来理解
	MOV	30H,#0C0H	;(1100	0000,2258CLEAR	REGISTER)
	MOV	NUMBYT,#01H
	ACALL	WRNBYT	;调用I2C
	NOP
	ACALL	CLMUT	;2258静音
	NOP
	MOV	R3,#0
	JB	(29H).2,FR_VOLUP
	JB	(29H).3,RR_VOLUP
	JB	(29H).4,CN_VOLUP_1
	JB	(29H).5,SB_VOLUP_1
	MOV	A,DISPBUFF
	XRL	A,#69H	;最高级别69H
	JZ	LOOP_A	;到69级就跳回去LOOP
	MOV	PHONE,FRONT
	ACALL	DAA
	NOP
	MOV	FRONT,PHONE	;FRONT+1(递加)
	MOV	PHONE,REAR
	ACALL	DAA
	NOP
	MOV	REAR,PHONE	;REAR+1
	MOV	PHONE,CEN
	ACALL	DAA
	NOP
	MOV	CEN,PHONE	;CENT+1
	MOV	PHONE,S_UB
	ACALL	DAA
	NOP
	MOV	S_UB,PHONE	;SW+1
	MOV	PHONE,DISPBUFF
	ACALL	UAA
	NOP
	MOV	DISPBUFF,PHONE	;DISPBUFF+1
	ACALL	FRDATA	;调前置2258调节
	NOP
	ACALL	RRDATA	;调环绕2258调节
	NOP
	ACALL	CNDATA	;调中置2258调节
	NOP
	ACALL	SBDATA	;调低音2258调节
	NOP
	MOV	R5,DISPBUFF	;该显示的级数
	NOP
	AJMP	TT_VOLUP	;到音量显示
FR_VOLUP:	;前置音量递加处理
	MOV	A,FVER
	XRL	A,#10H	;到10级吗
	JZ	LOOP_B	;到了就跳转
	MOV	PHONE,FVER
	ACALL	UAA
	NOP
	MOV	FVER,PHONE	;级数加1
	MOV	PHONE,FRONT
	ACALL	DAA	;使2258衰减数变小,即音量增加
	NOP
	MOV	FRONT,PHONE
	ACALL	FRDATA	;调2258数据处理
	NOP
	MOV	R5,FVER	;要显示的级数
	NOP
	AJMP	TT_VOLUP	;到音量级数显示
LOOP_B:	NOP
	AJMP	LOOP
RR_VOLUP:	;环绕音量递加处理
	MOV	A,RVER
	XRL	A,#10H
	JZ	LOOP_B
	MOV	PHONE,RVER
	ACALL	UAA
	NOP
	MOV	RVER,PHONE
	MOV	PHONE,REAR
	ACALL	DAA
	NOP
	MOV	REAR,PHONE
	ACALL	RRDATA
	NOP
	MOV	R5,RVER
	NOP
	AJMP	TT_VOLUP
CN_VOLUP:	;中置递加处理
	MOV	A,CVER
	XRL	A,#10H
	JZ	LOOP_B
	MOV	PHONE,CVER
	ACALL	UAA
	NOP
	MOV	CVER,PHONE
	MOV	PHONE,CEN
	ACALL	DAA
	NOP
	MOV	CEN,PHONE
	ACALL	CNDATA
	NOP
	MOV	R5,CVER
	NOP
	AJMP	TT_VOLUP
SB_VOLUP:	;重低音递加处理
	MOV	A,SVER
	XRL	A,#10H
	JZ	LOOP_C
	MOV	PHONE,SVER
	ACALL	UAA
	NOP
	MOV	SVER,PHONE
	MOV	PHONE,S_UB
	ACALL	DAA
	NOP
	MOV	S_UB,PHONE
	ACALL	SBDATA
	NOP
	MOV	R5,SVER
TT_VOLUP:	ACALL	DISP_VOL
	NOP
LOOP_C:	NOP
	AJMP	LOOP
CN_VOLDN_1:	NOP
	AJMP	CN_VOLDN
SB_VOLDN_1:	NOP
	AJMP	SB_VOLDN
	;-----------------------------------------------------------
VOLDN:	;实现2258衰减数加,即音量变小,PHONE是+,反过来理解
	ACALL	CLMUT
	NOP
	MOV	R3,#0
	JB	(29H).2,FR_VOLDN
	JB	(29H).3,RR_VOLDN
	JB	(29H).4,CN_VOLDN_1
	JB	(29H).5,SB_VOLDN_1
	MOV	A,DISPBUFF
	JZ	LOOP_C
	;以下音量加其实是2258写入数据减,衰减少一些,前置,环绕
	;中置,重低音都要让衰减数变小,及衰减DB少
	MOV	PHONE,FRONT
	ACALL	UAA
	NOP
	MOV	FRONT,PHONE
	MOV	PHONE,REAR
	ACALL	UAA
	NOP
	MOV	REAR,PHONE
	MOV	PHONE,CEN
	ACALL	UAA
	NOP
	MOV	CEN,PHONE
	MOV	PHONE,S_UB
	ACALL	UAA
	NOP
	MOV	S_UB,PHONE
	MOV	PHONE,DISPBUFF
	ACALL	DAA	;但是显示的数却是递加,故调用DAA
	NOP
	MOV	DISPBUFF,PHONE
	ACALL	FRDATA	;调前置2258调节
	NOP
	ACALL	RRDATA	;调环绕2258调节
	NOP
	ACALL	CNDATA	;调中置2258调节
	NOP
	ACALL	SBDATA	;调低音2258调节
	NOP
	MOV	R5,DISPBUFF	;该显示的级数
	NOP
	AJMP	TT_VOLUP	;到音量显示
FR_VOLDN:	;前置音量递减
	MOV	A,FVER
	JZ	LOOP_C
	MOV	PHONE,FVER
	ACALL	DAA
	NOP
	MOV	FVER,PHONE
	MOV	PHONE,FRONT
	ACALL	UAA
	NOP
	MOV	FRONT,PHONE
	ACALL	FRDATA
	NOP
	MOV	R5,FVER
	NOP
	AJMP	TT_VOLUP
RR_VOLDN:	;环绕音量递减
	MOV	A,RVER
	JZ	LOOP_E
	MOV	PHONE,RVER
	ACALL	DAA
	NOP
	MOV	RVER,PHONE
	MOV	PHONE,REAR
	ACALL	UAA
	NOP
	MOV	REAR,PHONE
	ACALL	RRDATA
	NOP
	MOV	R5,RVER
	NOP
	AJMP	TT_VOLUP
LOOP_E:	NOP
	AJMP	LOOP
CN_VOLDN:	;中置音量递减
	MOV	A,CVER
	JZ	LOOP_E
	MOV	PHONE,CVER
	ACALL	DAA
	NOP
	MOV	CVER,PHONE
	MOV	PHONE,CEN
	ACALL	UAA
	NOP
	MOV	CEN,PHONE

⌨️ 快捷键说明

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