STC89C52做的学习型遥控器,可存八个红外遥控信息,只要再把按键用定时器中断2完成就可以用于商业生产.
RXIN BIT P2.0 TXZAI BIT P2.2 TXOUT BIT P2.1 KEY_SIGN BIT 20H ;为0按键错误,为1按键正确 RXTX_SIGN BIT 21H ;为0是为发射状态,为1是为接收状态 ISP_DATA DATA 0E2H ;ISP功能寄存器定义 ISP_ADDRH DATA 0E3H ISP_ADDRL DATA 0E4H ISP_CMD DATA 0E5H ISP_TRIG DATA 0E6H ISP_CONTR DATA 0E7H ISP_CMD_NO EQU 0 ;操作数 ISP_CMD_READ EQU 1 ISP_CMD_PROGRAM EQU 2 ISP_CMD_ERASE EQU 3 WAIT_TIME EQU 1 ;等待时间 ZHIL EQU 30H ZHIH EQU 31H GESHU EQU 32H JISHU EQU 33H KEY_WORD EQU 34H KEY_VALUE EQU 35H ADDRH EQU 36H ADDRL EQU 37H TX_GESHU EQU 38H ORG 0000H LJMP START ORG 000BH LJMP T0IN ORG 001BH LJMP T1IN ORG 0100H START: MOV SP,#10H CLR RXTX_SIGN LJMP KEY_MAIN KEY_MAIN:LCALL SCAN_KEY ;检测有没有单个按键按下 MOV A,KEY_WORD CJNE A,#00H,NEXT1 LJMP KEY_MAIN NEXT1: JNB KEY_SIGN,KEY_MAIN MOV KEY_VALUE,A LCALL RE_DELAY ;消抖时间20ms LCALL SCAN_KEY ;是否依然是按下的 MOV A,KEY_WORD CJNE A,#00H,NEXT2 LJMP KEY_MAIN NEXT2: JNB KEY_SIGN,KEY_MAIN CJNE A,KEY_VALUE,KEY_MAIN RELEASE: LCALL SCAN_KEY ;查看是否放开按键了 MOV A,KEY_WORD CJNE A,#00H,RELEASE MOV DPTR,#TAB ;执行相应的程式 CLR C MOV A,KEY_VALUE ADD A,KEY_VALUE JMP @A+DPTR TAB: AJMP KEY_0 AJMP KEY_1 AJMP KEY_2 AJMP KEY_3 AJMP KEY_4 AJMP KEY_5 AJMP KEY_6 AJMP KEY_7 AJMP KEY_8 AJMP KEY_9 AJMP KEY_10 AJMP KEY_11 AJMP KEY_12 AJMP KEY_13 AJMP KEY_14 AJMP KEY_15 AJMP KEY_16 KEY_0: LJMP KEY_MAIN ;无效的按健值 KEY_1: JNB RXTX_SIGN,T1RX ;接收发送键设定键,P1灯亮为接收存储状态,灯灭是为发射状态 T1TX: CLR RXTX_SIGN MOV P1,#0FFH LJMP KEY_MAIN T1RX: SETB RXTX_SIGN MOV P1,#00H LJMP KEY_MAIN KEY_2: MOV ADDRH,#20H MOV ADDRL,#00H JB RXTX_SIGN,KEY2_RX KEY2_TX:LJMP TX_START KEY2_RX:LJMP RX_START KEY_3: MOV ADDRH,#22H MOV ADDRL,#00H JB RXTX_SIGN,KEY3_RX KEY3_TX:LJMP TX_START KEY3_RX:LJMP RX_START KEY_4: MOV ADDRH,#24H MOV ADDRL,#00H JB RXTX_SIGN,KEY4_RX KEY4_TX:LJMP TX_START KEY4_RX:LJMP RX_START KEY_5: MOV ADDRH,#26H MOV ADDRL,#00H JB RXTX_SIGN,KEY5_RX KEY5_TX:LJMP TX_START KEY5_RX:LJMP RX_START KEY_6: MOV ADDRH,#28H MOV ADDRL,#00H JB RXTX_SIGN,KEY6_RX KEY6_TX:LJMP TX_START KEY6_RX:LJMP RX_START KEY_7: MOV ADDRH,#2AH MOV ADDRL,#00H JB RXTX_SIGN,KEY7_RX KEY7_TX:LJMP TX_START KEY7_RX:LJMP RX_START KEY_8: MOV ADDRH,#2CH MOV ADDRL,#00H JB RXTX_SIGN,KEY8_RX KEY8_TX:LJMP TX_START KEY8_RX:LJMP RX_START KEY_9: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY9_RX KEY9_TX:LJMP TX_START KEY9_RX:LJMP RX_START KEY_10: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY10_RX KEY10_TX:LJMP TX_START KEY10_RX:LJMP RX_START KEY_11: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY11_RX KEY11_TX:LJMP TX_START KEY11_RX:LJMP RX_START KEY_12: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY12_RX KEY12_TX:LJMP TX_START KEY12_RX:LJMP RX_START KEY_13: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY13_RX KEY13_TX:LJMP TX_START KEY13_RX:LJMP RX_START KEY_14: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY14_RX KEY14_TX:LJMP TX_START KEY14_RX:LJMP RX_START KEY_15: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY15_RX KEY15_TX:LJMP TX_START KEY15_RX:LJMP RX_START KEY_16: MOV ADDRH,#2EH MOV ADDRL,#00H JB RXTX_SIGN,KEY16_RX KEY16_TX:LJMP TX_START KEY16_RX:LJMP RX_START SCAN_KEY:CLR KEY_SIGN MOV KEY_WORD,#00H KEY1: MOV P3,#11111110B ;第一行 JB P3.4,KEY2 JB KEY_SIGN,KEYWRONG1 MOV KEY_WORD,#1 SETB KEY_SIGN KEY2: JB P3.5,KEY3 JB KEY_SIGN,KEYWRONG1 MOV KEY_WORD,#2 SETB KEY_SIGN KEY3: JB P3.6,KEY4 JB KEY_SIGN,KEYWRONG1 MOV KEY_WORD,#3 SETB KEY_SIGN KEY4: JB P3.7,KEY5 JB KEY_SIGN,KEYWRONG1 MOV KEY_WORD,#4 SETB KEY_SIGN LJMP KEY5 KEYWRONG1: LJMP KEYWRONG KEY5: MOV P3,#11111101B ;第二行 JB P3.4,KEY6 JB KEY_SIGN,KEYWRONG2 MOV KEY_WORD,#5 SETB KEY_SIGN KEY6: JB P3.5,KEY7 JB KEY_SIGN,KEYWRONG2 MOV KEY_WORD,#6 SETB KEY_SIGN KEY7: JB P3.6,KEY8 JB KEY_SIGN,KEYWRONG2 MOV KEY_WORD,#7 SETB KEY_SIGN KEY8: JB P3.7,KEY9 JB KEY_SIGN,KEYWRONG2 MOV KEY_WORD,#8 SETB KEY_SIGN LJMP KEY9 KEYWRONG2:LJMP KEYWRONG KEY9: MOV P3,#11111011B ;第三行 JB P3.4,KEY10 JB KEY_SIGN,KEYWRONG3 MOV KEY_WORD,#9 SETB KEY_SIGN KEY10: JB P3.5,KEY11 JB KEY_SIGN,KEYWRONG3 MOV KEY_WORD,#10 SETB KEY_SIGN KEY11: JB P3.6,KEY12 JB KEY_SIGN,KEYWRONG3 MOV KEY_WORD,#11 SETB KEY_SIGN KEY12: JB P3.7,KEY13 JB KEY_SIGN,KEYWRONG3 MOV KEY_WORD,#12 SETB KEY_SIGN LJMP KEY13 KEYWRONG3:LJMP KEYWRONG KEY13: MOV P3,#11110111B ;第四行 JB P3.4,KEY14 JB KEY_SIGN,KEYWRONG4 MOV KEY_WORD,#13 SETB KEY_SIGN KEY14: JB P3.5,KEY15 JB KEY_SIGN,KEYWRONG4 MOV KEY_WORD,#14 SETB KEY_SIGN KEY15: JB P3.6,KEY16 JB KEY_SIGN,KEYWRONG4 MOV KEY_WORD,#15 SETB KEY_SIGN KEY16: JB P3.7,SCAN_END JB KEY_SIGN,KEYWRONG4 MOV KEY_WORD,#16 SETB KEY_SIGN LJMP SCAN_END KEYWRONG4: LJMP KEYWRONG KEYWRONG:CLR KEY_SIGN SCAN_END:RET RE_DELAY:MOV R7,#5 DE2:MOV R6,#10 DE1:MOV R5,#200 DJNZ R5,$ DJNZ R6,DE1 DJNZ R7,DE2 RET RX_START: CLR P2.4 ;接收红外信号,存入外部扩展寄存器0~256 CLR P2.6 CLR P2.7 CLR P2.2 CLR TXOUT MOV R1,#00H MOV R0,#00H MOV TMOD,#00010001B MOV TH0,#00H MOV TL0,#00H MOV TH1,#00H MOV TL1,#00H CLR ET0 CLR ET1 CLR EA CLR TR0 CLR TR1 LJMP RX_MAIN RX_MAIN: MOV R0,#00H JB RXIN,$ SETB TR0 JUDGE1: JB TF0,RXEND JNB RXIN,JUDGE1 CLR TR0 SETB TR1 MOV A,TL0 MOVX @R0,A INC R0 MOV A,TH0 MOVX @R0,A INC R0 MOV TL0,#00H MOV TH0,#00H INC R1 JUDGE2: JB TF1,RXEND JB RXIN,JUDGE2 CLR TR1 SETB TR0 MOV A,TL1 MOVX @R0,A INC R0 MOV A,TH1 MOVX @R0,A INC R0 MOV TL1,#00H MOV TH1,#00H INC R1 AJMP JUDGE1 RXEND: CLR TR0 CLR TR1 CLR TF0 CLR TF1 MOV TL0,#00H MOV TH0,#00H MOV TL1,#00H MOV TH1,#00H MOV GESHU,R1 MOV R1,GESHU ;取反转换重新存入外部扩展寄存器 MOV R0,#00H LOOP_CPL: MOVX A,@R0 CPL A MOVX @R0,A INC R0 MOVX A,@R0 CPL A MOVX @R0,A INC R0 DJNZ R1,LOOP_CPL LJMP ISP_STORE ISP_STORE: LCALL ISP_ERASE MOV ISP_DATA,GESHU ;将个数输入到ISP_EEPROM的第一位 MOV ISP_ADDRH,ADDRH MOV ISP_ADDRL,ADDRL CLR EA MOV ISP_CONTR,#WAIT_TIME ORL ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_CMD_PROGRAM MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP MOV R1,GESHU MOV R0,#00H LOOP_WRITE: LCALL BYTE_WRITE ;将扩展寄存器中的计时值依次放入ISP_EEPROM第二位开始的存储器中 INC R0 LCALL BYTE_WRITE INC R0 DJNZ R1,LOOP_WRITE MOV ISP_CMD,#00H ;ISP指令清零,防止误触发 MOV ISP_TRIG,#00H MOV ISP_ADDRH,#00H MOV ISP_ADDRL,#00H mov p1,geshu LJMP KEY_MAIN BYTE_WRITE: MOVX A,@R0 MOV ISP_DATA,A MOV ISP_ADDRH,ADDRH INC R0 MOV ISP_ADDRL,R0 DEC R0 CLR EA MOV ISP_CONTR,#WAIT_TIME ORL ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_CMD_PROGRAM MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP RET ISP_ERASE: MOV ISP_ADDRH,ADDRH MOV ISP_ADDRL,ADDRL CLR EA MOV ISP_CONTR,#WAIT_TIME ORL ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_CMD_ERASE MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP RET TX_START: MOV ISP_ADDRH,ADDRH ;取出第一位的个数 MOV ISP_ADDRL,ADDRL CLR EA MOV ISP_CONTR,#WAIT_TIME ORL ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_CMD_READ MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP MOV ISP_CMD,#00H ;ISP指令清零,防止误触发 MOV ISP_TRIG,#00H MOV ISP_ADDRH,#00H MOV ISP_ADDRL,#00H MOV A,ISP_DATA ;为0FF则是错误的,回去,不为0FF则继续 CJNE A,#0FFH,ISP_READ LJMP KEY_MAIN ISP_READ: MOV GESHU,ISP_DATA MOV R1,GESHU MOV R0,#00H LOOP_READ: LCALL BYTE_READ INC R0 LCALL BYTE_READ INC R0 DJNZ R1,LOOP_READ LJMP TX_EXROM BYTE_READ: INC R0 MOV ISP_ADDRH,ADDRH MOV ISP_ADDRL,R0 DEC R0 CLR EA MOV ISP_CONTR,#WAIT_TIME ORL ISP_CONTR,#10000000B MOV ISP_CMD,#ISP_CMD_READ MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H NOP MOV A,ISP_DATA MOVX @R0,A RET TX_EXROM: MOV TMOD,#00010010B MOV TH0,#0F4H MOV TL0,#0F4H MOV R1,GESHU MOV R0,#00H MOVX A,@R0 MOV TL1,A INC R0 MOVX A,@R0 MOV TH1,A INC R0 DEC R1 MOVX A,@R0 MOV ZHIL,A INC R0 MOVX A,@R0 MOV ZHIH,A INC R0 DEC R1 SETB ET1 SETB ET0 SETB EA SETB TR1 SETB TR0 CLR TXOUT MAIN2:CJNE R1,#00H,MAIN2 CLR TXOUT mov p1,#55h LJMP KEY_MAIN T0IN:CPL TXZAI RETI T1IN: MOV TL1,ZHIL MOV TH1,ZHIH JB TR0,NEXTT1 SETB TR0 LJMP NEXTT NEXTT1:CLR TR0 CLR TXZAI NEXTT:CPL TXOUT MOVX A,@R0 MOV ZHIL,A INC R0 MOVX A,@R0 MOV ZHIH,A INC R0 DJNZ R1,OUTTI CLR TR1 CLR TR0 CLR TXZAI CLR TXOUT OUTTI:RETI DELAYXMS:MOV R7,#255 DEL1:MOV R6,#4 DEL2:MOV R5,#5 DJNZ R5,$ DJNZ R6,DEL2 DJNZ R7,DEL1 RET DELAYX2MS:MOV R7,#255 DEL12:MOV R6,#50 DEL22:MOV R5,#50 DJNZ R5,$ DJNZ R6,DEL22 DJNZ R7,DEL12 RET END
上一篇:基于LPC938的高精度数控直流电流源的设计
下一篇:红外接收(模拟串口接收)
推荐阅读最新更新时间:2024-03-16 13:07
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况