请教:关于STC89C51单片机解码UPD6121G的问题我现在调试一个红外键盘,现在买到upd6121g芯片的遥控器,用stc89c51单片机(和at的语言指令一模一样)解码的时候,始终没有成功。我用的解码程序是这样的:
org
0000h
ajmp
main;转入主程序
org
0003h
;外部中断p3.2脚int0入口地址
ajmp
int
;转入外部中断服务子程序(解码程序)
;以下为主程序进行cpu中断方式设置
main:setb
ea
;打开cpu总中断请求
setb
it0
;设定int0的触发方式为脉冲负边沿触发
setb
ex0
;打开int0中断请求
;以下对单片机的所有引脚进行初始化,全部设置成高电平
mov
p1,#11100111b
ajmp
$
;以下为进入p3.2脚外部中断子程序,也就是解码程序
int:
clr
ea
;暂时关闭cpu的所有中断请求
mov
r6,#10
sb:
acall
ys1;调用882微秒延时子程序
jb
p3.2,exit;延时882微秒后判断p3.2脚是否出现高电平如果有就退出解码程序
djnz
r6,
sb;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
jnb
p3.2,
$
;等待高电平避开9毫秒低电平引导脉冲
acall
ys2
;延时4.74毫秒避开4.5毫秒的结果码
mov
r1,#1ah
;设定1ah为起始ram区
mov
r2,#4
pp:
mov
r3,#8
jjjj:
jnb
p3.2,$;等待地址码第一位的高电平信号
lcall
ys1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
mov
c,p3.2;将p3.2引脚此时的电平状态0或1存入c中
jnc
uuu;如果为0就跳转到uuu
lcall
ys3
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
;接收完16位地址码和8位数据码和8位数据反码,存放在1ah/1bh/1ch/1dh的ram中
mov
p1,1dh;将按键的键值通过p1口的8个led显示出来!
clr
p2.0;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
lcall
ys3
lcall
ys3
lcall
ys3
setb
p2.0
exit:setb
ea
;允许中断
;退出解码子程序
ys1:
mov
r4,#20
;延时子程序1,精确延时882微秒
d1:
mov
r5,#20
djnz
r5,$
djnz
r4,d1
ret
ys2:
mov
r4,#10
;延时子程序2,精确延时4740微秒
d2:
mov
r5,#235
djnz
r5,$
djnz
r4,d2
ret
ys3:
mov
r4,#2;延时程序3,精确延时1000微秒
d3:mov
r5,#248
djnz
r5,$
djnz
r4,d3
ret
end
在实验板上的结果总是,第4,5两个led亮,按下遥控板时,只是只是第三个数码管闪一下(证明p3.2,红外接受正常)。但是led没有任何变化,蜂鸣器(p2.0)也没有任何反应。
不知道这是怎么回事。自己觉得好像中断没有起到作用???
望回复,谢谢!!!!!!!!!!!!!!!!!!
