功放前级程序带遥控.docx
《功放前级程序带遥控.docx》由会员分享,可在线阅读,更多相关《功放前级程序带遥控.docx(32页珍藏版)》请在冰豆网上搜索。
功放前级程序带遥控
功放前级程序(带遥控)
源程序:
;----------------功---------能--------------------------------------
;*****本*****机*****石*****英*****晶******体******24MHz*****
;功放前级三路音源选择,P2.0~2.2为控制输出,低电平有效
;主音量/低音/高音/话筒音量,四组控制,P3.4~3.7为控制输出
;P0口为主音量/低音/高音/话筒音量控制的级数显示
;P1.0~P1.5的输出为主音量/低音/高音/话筒音量63级控制,由电阻组成的D/A转换
;P1.6,P1.7分别为显示管的控制位
;P0.7为主音量/低音/高音/话筒音量,四组控制指示公共脚
;P2.3为等响度控制输出高电平及指示
;P2.4为3D控制输出高电平及指示
;P2.5为电源控制输出及指示
;P2.6为外接按制加
;P2.7为外接按制减
;P3.0为外接按制选择主音量/低音/高音/话筒音量
;P3.1为外接按制选择音源
;P3.2接遥控接收头
;---------------------------------------------------------------------
Counter EQU59H ;计数器,显示程序通过它得知现正显示哪个数码管
FIRST EQUP1.7 ;第一位数码管的位控制
SECOND EQUP1.6 ;第二位数码管的位控制
LEDH EQUP0.7 ;主音量/低音/高音/话筒音量显示控制位
DISPBUFF EQU5AH ;显示缓冲区为5AH和5BH
IN_SET EQU21H ;输入选择缓冲
MUTE EQU22H ;静音选择缓冲
POWER EQU23H ;电源开关选择缓冲
VOL EQU24H ;主音量选择缓冲
BASS EQU25H ;低音选择缓冲
TRS EQU26H ;高音选择缓冲
MIC EQU27H ;话筒音量选择缓冲
LUO EQU28H ;等响度选择缓冲
D3D EQU29H ;3D选择缓冲
LED_DATA EQU30H ;主音量/低音/高音/话筒音量显示缓冲
SDA24 EQUP3.4 ;接24C08的SDA
SCLK24 EQUP3.5 ;接24C08的SCLK
ORG 0000H
AJMPMAIN
ORG 0003H ;外部中断INT0入口地址
AJMP INT ;转中断服务子程序
ORG001BH ;定时器T1的入口
LJMPDISP ;显示程序
ORG30H
MAIN:
;初始化
MOV1CH,#0FFH ;
MOVP3,#0FFH ;
MOVP2,#0FFH ;
MOVP0,#0FFH ;
MOVMUTE,#0 ;
MOVPOWER,#0 ;
MOVR6,#0 ;
MOVLUO,#0 ;
MOVD3D,#0 ;
MOVIN_SET,#0 ;
MOVSP,#5FH ;设置堆栈
MOVTMOD,#00010000B ;定时器T1工作于模式1(16位定时/计数模式)
MOVTH1,#HIGH(65536-2000)
MOVTL1,#LOW(65536-2000)
SETBTR1 ;定时器T1开始运行
SETBEA ;打开CPU总中断请求
SETBET1 ;定时器T1允许
SETBIT0 ;设定INT0的触发方式为脉冲负边沿触发
SETBEX0 ;打开INT0中断请求
MOVCounter,#0 ;计数器初始化
NOP ;延时读24C08
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOVA,#24H ;读主音量数地址
LCALLRD24
MOVVOL,A
MOVP1,VOL ;
MOVR7,VOL ;
MOVA,R7 ;将R7中的十六进制数转换成10进制
MOVB,#10 ;10进制/10=10进制
DIVAB ;
MOVDISPBUFF+1,A ;十位在a
MOVDISPBUFF,B ;个位在b
CLRP3.5 ;开机初始为音量状态
CLRP3.4 ;
CLRP3.6 ;
SETBP3.7 ;
CLRP2.0
SETBP2.1
SETBP2.2
MOV LED_DATA,#0FEH ;
DSP:
MOV12H,#9 ;将遥控器键值转化成0~9
MOV DPTR,#TAB1 ;调用遥控键值表
VV:
;
MOV A,12H ;
MOVCA,@A+DPTR ;
XRL A,1CH ;
JZ ABC ;
DJNZ12H,VV ;
ABC:
;
MOV A,12H ;
MOV R5,1CH ;
CJNER5,#00,CH_AUTO;避免保持电容电压跌落
AJMPDSP
CH_AUTO:
LCALLYS4 ;
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLDELAY2
MOVA,#24H
LCALLRD24
LCALLYS4 ;
MOVP1,A
CLRP3.4 ;
CLRP3.5 ;
CLRP3.6 ;
SETBP3.7 ;
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLDELAY2
MOVA,#25H
LCALLRD24
LCALLYS4 ;
MOVP1,A
CLRP3.4 ;
CLRP3.5 ;
CLRP3.7 ;
SETBP3.6 ;
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLDELAY2
MOVA,#26H
LCALLRD24
LCALLYS4 ;
MOVP1,A
CLRP3.4 ;
CLRP3.7 ;
CLRP3.6 ;
SETBP3.5 ;
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLDELAY2
MOVA,#27H
LCALLRD24
LCALLYS4 ;
MOVP1,A
CLRP3.7 ;
CLRP3.5 ;
CLRP3.6 ;
SETBP3.4 ;
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
LCALLYS4
AJMPDSP
INT:
;
CLREX0 ;暂时关闭INT0中断请求
MOV16H,#10
SB:
;
ACALL YS1 ;调用882微秒延时子程序
JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ 16H,SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
JNBP3.2,$ ;等待高电平避开9毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒判断是否连发
JB P3.2,EXIT ;
MOVR1,#1AH ;设定1AH为起始RAM区
MOV12H,#4 ;接收从1AH到1DH的4个内存,用于存放操作码和操作反码
PP:
;
MOV13H,#8 ;每组数据为8位
JJJJ:
;
JNBP3.2,$ ;等待地址码第一位的高电平信号
LCALLYS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOVC,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNCUUU ;如果为0就跳转到UUU
JB P3.2,$ ;检测到高电平1的话延时882微秒等待脉冲高电平结束
UUU:
;
MOVA,@R1 ;将R1中地址的给A
RRCA ;将C中的值0或1移入A中的最低位
MOV@R1,A ;将A中的数暂时存放在R1数值的内存中
DJNZ13H,JJJJ ;接收满8位换一个内存
INCR1 ;对R1中的值加1,换下一个RAM
DJNZ12H,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH中
MOVA,1CH ;A的数就是解码数
AJMPBIJIAO ;如果相等说明解码正确
MOVA,1AH ;进行代码识别
XRLA,#0 ;判断1AH的值是否等于00000000
JNZEXI ;如果不同则无效将1CH清零
MOVA,1BH ;比较低8位地址
XRLA,#11110111B ;再判断高8位地址是否正确
JNZEXI ;如果不相等说明解码失败退出解码程序
MOVA,1CH ;比较数据码和数据反码是否正确?
CPLA ;
XRLA,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃核对数据是否准确
JNZEXI ;如果不同则无效将1CH清零
AJMPEXIT ;如果不相等说明解码失败退出解码程序
EXI:
;
MOV1CH,#0 ;
EXIT:
;
JBP2.6,QQ1 ;手动主计数加
LCALLYS3 ;
MOVA,#06 ;
LCALLYS3 ;
AJMPKU ;
QQ1:
JBP2.7,QQ2 ;手动主计数减
LCALLYS3 ;
MOVA,#68 ;
LCALLYS3 ;
AJMPTT1 ;
QQ2:
;
JNBP3.0,QQ3 ;手动选择控制:
主音量/低音/高音/话筒音量
JNBP3.1,QQ4 ;手动选择音源:
1/2/3
SETBEX0 ;中断
SETBP3.2 ;
RETI
QQ3:
;
LCALLYS4 ;
AJMPM_SET ;选择控制:
主音量/低音/高音/话筒音量
SETB EX0 ;允许中断
SETBP3.2 ;
RETI
QQ4:
;
LCALLYS4 ;
LCALLYS4 ;
LCALLYS4 ;
LCALLYS4 ;
LCALLYS4 ;
AJMPIN_KEY ;选择音源1/2/3
SETB EX0 ;允许中断
SETBP3.2 ;
RETI
BIJIAO:
MOVA,1CH ;按键数值判断执行
;------------------------------------------------------------
;以下为加主音量/低音/高音/话筒级数
;------------------------------------------------------------
CJNEA,#03,BUP ;主音量加
AJMPV_UP
BUP:
CJNEA,#15,TUP ;低音加
AJMPB_UP
TUP:
CJNEA,#10,MUP ;高音加
AJMPT_UP
MUP:
CJNEA,#30,VDN ;MIC音量加
AJMPM_UP
VDN:
CJNEA,#02,BDN ;主音量减
AJMPV_DN
BDN:
CJNEA,#66,TDN ;低音减
AJMPB_DN
TDN:
CJNEA,#14,MDN ;高音减
AJMPT_DN
MDN:
CJNEA,#26,KU ;MIC音量减
AJMPM_DN
KU:
CJNEA,#06,TT0 ;遥控键值等3时,执行主计数器加
CJNER6,#0,dd1 ;如果R6的值等0,主计数器为主音量控制
V_UP:
;
MOVA,#24H ;读地址
LCALLRD24
MOVVOL,A
MOVR7,VOL ;
CJNER7,#63,VOL_UP ;预设音量控制为64级(0-63)
LCALLYS4 ;
CLRP3.4 ;
CLRP3.5 ;
CLRP3.6 ;
SETBP3.7 ;
AJMPEXIT
TT0:
;跳转超范围,不得不加
AJMPTT1 ;转到主计数器减
VOL_UP:
INCVOL ;主音量加1
MOVA,VOL
MOVB,A
MOVA,#24H
LCALLWT24
MOVP1,VOL ;把主音量的数送到P1口进行D/A转换
MOVR7,VOL ;显示当前的调节级数
MOVA,R7 ;将R7中的十六进制数转换成10进制
MOVB,#10 ;10进制/10=10进制
DIVAB ;
MOVDISPBUFF+1,A ;十位在a
MOVDISPBUFF,B ;个位在b
MOVLED_DATA,#0FEH ;
CLRP3.4 ;
CLRP3