一、发射部分程序代码 k0 BIT P1.0 k1 BIT P1.1 k2 BIT P1.2 k3 BIT P1.3 k4 BIT P1.4 k5 BIT P1.5 k6 BIT P1.6 k7 BIT P1.7 bz bit 00h k0h equ #0f1h k0l equ #0c8h ;k0键输出频率300Hz833 k1h equ #0f8h k1l equ #0ech ;k1键输出频率600Hz417 k2h equ #0feh k2l equ #0eah ;k2键输出频率900Hz278 k3h equ #0ffh k3l equ #030h ;k3键输出频率1200Hz208 k4h equ #0ffh k4l equ #059h ;k4键输出频率1500Hz167 k5h equ #0ffh k5l equ #075h ;k5键输出频率1800Hz139 k6h equ #0ffh k6l equ #089h ;k6键输出频率2100Hz119 k7h equ #0ffh k7l equ #098h ;k7键输出频率2400Hz104 ORG 0000H aJMP START ORG 000BH ;定时器T0入口 aJMP intt0 ORG 001bH ;定时器T1入口 aJMP intt1 org 0030h intt0: cpl p3.4 mov a,r1 mov th0,a mov a,r2 mov tl0,r2 reti intt1: clr tr0 clr et0 clr tr1 clr et1 setb bz setb p3.4 reti start: MOV P1,#0FFH mov p3,#0ffh MOV TMOD,#11H ;计数器T0、T1工作在方式1 setb ea ;开所有中断 xh: jb k0,d01 acall ys Jb k0,d01 ;k0 jnb k0,$ acall sett1 mov r1,k0h mov r2,k0l acall sett0 jnb bz,$ d01: jb k0,d02 acall ys Jb k0,d02 ;k1 jnb k0,$ acall sett1 mov r1,k1h mov r2,k1l acall sett0 jnb bz,$ D02: jb k0,d03 acall ys Jb k0,d03 ;k2 jnb k0,$ acall sett1 mov r1,k2h mov r2,k2l acall sett0 jnb bz,$ D03: jb k0,d04 acall ys Jb k0,d04 ;k3 jnb k0,$ acall sett1 mov r1,k3h mov r2,k3l acall sett0 jnb bz,$ D04: jb k0,d05 acall ys Jb k0,d05 ;k4 jnb k0,$ acall sett1 mov r1,k4h mov r2,k4l acall sett0 jnb bz,$ D05: jb k0,d06 acall ys Jb k0,d06 ;k5 jnb k0,$ acall sett1 mov r1,k5h mov r2,k5l acall sett0 jnb bz,$ D06: jb k0,d07 acall ys Jb k0,d07 ;k6 jnb k0,$ acall sett1 mov r1,k6h mov r2,k6l acall sett0 jnb bz,$ D07: jb k0,d08 acall ys Jb k0,d08 ;k7 jnb k0,$ acall sett1 mov r1,k7h mov r2,k7l acall sett0 jnb bz,$ d08: ajmp xh ys: mov r5,#80h ys1: djnz r5,ys1 ret sett1: MOV TH1,#3ch ;定时时间约为100ms MOV TL1,#0b0h setb tr1 ;启动T1计时 setb et1 ;允许T1中断 clr bz ret sett0: MOV TH0,r1 MOV TL0,r2 setb tr0 setb et0 ret end 二、接收部分程序代码 x0 equ #30 x1 equ #60 x2 equ #90 x3 equ #120 x4 equ #150 x5 equ #180 x6 equ #210 x7 equ #240 fz equ #10 sw bit p3.2 bz bit 00h ORG 0000H aJMP START ORG 0013H ;int1入口 aJMP int1 ORG 001bH ;定时器T1入口 aJMP intt1 org 0030h int1: clr ex1 MOV TH1,#3ch ;定时时间约为100ms MOV TL1,#0b0h setb tr1 ;启动T1计时 setb et1 ;允许T1中断 mov th0,#0 mov tl0,#0 setb tr0 reti intt1: clr tr0 mov a,tl0 mov b,x0 acall jspd jb bz,d01 cpl p1.0 jb sw d01 mov a,p1 orl a,#0feH mov p1,a ajmp d09 d01: mov b,x1 acall jspd jb bz,d02 cpl p1.1 jb sw d02 mov a,p1 orl a,#0fdH mov p1,a ajmp d09 d02: mov b,x2 acall jspd jb bz,d03 cpl p1.2 jb sw d03 mov a,p1 orl a,#0fbH mov p1,a ajmp d09 d03: mov b,x3 acall jspd jb bz,d04 cpl p1.3 jb sw d04 mov a,p1 orl a,#07H mov p1,a ajmp d09 d04: mov b,x4 acall jspd jb bz,d05 cpl p1.4 jb sw d05 mov a,p1 orl a,#0efH mov p1,a ajmp d09 d05: mov b,x5 acall jspd jb bz,d06 cpl p1.5 jb sw d06 mov a,p1 orl a,#0dfH mov p1,a ajmp d09 d06: mov b,x6 acall jspd jb bz,d07 cpl p1.6 jb sw d07 mov a,p1 orl a,#0bfH mov p1,a ajmp d09 d07: mov b,x7 acall jspd jb bz,d09 cpl p1.7 jb sw d09 mov a,p1 orl a,#7fH mov p1,a d09: setb ex1 reti jspd: push acc clr bz cjne a,b,jspd1 ajmp jspd5 jspd1: jc jspd2 subb a,r2 ajmp jspd3 jspd2: mov r1,b mov b,a mov a,r1 clr c subb a,b jspd3: cjne a,fz,jspd4 ajmp jspd5 jspd4: jc jspd5 setb bz pop acc ret jspd5: clr bz pop acc ret start: MOV P1,#0FFH mov p3,#0ffh clr it1 ;int1中断为电平触发 SETB EX1 ;允许int1中断 MOV TMOD,#15H ;设置T0为计数方式、T1为计时方式1 setb ea ;开所有中断 xh: nop ajmp xh end