DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1853|回复: 0
打印 上一主题 下一主题

[家电] 单片机遥控控制功放前级程序

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-27 19:50:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  
         
    ;----------------功---------能--------------------------------------
;功放前级三路音源选择,P2.0"2.2为控制输出高电平
;主音量/低音/高音/话筒音量,四组控制,P3.4"3.7为控制输出高电平及指示
0口为主音量/低音/高音/话筒音量控制的级数显示
1.0"1.5的输出为主音量/低音/高音/话筒音量63级控制,由电阻组成的D/A转换
1.6,P1.7分别为显示管的控制位
3.2接遥控接收头
3.3为静音指示
2.3为3D控制输出高电平及指示
2.4为等响度控制输出高电平及指示
2.5为电源控制输出及指示
2.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
;----------------------------------------------------------------
;以上为加主音量/低音/高音/话筒级数
参考链接:http://www.picavr.com/news/2008-07/7165.htm
         
          [/td]
        [/tr]
      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-4-19 17:24 , 耗时 0.093220 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表