单片机遥控控制功放前级程序
- 格式:doc
- 大小:48.00 KB
- 文档页数:9
单片机遥控控制功放前级程序作者:佚名来源:不详录入:Admin更新时间:2008-8-3 15:43:43点击数:6【字体:】;----------------功---------能--------------------------------------;功放前级三路音源选择,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和5BHIN_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 0000HAJMP MAINORG 0003H ;外部中断INT0入口地址AJMP INT ;转中断服务子程序ORG 001BH ;定时器T1的入口AJMP DISP ;显示程序ORG 30HMAIN: ;初始化MOV P3,#00001111BMOV 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 ;十位在aMOV DISPBUFF,B ;个位在bDSP:MOV R2,#9 ;将遥控器键值转化成0~9MOV DPTR,#TAB1 ;调用遥控键值表VV: ;MOV A,R2 ;MOVC A,@A+DPTR ;XRL A,1CH ;JZ ABC ;DJNZ R2,VV ;ABC: ;MOV A,R2 ;AJMP DSPINT: ;CLR EX0 ;暂时关闭INT0中断请求MOV R6,#10SB: ;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就跳转到UUUJB P3.2,$ ;检测到高电平1的话延时882微秒等待脉冲高电平结束UUU: ;MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1数值的内存中DJNZ R3,JJJJ ;接收满8位换一个内存INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH中MOV A,1CH ;A的数就是解码数MOV A,1AH ;进行代码识别XRL A,#0 ;判断1AH的值是否等于00000000JNZ 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/3SETB EX0 ;中断SETB P3.2 ;RETIQQ3: ;MOV A,#27 ;LCALL YS4 ;LCALL YS4 ;AJMP TT2 ;选择控制:主音量/低音/高音/话筒音量SETB EX0 ;允许中断SETB P3.2 ;RETIQQ4: ;LCALL YS4 ;LCALL YS4 ;AJMP IN_KEY ;选择音源1/2/3SETB EX0 ;允许中断SETB P3.2 ;RETIBIJIAO: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 EXITTT0: ;跳转超范围,不得不加AJMP TT1 ;转到主计数器减VOL_UP:INC VOL ;主音量加1MOV 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 ;十位在aMOV DISPBUFF,B ;个位在bAJMP EXITdd1:cjne r4,#1,dd2 ;如果R4的值等1,主计数器为低音控制MOV R7,BASS ;CJNE R7,#63,BASS_UP ;预设低音控制为64级(0-63) AJMP EXITBASS_UP:INC BASS ;低音加1MOV 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 ;十位在aAJMP EXITdd2:cjne r4,#2,dd3 ;如果R4的值等2,主计数器为高音控制MOV R7,TRS ;CJNE R7,#63,TRS_UP ;预设高音控制为64级(0-63) AJMP EXITTRS_UP:INC TRS ;高音加1MOV 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 ;十位在aMOV DISPBUFF,B ;个位在bAJMP EXITdd3:cjne r4,#3,dd4 ;如果R4的值等3,主计数器为话筒音量控制MOV R7,MIC;CJNE R7,#63,MIC_UP ;预设话筒音量控制为64级(0-63) AJMP EXITMIC_UP:INC MIC ;话筒音量加1MOV P1,MIC ;把话筒音量控制的数送到P1口进行D/A转换MOV R7,MIC ;MOV A,R7 ;将R7中的十六进制数转换成10进制MOV B,#10 ;10进制/10=10进制DIV AB ;MOV DISPBUFF,B ;个位在bAJMP EXITdd4:MOV R4,#0 ;只有4组,R4清0,返回主音量控制MOV P1,VOLMOV R7,VOL ;MOV A,R7 ;将R7中的十六进制数转换成10进制MOV B,#10 ;10进制/10=10进制DIV AB ;MOV DISPBUFF+1,A ;十位在aMOV DISPBUFF,B ;个位在bAJMP EXIT;---------------------------------------------------------------- ;以上为加主音量/低音/高音/话筒级数。