打印

功放前级程序(带遥控)

[复制链接]
1751|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ledrgb|  楼主 | 2008-7-30 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学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
;----------------------------------------------------------------
;以上为加主音量/低音/高音/话筒级数

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

16

帖子

0

粉丝