刚学89C51,参考电子实验室和平凡老师的程序,编写的功放前级控制程序,遥控器为VCD机的,IC为HT6122. 程序有些不足,我想加入 24C08做贮存,但未能成功,烦请高手多多指教 ;----------------功---------能-------------------------------------- ;功放前级三路音源选择,P2.0~2.2为控制输出高电平 ;主音量/低音/高音/话筒音量,四组控制,P3.4~3.7为控制输出高电平及指示 ;P0口为主音量/低音/高音/话筒音量控制的级数显示 ;P1.0~P1.5的输出为主音量/低音/高音/话筒音量63级控制,由电阻组成的D/A转换 ;P1.6,P1.7分别为显示管的控制位 ;P3.2接遥控接收头 ;P3.3为静音指示 ;P2.3为3D控制输出高电平及指示 ;P2.4为等响度控制输出高电平及指示 ;P2.5为电源控制输出及指示 ;P2.6为外接按制加 ;P2.7为外接按制减 ;P3.0为外接按制选择主音量/低音/高音/话筒音量 ;P3.1为外接按制选择音源 ;--------------------------------------------------------------------- Counter EQU 59H ;计数器,显示程序通过它得知现正显示哪个数码管 FIRST EQU P1.7 ;第一位数码管的位控制 SECOND EQU P1.6 ;第二位数码管的位控制 DISPBUFF EQU 5AH ;显示缓冲区为5AH和5BH IN_SET EQU 21H ;输入选择缓冲 MUTE EQU 22H ;静音选择缓冲 POWER EQU 23H ;电源开关选择缓冲 VOL EQU 24H ;主音量选择缓冲 BASS EQU 25H ;低音选择缓冲 TRS EQU 26H ;高音选择缓冲 MIC EQU 27H ;话筒音量选择缓冲 LUO EQU 28H ;等响度选择缓冲 D3D EQU 29H ;3D选择缓冲 ORG 0000H AJMP MAIN ORG 0003H ;外部中断INT0入口地址 AJMP INT ;转中断服务子程序 ORG 001BH ;定时器T1的入口 AJMP DISP ;显示程序 ORG 30H MAIN: ;初始化 MOV P3,#00001111B MOV P2,#11100100B ; MOV P0,#0FFH ; MOV MUTE,#0 ; MOV POWER,#0 ; MOV R4,#0 ; MOV VOL,#10 ;预设音量等级为10 MOV BASS,#30 ;预设低音等级为30 MOV TRS,#35 ;预设高音等级为35 mov mic,#0 ;预设话筒音量等级为0 MOV LUO,#0 ; MOV D3D,#0 ; MOV IN_SET,#0 ; MOV SP,#5FH ;设置堆栈 MOV TMOD,#00010000B ;定时器T1工作于模式1(16位定时/计数模式) MOV TH1,#HIGH(65536-20000) MOV TL1,#LOW(65536-20000) SETB TR1 ;定时器T1开始运行 SETB EA ;打开CPU总中断请求 SETB ET1 ;定时器T1允许 SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发 SETB EX0 ;打开INT0中断请求 MOV Counter,#0 ;计数器初始化 CLR P3.5 ;开机初始为音量状态 CLR P3.4 ; CLR P3.6 ; SETB P3.7 ; MOV P1,VOL ; MOV R7,VOL ; MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b
DSP: MOV R2,#9 ;将遥控器键值转化成0~9 MOV DPTR,#TAB1 ;调用遥控键值表 VV: ; MOV A,R2 ; MOVC A,@A+DPTR ; XRL A,1CH ; JZ ABC ; DJNZ R2,VV ; ABC: ; MOV A,R2 ; AJMP DSP
INT: ; CLR EX0 ;暂时关闭INT0中断请求 MOV R6,#10 SB: ; ACALL YS1 ;调用882微秒延时子程序 JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序 DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序 JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲 ACALL YS2 ;延时4.74毫秒判断是否连发 JB P3.2,EXIT ; MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 ;接收从1AH到1DH的4个内存,用于存放操作码和操作反码 PP: ; MOV R3,#8 ;每组数据为8位 JJJJ: ; JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC UUU ;如果为0就跳转到UUU JB P3.2,$ ;检测到高电平1的话延时882微秒等待脉冲高电平结束 UUU: ; MOV A,@R1 ;将R1中地址的给A RRC A ;将C中的值0或1移入A中的最低位 MOV @R1,A ;将A中的数暂时存放在R1数值的内存中 DJNZ R3,JJJJ ;接收满8位换一个内存 INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH中 MOV A,1CH ;A的数就是解码数 MOV A,1AH ;进行代码识别 XRL A,#0 ;判断1AH的值是否等于00000000 JNZ EXI ;如果不同则无效将1CH清零 MOV A,1BH ;比较低8位地址 XRL A,#11110111B ;再判断高8位地址是否正确 JNZ EXI ;如果不相等说明解码失败退出解码程序 MOV A,1CH ;比较数据码和数据反码是否正确? CPL A ; XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃核对数据是否准确 JNZ EXI ;如果不同则无效将1CH清零 AJMP BIJIAO ;如果相等说明解码正确 AJMP EXIT ;如果不相等说明解码失败退出解码程序 EXI: ; MOV 1CH,#0 ;
EXIT: ; JB P2.6,QQ1 ;手动主计数加 LCALL YS3 ; MOV A,#03 ; LCALL YS3 ; AJMP KD ; QQ1: JB P2.7,QQ2 ;手动主计数减 LCALL YS3 ; MOV A,#02 ; LCALL YS3 ; AJMP KD ; QQ2: ; JNB P3.0,QQ3 ;手动选择控制:主音量/低音/高音/话筒音量 JNB P3.1,QQ4 ;手动选择音源:1/2/3 SETB EX0 ;中断 SETB P3.2 ; RETI
QQ3: ; MOV A,#27 ; LCALL YS4 ; LCALL YS4 ; AJMP TT2 ;选择控制:主音量/低音/高音/话筒音量 SETB EX0 ;允许中断 SETB P3.2 ; RETI QQ4: ; LCALL YS4 ; LCALL YS4 ; AJMP IN_KEY ;选择音源1/2/3 SETB EX0 ;允许中断 SETB P3.2 ; RETI BIJIAO: MOV A,1CH ;按键数值判断执行 ;------------------------------------------------------------ ;以下为加主音量/低音/高音/话筒级数 ;------------------------------------------------------------ KD: CJNE A,#03,TT0 ;遥控键值等3时,执行主计数器加 cjne r4,#0,dd1 ;如果R4的值等0,主计数器为主音量控制 MOV R7,VOL ; CJNE R7,#63,VOL_UP ;预设音量控制为64级(0-63) AJMP EXIT TT0: ;跳转超范围,不得不加 AJMP TT1 ;转到主计数器减 VOL_UP: INC VOL ;主音量加1 MOV P1,VOL ;把主音量的数送到P1口进行D/A转换 MOV R7,VOL ;显示当前的调节级数 MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b AJMP EXIT dd1: cjne r4,#1,dd2 ;如果R4的值等1,主计数器为低音控制 MOV R7,BASS ; CJNE R7,#63,BASS_UP ;预设低音控制为64级(0-63) AJMP EXIT BASS_UP: INC BASS ;低音加1 MOV P1,BASS ;把低音控制的数送到P1口进行D/A转换 MOV R7,BASS ; MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b AJMP EXIT dd2: cjne r4,#2,dd3 ;如果R4的值等2,主计数器为高音控制 MOV R7,TRS ; CJNE R7,#63,TRS_UP ;预设高音控制为64级(0-63) AJMP EXIT TRS_UP: INC TRS ;高音加1 MOV P1,TRS ;把高音控制的数送到P1口进行D/A转换 MOV R7,TRS ; MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b AJMP EXIT dd3: cjne r4,#3,dd4 ;如果R4的值等3,主计数器为话筒音量控制 MOV R7,MIC; CJNE R7,#63,MIC_UP ;预设话筒音量控制为64级(0-63) AJMP EXIT MIC_UP: INC MIC ;话筒音量加1 MOV P1,MIC ;把话筒音量控制的数送到P1口进行D/A转换 MOV R7,MIC ; MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b AJMP EXIT dd4: MOV R4,#0 ;只有4组,R4清0,返回主音量控制 MOV P1,VOL MOV R7,VOL ; MOV A,R7 ;将R7中的十六进制数转换成10进制 MOV B,#10 ;10进制/10=10进制 DIV AB ; MOV DISPBUFF+1,A ;十位在a MOV DISPBUFF,B ;个位在b AJMP EXIT ;---------------------------------------------------------------- ;以上为加主音量/低音/高音/话筒级数
|