| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1610 人关注过本帖
标题:5.1功放程序和DIY电路资料
只看楼主 加入收藏
a460399147
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-11-17
收藏
 问题点数:0 回复次数:1 
5.1功放程序和DIY电路资料
高手帮忙下面程序遥控电路需要怎么设计?
遥控数据码知道,就是用户码不知道怎么弄,
邮箱:460399147@
谢谢
程序如下 :


CLR P3.1;刚开机时7370STANDBY待机
CLR EA;关总中断
CLR P3.5;开LED显示(PNP的管子)
SETB P3.7;数码管不显示
MOV P1,#7FH;电源灯亮(P1.7=0),数码管十位也关了
SETB P3.2;
SETB P3.4;让SDA,SLK保持高电平
CLR P3.0;AC-3输入状态
SETB P3.3;外中断1为脉冲下降沿触发
MOV TMOD,#00010001B;定时器0-1工作在方式1
MOV TH1,#0F0H;定时器1预置
MOV TL1,#60H;(65536-#FO60H)
MOV TH0,#00H;定时器0预置
MOV TL0,#00H;(65536-0)65MS够按键按下的时间即可
SETB TR0;开定时器0中断
SETB ET0;开定时器0中断允许
SETB EA;中断总开关开
SETB EX1;外中断1中断允许
SETB IT1;外中断1INT1为负跳变触发方式
CLR EX0;外中断0中断不允许
CLR TR1;定时器1暂不允许
CLR (29H).0;遥控识别位
MOV REMVOL,#02H;音量连续控制赋值02H
MOV COUNTER,#0H;记数器清0
MOV FRONT,#34H;总音量默认级数34
MOV REAR,#34H
MOV CEN,#34H
MOV S_UB,#34H
MOV RVER,#5H;各声道微跳起始显示5级
MOV CVER,#5H
MOV SVER,#5H
MOV FVER,#5H
MOV DISPBUFF,#40H;数码管准备显示40
ACALL DELAY;刚开机时不能马上给PT2258送数
NOP;延时250MS左右,PT2258要求300MS
ACALL DELAY
NOP
ACALL DELAY
NOP
ACALL DELAY
NOP
ACALL DELAY
NOP
MOV 30H,#0C0H;PT2258默认1100 0000,CLEAR REGIST
MOV NUMBYT,#01H;PT2258数据位数赋值01只传8位
ACALL WRNBYT;I2C数据总线
NOP
NOP
MOV 30H,#0D3H;1101 0011(6CH 10dB/STEP,-30dB)
MOV 31H,#0E4H;1110 0100(6CH 1dB/STEP,-4dB)
MOV NUMBYT,#02H;PT2258数据位数赋值02
ACALL WRNBYT
NOP
MOV NO_M,#00H;遥控按键数据码为0,无键按下状态
MOV NO_N,#00H
MOV DISPBUFF3,#0DFH;指示灯暂存1101 1111(还未到P1口)
;============================主程序=========================
MAIN:
SETB EA;允许中断总开关开
CLR TR1;定时器1暂不允许
CLR ET1;关定时器1中断允许
SETB P3.7;关数码管个位
MOV P1,#7FH;电源灯可亮,数码管十位也关了
CLR P3.5;开指示灯,电源灯就亮了
CLR P3.1 ;TDA7370低电平静音
SETB P3.2
SETB P3.4
MOV 30H,#0F9H;1111 1001(2258静音OF8就不静)
MOV NUMBYT,#01H;PT2258数据位数赋值01
ACALL WRNBYT;写入2258;2258就静掉了
NOP
PW_1:
SETB P3.2;I2C终止
SETB P3.4
MOV A,NO_M;调按键标准数(0~10)
JZ PW_1;无键按下就在此处循环
MOV NO_M,#00H
XRL A,#01H;
JNZ PW_1;按MUTE键也在此处循环
SETB P3.1;打开功放,NO STANDBY状态
SETB TR1;开定时器1;否则数码管有显示
SETB ET1;开中断1
CLR (29H).1;清静音标志位
ACALL CLMUT;2258 NO MUTE
NOP
MOV R2,#00H
MOV R3,#0FH
LOOP:
SETB P3.2
SETB P3.4
MOV A,R3
XRL A,#0FH;R3=0FH,则A=0
JNZ KEY;A不为0则转到KEY
MOV R3,#00H
MOV A,DISPBUFF3
ORL A,#01010110B;(1101 1111 ORL 0101 0110)
MOV DISPBUFF3,A;(ORL后A=1101 1111,AC-3灯亮)
CLR (29H).2
CLR (29H).3
CLR (29H).4
CLR (29H).5
MOV R5,DISPBUFF;(#40h放入R5)
ACALL DISP_VOL;调显示音量
NOP
KEY:;遥控散转
MOV A,NO_M;键盘转换值0~11,0,1,2,3...
JZ LOOP;键值=0转LOOP
MOV NO_M,#00H;并将键转换值清0
RL A;实现(0-0,1-2,2-4,3-6,4-8倍乘)
MOV DPTR,#TAB_KEY
NOP
JMP @A+DPTR
TAB_KEY:
AJMP LOOP;入口地址:TAB_KEY
AJMP MAIN;TAB_KEY+2
AJMP MUTE;TAB_KEY+4
AJMP AC_3_IN;TAB_KEY+6
AJMP RESET;TAB_KEY+8
AJMP AUX_IN;TAB_KEY+10
AJMP FRONT_V;TAB_KEY+12
AJMP CEN_V;TAB_KEY+14
AJMP REAR_V;TAB_KEY+16
AJMP SUB_V;TAB_KEY+18
AJMP VOLDN;TAB_KEY+20
AJMP VOLUP;TAB_KEY+22
AJMP LOOP;
AJMP LOOP
;===========================================================
RESET:;复位状态
CLR P3.0;AC-3状态
MOV FRONT,#34H;#34H
MOV REAR,#34H
MOV CEN,#34H
MOV S_UB,#34H
MOV RVER,#5H
MOV CVER,#5H
MOV SVER,#5H
MOV FVER,#5H
MOV DISPBUFF,#40H;数码管显示40
MOV DISPBUFF3,#0DFH;(1101 1111转AC-3指示)
MOV 30H,#0D3H;(1101 0011 6CH -10DB/STEP -30DB)
MOV 31H,#0E4H;(1110 0100 6CH -1DB/STEP -4DB)
MOV NUMBYT,#02H;2258传16位数
ACALL WRNBYT
NOP
AJMP INPUT_A;跳转
;-----------------------------------------------------------
AC_3_IN:;5.1CH输入状态
MOV 30H,#0F9H;(1111 1001,2258静音)
MOV NUMBYT,#01H
ACALL WRNBYT
NOP
ACALL DELAY;(延时50MS)
NOP
MOV DISPBUFF3,#0DFH;(AC-3灯状态缓存起来TI到时就亮)
CLR P3.0;AC-3输入
NOP
AJMP INPUT_A;跳转
;-----------------------------------------------------------
AUX_IN:;2CH输入状态
MOV 30H,#0F9H;(2258静音)
MOV NUMBYT,#01H
ACALL WRNBYT
NOP
ACALL DELAY
NOP
MOV DISPBUFF3,#0F7H;(AUX灯状态缓存起来)
SETB P3.0;AUX输入
INPUT_A:
SETB (29H).1;保证2258不会静音
ACALL DELAY;延时50MS
NOP
MOV 30H,#0F8H;(1111 1000 2258 NO MUTE)
MOV NUMBYT,#01H;(2258传8位数)
ACALL WRNBYT
NOP
MOV R3,#0FH;
MOV R2,#00H
NOP
AJMP LOOP;循环
;-----------------------------------------------------------
MUTE:
CPL (29H).1;(29H).1先取反,保证2258 MUTE ON
JB (29H).1,MUT_1;如果=1,跳转
clr p3.1
MOV 30H,#0F9H;(1111 1001,2258 MUTE ON)

WRN_1:
MOV NUMBYT,#1H
LCALL WRNBYT;静音数据写入2258
NOP
MOV R2,#00H
MOV R3,#0FH
NOP
AJMP LOOP;循环
MUT_1:
setb p3.1
MOV 30H,#0F8H;(1111 1000,2258 MUTE)
MOV A,DISPBUFF3
ORL A,#10000000B;(原来亮的仍亮,静音灯要熄)
MOV DISPBUFF3,A;(ORL是有1出1,全0出0)
NOP
AJMP WRN_1;跳转
;-----------------------------------------------------------
FRONT_V:
SETB (29H).2;为FRONT VOLUP准备条件
CLR (29H).3
CLR (29H).4
CLR (29H).5
MOV R5,FVER;(FEVER=48H,R5=#5H)
MOV A,DISPBUFF3
ANL A,#11101111B;先保证前置灯亮,有0出0,全1出1
ORL A,#01000110B;有1出1,全0出0,第4,5位必须为0在或
NOP
AJMP LOOP_D;跳转
;-----------------------------------------------------------
REAR_V:
CLR (29H).2
SETB (29H).3;为REAR VOLUP准备条件
CLR (29H).4
CLR (29H).5
MOV R5,RVER
MOV A,DISPBUFF3
ANL A,#10111111B;保证环绕灯亮
ORL A,#00010110B
NOP
AJMP LOOP_D
;-----------------------------------------------------------
CEN_V:
CLR (29H).2
CLR (29H).3
SETB (29H).4;为CEN VOLUP准备条件
CLR (29H).5
MOV R5,CVER
MOV A,DISPBUFF3
ANL A,#11111101B;保证中置灯亮
ORL A,#01010100B
NOP
AJMP LOOP_D
;-----------------------------------------------------------
SUB_V:
CLR (29H).2
CLR (29H).3
CLR (29H).4
SETB (29H).5;为SW VOLUP准备条件
MOV R5,SVER
MOV A,DISPBUFF3
ANL A,#11111011B;保证重低音灯亮
ORL A,#01010010B
;-----------------------------------------------------------
LOOP_D:
MOV DISPBUFF3,A
ACALL DISP_VOL;调用音量显示
NOP
ACALL CLMUT;2258要静音
NOP
MOV R2,#00H
MOV R3,#00H
LOOP_A:
NOP
AJMP LOOP
;/////////////////////////////////////////////////////////
CN_VOLUP_1:
NOP
AJMP CN_VOLUP
SB_VOLUP_1:
NOP
AJMP SB_VOLUP
VOLUP:;实现2258衰减数减,即音量变大,PHONE是-,反过来理解
MOV 30H,#0C0H;(1100 0000,2258CLEAR REGISTER)
MOV NUMBYT,#01H
ACALL WRNBYT;调用I2C
NOP
ACALL CLMUT;2258静音
NOP
MOV R3,#0
JB (29H).2,FR_VOLUP
JB (29H).3,RR_VOLUP
JB (29H).4,CN_VOLUP_1
JB (29H).5,SB_VOLUP_1
MOV A,DISPBUFF
XRL A,#69H;最高级别69H
JZ LOOP_A;到69级就跳回去LOOP
MOV PHONE,FRONT
ACALL DAA
NOP
MOV FRONT,PHONE;FRONT+1(递加)
MOV PHONE,REAR
ACALL DAA
NOP
MOV REAR,PHONE;REAR+1
MOV PHONE,CEN
ACALL DAA
NOP
MOV CEN,PHONE;CENT+1
MOV PHONE,S_UB
ACALL DAA
NOP
MOV S_UB,PHONE;SW+1
MOV PHONE,DISPBUFF
ACALL UAA
NOP
MOV DISPBUFF,PHONE;DISPBUFF+1
ACALL FRDATA;调前置2258调节
NOP
ACALL RRDATA;调环绕2258调节
NOP
ACALL CNDATA;调中置2258调节
NOP
ACALL SBDATA;调低音2258调节
NOP
MOV R5,DISPBUFF;该显示的级数
NOP
AJMP TT_VOLUP;到音量显示
FR_VOLUP:;前置音量递加处理
MOV A,FVER
XRL A,#10H;到10级吗
JZ LOOP_B;到了就跳转
MOV PHONE,FVER
ACALL UAA
NOP
MOV FVER,PHONE;级数加1
MOV PHONE,FRONT
ACALL DAA;使2258衰减数变小,即音量增加
NOP
MOV FRONT,PHONE
ACALL FRDATA;调2258数据处理
NOP
MOV R5,FVER;要显示的级数
NOP
AJMP TT_VOLUP;到音量级数显示
LOOP_B:
NOP
AJMP LOOP
RR_VOLUP:;环绕音量递加处理
MOV A,RVER
XRL A,#10H
JZ LOOP_B
MOV PHONE,RVER
ACALL UAA
NOP
MOV RVER,PHONE
MOV PHONE,REAR
ACALL DAA
NOP
MOV REAR,PHONE
ACALL RRDATA
NOP
MOV R5,RVER
NOP
AJMP TT_VOLUP
CN_VOLUP:;中置递加处理
MOV A,CVER
XRL A,#10H
JZ LOOP_B
MOV PHONE,CVER
ACALL UAA

NOP
MOV CVER,PHONE
MOV PHONE,CEN
ACALL DAA
NOP
MOV CEN,PHONE
ACALL CNDATA
NOP
MOV R5,CVER
NOP
AJMP TT_VOLUP
SB_VOLUP:;重低音递加处理
MOV A,SVER
XRL A,#10H
JZ LOOP_C
MOV PHONE,SVER
ACALL UAA
NOP
MOV SVER,PHONE
MOV PHONE,S_UB
ACALL DAA
NOP
MOV S_UB,PHONE
ACALL SBDATA
NOP
MOV R5,SVER
TT_VOLUP:
ACALL DISP_VOL
NOP
LOOP_C:
NOP
AJMP LOOP
CN_VOLDN_1:
NOP
AJMP CN_VOLDN
SB_VOLDN_1:
NOP
AJMP SB_VOLDN
;-----------------------------------------------------------
VOLDN:;实现2258衰减数加,即音量变小,PHONE是+,反过来理解
ACALL CLMUT
NOP
MOV R3,#0
JB (29H).2,FR_VOLDN
JB (29H).3,RR_VOLDN
JB (29H).4,CN_VOLDN_1
JB (29H).5,SB_VOLDN_1
MOV A,DISPBUFF
JZ LOOP_C
;以下音量加其实是2258写入数据减,衰减少一些,前置,环绕
;中置,重低音都要让衰减数变小,及衰减DB少
MOV PHONE,FRONT
ACALL UAA
NOP
MOV FRONT,PHONE
MOV PHONE,REAR
ACALL UAA
NOP
MOV REAR,PHONE
MOV PHONE,CEN
ACALL UAA
NOP
MOV CEN,PHONE
MOV PHONE,S_UB
ACALL UAA
NOP
MOV S_UB,PHONE
MOV PHONE,DISPBUFF
ACALL DAA;但是显示的数却是递加,故调用DAA
NOP
MOV DISPBUFF,PHONE
ACALL FRDATA;调前置2258调节
NOP
ACALL RRDATA;调环绕2258调节
NOP
ACALL CNDATA;调中置2258调节
NOP
ACALL SBDATA;调低音2258调节
NOP
MOV R5,DISPBUFF;该显示的级数
NOP
AJMP TT_VOLUP;到音量显示
FR_VOLDN:;前置音量递减
MOV A,FVER
JZ LOOP_C
MOV PHONE,FVER
ACALL DAA
NOP
MOV FVER,PHONE
MOV PHONE,FRONT
ACALL UAA
NOP
MOV FRONT,PHONE
ACALL FRDATA
NOP
MOV R5,FVER
NOP
AJMP TT_VOLUP
RR_VOLDN:;环绕音量递减
MOV A,RVER
JZ LOOP_E
MOV PHONE,RVER
ACALL DAA
NOP
MOV RVER,PHONE
MOV PHONE,REAR
ACALL UAA
NOP
MOV REAR,PHONE
ACALL RRDATA
NOP
MOV R5,RVER
NOP
AJMP TT_VOLUP
LOOP_E:
NOP
AJMP LOOP
CN_VOLDN:;中置音量递减
MOV A,CVER
JZ LOOP_E
MOV PHONE,CVER
ACALL DAA
NOP
MOV CVER,PHONE
MOV PHONE,CEN
ACALL UAA
NOP
MOV CEN,PHONE
ACALL CNDATA
NOP
MOV R5,CVER
NOP
AJMP TT_VOLUP
SB_VOLDN:;重低音递减
MOV A,SVER
JZ LOOP_E
MOV PHONE,SVER
ACALL DAA
NOP
MOV SVER,PHONE
MOV PHONE,S_UB
ACALL UAA
NOP
MOV S_UB,PHONE
ACALL SBDATA
NOP
MOV R5,SVER
NOP
AJMP TT_VOLUP
;-----------------------------------------------------------
;按音量加减给2258数据入口
FRDATA:;前置音量2258入口数据
MOV A,FRONT;FRONT是16进制数,如#34H
SWAP A
ANL A,#0FH;保留FRONT的高4位不变
ADD A,#60H;加#60H,2258(0110 0011通道5FR,-10DB/STEP
MOV 30H,A;现在是通道FL-30DB
MOV A,FRONT
ANL A,#0FH;保留FRONT的低4位
ADD A,#70H;加#70H,2258(0111 0100通道5FR,-1DB/STEP
MOV 31H,A;现在为-4DB
MOV NUMBYT,#02H;要传给2258,16位
CALL WRNBYT;调I2C
NOP
MOV A,FRONT
SWAP A
ANL A,#0FH;保留高4位
ADD A,#0A0H;;2258(0010 0100通道4fl,-10DB/STEP
MOV 30H,A
MOV A,FRONT
ANL A,#0FH
ADD A,#0B0H;2258(0011 0100通道4fl,-1DB/STEP
MOV 31H,A;
MOV NUMBYT,#02H;调4通道FL
LCALL WRNBYT
NOP
RET
RRDATA:;环绕音量2258入口数据处理
MOV A,REAR
SWAP A
ANL A,#0FH
ADD A,#80H;2258(1000 0100通道1SL-10DB/STEP)
MOV 30H,A
MOV A,REAR
ANL A,#0FH
ADD A,#90H;2258(1001 0100通道1SL-1DB/STEP)
MOV 31H,A
MOV NUMBYT,#02H
CALL WRNBYT
NOP
MOV A,REAR
SWAP A
ANL A,#0FH
ADD A,#40H;2258(0100 0100通道2SR-10DB/STEP)
MOV 30H,A
MOV A,REAR
ANL A,#0FH
ADD A,#50H;2258(0101 0100通道2SR-1DB/STEP)
MOV 31H,A
MOV NUMBYT,#02H
LCALL WRNBYT
NOP
RET

CNDATA:;中置音量2258入口数据处理
MOV A,CEN
SWAP A
ANL A,#0FH
ADD A,#00H;2258(0000 0100通道3CEN-10DB/STEP)
MOV 30H,A
MOV A,CEN
ANL A,#0FH
ADD A,#10H;2258(0001 0100通道3CEN-1DB/STEP)
MOV 31H,A
MOV NUMBYT,#02H
LCALL WRNBYT
NOP
RET
SBDATA:;重低音2258入口数据处理
MOV A,S_UB
SWAP A
ANL A,#0FH
ADD A,#20H;2258(0010 0100通道4sw-10DB/STEP)
MOV 30H,A
MOV A,S_UB
ANL A,#0FH
ADD A,#30H;2258(0011 0100通道4sw-1DB/STEP)
MOV 31H,A
MOV NUMBYT,#02H
LCALL WRNBYT
NOP
RET
;-----------------------------------------------------------
DISP_VOL:;保持音量显示级数不调节就不变
MOV A,R5
SWAP A
ANL A,#0FH
MOV DISPBUFF1,A;十位到DISPBUFF1
MOV A,R5
ANL A,#0FH
MOV DISPBUFF2,A;个位到DISPBUFF2
RET
;-----------------------------------------------------------
UAA:;实现PHONE的两位数值十进制递增1
MOV A,PHONE
SWAP A
ANL A,#0FH
MOV R5,A
MOV A,PHONE
ANL A,#0FH
NOP
CJNE A,#09H,UAA_1;到9就要变了
NOP
MOV R4,#00H
INC R5;十位加1
AJMP UAA_2
UAA_1:
INC A
MOV R4,A
UAA_2:
MOV A,R5
SWAP A
ADD A,R4
MOV PHONE,A
RET
;-----------------------------------------------------------
DAA:;实现PHONE的两位数值十进制递减1
MOV A,PHONE
SWAP A
ANL A,#0FH;
MOV R5,A;
MOV A,PHONE;
ANL A,#0FH
JNZ DAA_1;A≠0就转移,把A-1,只减个位
MOV R4,#09H;A=0则R4=#09H
DEC R5;且把R5-1即十位减1
NOP
SJMP DAA_2;跳转
DAA_1:
DEC A
MOV R4,A
DAA_2:;十个位复原但十进制减1
MOV A,R5;
SWAP A
ADD A,R4
MOV PHONE,A
RET
;定时器T1入口
;--------------------------数码管显示程序-------------------
DISP:
PUSH ACC;保护现场
PUSH PSW
mov psw,#00h;程序状态重赋值
MOV TH1,#0e8H;定时器1赋初值
MOV TL1,#30H
SETB P3.5;数码管和指示灯都关掉
SETB P3.7
SETB P1.0
INC NO_N
MOV A,NO_N
XRL A,#9FH
JNZ NONTE
MOV NO_N,#80H
NONTE:
INC R2
MOV A,R2
XRL A,#5AH
JNZ DE;R2不等于#5AH就跳出去显示数码管
MOV R2,#00H;清R2
INC R3
JB (29H).1,LED_1;
MOV A,DISPBUFF3
XRL A,#10000000B
MOV DISPBUFF3,A
NOP
AJMP LED_11
LED_1:
MOV A,DISPBUFF3
ORL A,#10000000B
MOV DISPBUFF3,A
LED_11:
JNB (29H).2,LED_2
MOV A,DISPBUFF3
XRL A,#00010000B
MOV DISPBUFF3,A
LED_2:
JNB (29H).3,LED_3
MOV A,DISPBUFF3
XRL A,#01000000B
MOV DISPBUFF3,A
LED_3:
JNB (29H).4,LED_4
MOV A,DISPBUFF3
XRL A,#00000010B
MOV DISPBUFF3,A
LED_4:
JNB (29H).5,DE
MOV A,DISPBUFF3
XRL A,#00000100B
MOV DISPBUFF3,A
DE:
MOV A,COUNTER;看记数器的值
JNZ DE_1;不等于0就跳转
MOV A,DISPBUFF2;等于0就把个位数入A查表将值送到P1口
MOV DPTR,#TAB1;如DISPBUFF2=5,则查表后P1口44H显示5
MOVC A,@A+DPTR
MOV P1,A;P1.0都=0相当于开了个位的位控制
NOP
AJMP DISPNEXT
DE_1:
XRL A,#01H;计数器=1吗
JNZ DE_2;不=1就跳转
MOV A,DISPBUFF1;等于1就把十位数调出来显示
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P1,A;P1.0都=1,相当于关着个位显示
CLR P3.7;开十位显示
NOP
AJMP DISPNEXT;计数器去控制
DE_2:;计数器到2了,显示指示灯
MOV P1,DISPBUFF3;把指示灯的值送P1口
CLR P3.5;因DISPBUFF3是逻辑运算后得的,显示与数码管不同
DISPNEXT:
INC COUNTER;记数器加1
MOV A,COUNTER
XRL A,#03H;计数器不能大于3
JNZ DISPEXIT;不等于3就跳出
MOV COUNTER,#00H;等于3让它回到0
DISPEXIT:;保护出栈
POP PSW
POP ACC
RETI
;--------------------------数码管段码表---------------------
TAB1:DB 10H,7cH,88H,28H,64H
DB 22H,02H,78H,00H,20H
TAB2:DB 11H,7dH,89H,29H,65H
DB 23H,03H,79H,01H,21H

; DB 03H,0CFH,2AH,4AH,0C6H,52H,12H,0CBH,02H,42H
; 0 1 2 3 4 5 6 7 8 9
;======================PT2258的I2C控制======================
WRNBYT:
PUSH ACC;保护现场
PUSH PSW
MOV PSW,#18H;PSW赋值R0=08H,R1=09H,原来R0=00H,R1=01H)
;寄存器第1组(CY=1,AC=0,F0=0,RS1=0,RS1=1,0V=0,X=0,P=0)
WRNBYT1:
NOP
LCALL STA;启动
NOP
MOV A,#88H;2258地址
NOP
LCALL WRBYT;发送字节数据
NOP
LCALL CACK;调用检测应答位子程序
NOP
JB F0,WRNBYT1;判断应答位
MOV R1,#MTD;有应答把缓冲2258数据存放首地址30H
;放入R1=08H寄存器,30H内是各操作状态
;给的数
WRDA:
MOV A,@R1;(30H内的值放入A)
NOP
LCALL WRBYT;送字节
NOP
LCALL CACK;应答
NOP
JB F0,WRNBYT1;F0=1有应答再来
INC R1;(送30H内的数,有些动作要送31H内的数)
DJNZ NUMBYT,WRDA;(NUMBYT=1就向下执行
;=2就传16位到总线上给2258)
NOP
LCALL STOP;结束I2C
NOP
POP PSW;PSW,ACC出栈,用过ACC,PSW的C,F0,R0,R1等)
POP ACC;要恢复现场
RET
;----------------------2258主程序完毕-----------------------
STA:;I2C总线启动(启动条件:SCL为高电平,SDA由高变低)
SETB SDA
NOP
NOP
SETB SCL
WAITS:;确保启始条件,满足建立时间要大于4.7US
JNB SCL,WAITS;SCL没高就等
NOP;5个NOP比较好
NOP
NOP
NOP
CLR SDA
NOP;启始条件锁定时间大于4US,5个NOP就可以吧
NOP
NOP
NOP
NOP
NOP
CLR SCL;锁住总线,准备发数据
NOP
RET
STOP:;结束I2C总线(停止信号:SCL为高电平,SDA由高变低)
CLR SDA
NOP
NOP
SETB SCL;发送结束条件的时钟信号
WAITP:
JNB SCL,WAITP;确保时钟为高否则等待
NOP;结束总线时间大于4US
NOP
NOP
NOP
SETB SDA;结束总线
NOP;保证一个终止信号和下一个起始信号空闲时间
NOP;大于4.7US
NOP
NOP
NOP
NOP
CLR SCL;锁住总线

NOP;
RET
CACK:;检查应答位子程序
SETB SDA
NOP
NOP
SETB SCL
NOP
CLR F0;应答标志位(F0是用户标志位,可由程序员决定
;何时使用:))
JNB SDA,CEND;判断应答位
SETB F0
CEND:
NOP
CLR SCL
NOP
NOP
NOP
NOP
RET
;-----------------------------------------------------------
WRBYT:;把各操作状态给30H,31H的数写入
MOV R0,#07H
RLC A;取数据位(30H内的值左移,无进位还没写完又开始
;有进位表示写完8位就结束)
JC NEXT1;(CY=1就转移,CY本来就为1,8位写完有进位应该=0)
CLR SDA;结束I2C状态
NOP
NOP
SJMP NEXT0
NEXT1:
SETB SDA;保持开始I2C状态
NOP
NOP
NEXT0: SETB SCL
WAITW:
JNB SCL,WAITW;确保SCL=1,SCL=0就等待SCL=1
NOP;启动建立时间要大于4.7US,不同晶体要改NOP个数)
NOP
NOP
NOP
CLR SCL;又钳主总线,等发数据
NOP
NOP
CLR SDA;SDA变低就开始发字节0,1
WLP:;发送字节子程序
RLC A;取数据位
JC WR1;如果进位为1则写入1,进位为0写入的是0
;一个一个慢慢左移进CY

NOP
AJMP WR0;判断数据位,是0就执行写0
WLP1:
DJNZ R0,WLP;写8位就退出
RET
WR1:;发送1
SETB SDA;数据为高即1准备写入
NOP
NOP
SETB SCL;要时钟在高电平周期才认为有效
NOP;周期
NOP
NOP
NOP
NOP
NOP
CLR SCL;有效后要恢复SCL,SDA状态
NOP;SCL变低
NOP
CLR SDA;SDA变低,为何要变低?因为下一位有可能为0
NOP
NOP
AJMP WLP1;准备写下一位
WR0:;发送0
CLR SDA;数据为低即准备写入0
NOP
NOP
SETB SCL;时钟要为高电平
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL;写完0让SCL变低,只有在SCL为低时,SDA才可变化
NOP;下一位如果为1就是变化,I2C规定的
NOP
LJMP WLP1;准备写下一位

;----------------------延时50MS-----------------------------
DELAY:
MOV R7,#255
D2: MOV R6,#200
DJNZ R6,$
DJNZ R7,D2
RET
;///////////////////////////////////////////////////////////
CLMUT:;2258静音
JB (29H).1,CLMUT_EX;(29H).1=1就退出
SETB (29H).1;否则
MOV 30H,#0F8H;1111 1000,2258 NO MUTE
MOV NUMBYT,#01H
NOP
ACALL WRNBYT;写入2258
NOP
CLMUT_EX:
RET
;----------------------外中断1入口--------------------------
INO1:;有遥控信号引发外中断1
PUSH ACC;压栈ACC,累加器内容保护
PUSH PSW;压栈PSW,程序状态字保护
MOV PSW,#10H;寄存器选第一组
CLR TR0;关定时
CLR EX1;把外中断1关掉
MOV 27H,TH0;定时0初值放入暂存
MOV 28H,TL0
MOV TH0,#00H;定时初值
MOV TL0,#00H
SETB TR0;开定时
JNB (29H).0,REST_12;跳转
MOV 4AH,27H
MOV 4BH,28H
MOV 4CH,#03H;定时器0设定比较值#039DH(3X16X16+9X16+13=925=0.925MS)
MOV 4DH,#9DH
NOP
LCALL SUB0;
NOP
JC X1_009;
MOV 4CH,#05H;时间1.325MS,避过2.25MS连发码
MOV 4DH,#2DH
MOV 4AH,27H
MOV 4BH,28H
NOP
LCALL SUB0
NOP
JNC X1_01
CLR C;否则收到0
NOP
LJMP X1_02
X1_009:
NOP
AJMP X1_005
X1_OO1:
NOP
AJMP X1_OUT1
REST_12:
NOP
AJMP REST_1
X1_01:
MOV 4CH,#07H;2MS
MOV 4DH,#0D0H
MOV 4AH,27H
MOV 4BH,28H
NOP
LCALL SUB0
NOP
JC X1_009
MOV 4CH,#09H;2.5MS
MOV 4DH,#0C4H
MOV 4AH,27H
MOV 4BH,28H
NOP
LCALL SUB0
NOP
JC X_01T
NOP
AJMP X1_005
X_01T:
NOP
AJMP X_01
;-----------------------------------------------------------
REST_1:
MOV 4CH,#2AH
MOV 4DH,#0F8H
MOV 4AH,27H
MOV 4BH,28H
NOP
LCALL SUB0
NOP
JC X1_009
MOV 4CH,#2EH
MOV 4DH,#0E0H
MOV 4AH,27H
MOV 4BH,28H
NOP
LCALL SUB0
NOP
JNC REST_2
MOV 4CH,#03H
MOV 4DH,#08H
MOV 4AH,#03H
MOV 4BH,NO_N
NOP
LCALL SUB0
NOP
JC X1_005
MOV 4CH,#03H
MOV 4DH,#1EH
MOV 4AH,#03H
MOV 4BH,NO_N
NOP
LCALL SUB0
NOP
JNC X1_005
MOV NO_N,#00H
DJNZ REMVOL,X1_005
MOV REMVOL,#01H
MOV A,2CH
XRL A,#00H
JNZ REST_3
NOP
AJMP X1_10
;...略,详细见套件所配程序
END
搜索更多相关主题的帖子: 数码管 数码管 高电平 高电平 定时器 定时器 功放 定时器 高电平 数码管 功放 
2013-11-17 20:41
a460399147
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-11-17
收藏
得分:0 
前面怎么漏了,现补上,请看下面,

COUNTER EQU 35H;显示计数
REMVOL EQU 36H;音量连续控制
DISPBUFF1 EQU 37H;个位暂存
DISPBUFF2 EQU 38H;十位暂存
DISPBUFF3 EQU 39H;指示灯暂存
DISPBUFF EQU 3AH;显示缓冲区
;-----------------------------------------------------------
SDA BIT P3.4;I2C总线数据口
SCL BIT P3.2;I2C总线时钟口
MTD EQU 30H;PT2258数据首址(30h-31h,16字节)
NUMBYT EQU 3BH;PT2258数据位数
;-----------------------------------------------------------
CS_X1 EQU 3CH;遥控
CS0_X1 EQU 3DH
U0_X1 EQU 3EH;遥控数据暂存区
NO_M EQU 40H;遥控按键数据码
;-----------------------------------------------------------
FRONT EQU 41H;前置音量缓存
REAR EQU 42H;环绕音量缓存
CEN EQU 43H;中置音量缓存
S_UB EQU 44H;重低音音量缓存
RVER EQU 45H;环绕微调音量缓存
CVER EQU 46H;中置微调音量缓存
SVER EQU 47H;重低音微调音量缓存
FVER EQU 48H;前置微调音量缓存
PHONE EQU 49H
NO_N EQU 51H
;-----------------------------------------------------------
ORG 0000H
AJMP START
ORG 000BH;定时器T0入口
AJMP ITT0
ORG 0013H;外部中断INT1入口地址
AJMP INO1;
ORG 001BH;
AJMP DISP;定时器T1入口显示程序
;-----------------------------------------------------------
START:;初始化
MOV SP,#60H;指针指向60H
MOV PSW,#00H
MOV IE,#00H
MOV IP,#00H
CLR P3.1;刚开机时7370STANDBY待机
2013-11-23 20:06
快速回复:5.1功放程序和DIY电路资料
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018521 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved