不知道那里出了问题调了几天了,把原程序发上来看一下,请高手分析一下,谢谢了
PWM EQU 7FH ;PWM赋初始值
OUT EQU P2.6 ;LED灯的接口
ORG 0000H
AJMP START
ORG 000BH
AJMP INTT0
ORG 001BH
AJMP INTT1
ORG 0030H
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
START:
MOV SP,#50H
MOV TMOD,#21H
MOV TH1,PWM
MOV TL1,#00H
MOV TH0,#0FFH
MOV TL0,#00H
SETB EA
SETB ET0
SETB ET1
SETB TR0
JNB P0.7,IR ;遥控扫描
LJMP START ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
;解码程序
IR: ;以下对遥控信号的9000微秒的初始低电平信号的识别。
MOV R5,#10
IR_SB:
ACALL DELAY882
JB P0.7,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
DJNZ R5,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;识别连发码,和跳过4.5ma的高电平
JNB P0.7,$ ;等待高电平避开9毫秒低电平引导脉冲
ACALL DELAY2400
JNB P0.7,IR_RP ;这里为低电平,认为是连发码信号
ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
;以下32数据码的读取 ,0和1的识别
MOV R1,#28H
MOV R2,#4 ;设定28H为起始RAM区
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P0.7,$ ;等待地址码第一位的高电平信号
LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信
MOV C,P0.7 ;将P2.2引脚此时的电平状态0或1存入C中
JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
LCALL DELAY1000
IR_8BIT_0:
MOV A,@R1 ;将R1中地址的给A
RRC A ;将C中的值0或1移入A中的最低位
MOV @R1,A ;将A中的数暂时存放在R1中
DJNZ R3,IR_8BIT ;接收地址码的高8位
INC R1 ;对R1中的值加1,换下一个RAM
DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,存放在28H/29H/2AH/2BH的RAM中
;解码成功
JMP IR_GOTO
IR_RP:
JMP IR_GOTO
IR_ERROR:
LJMP START
LOOP:
MOV R4,PWM
CJNE R4,#0FFH,PWMINC ;是否到最大值?
SJMP LOOP
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP
LOOP1:
CJNE R4,#02H,PWMDEC ;是否到最小值?
SJMP LOOP
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加
LOOP2:
SJMP LOOP
IR_GOTO:
MOV A,2AH
CPL A
CJNE A,2BH,IR_ERROR ;两个数据码不相反则退出
;遥控加值的判断
MOV A,2BH
MOV R6,A
CJNE R6,#0EFH,IR_TR
LJMP LOOP
;遥控减值的判断
IR_TR:
CJNE R6,#0FCH,IR
LJMP LOOP1
MOV 28H,#00H
MOV 29H,#00H
MOV 2AH,#00H
MOV 2BH,#00H
LJMP START
;T0中断服务子程序(频率)控制定时器1中断
INTT0:
CLR TR1
MOV TH0,#0FFH ;256us延时常数
MOV TL0,#00H ;频率调节
MOV TH1,PWM
SETB TR1
CLR OUT ;启动输出
RETI
;T1中断服务子程序(脉宽)控制PWM脉冲宽度
INTT1:
CLR TR1 ;脉宽调节结束
SETB OUT ;结束输出
RETI
DELAY882: ;((219x4)+5)=882
MOV R7,#202
DELAY882_A :
NOP
NOP
DJNZ R7,DELAY882_A
RET
DELAY1000: ;((249x4)+5)=1001
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
DELAY2400: ;((255x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
END |