0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机学习型遥控器程序详解(完整版)

算法&编程学院 来源:网络整理 2018-02-03 03:16 次阅读

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

MOV X @R0,A

INC R0

MOV A,TH0

MOV X @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

MOV X @R0,A

INC R0

MOV A,TH1

MOV X @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: MOV X A,@R0

CPL A

MOV X @R0,A

INC R0

MOV X A,@R0

CPL A

MOV X @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: MOV X 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

MOV X @R0,A

RET

TX_EXROM: MOV TMOD,#00010010B

MOV TH0,#0F4H

MOV TL0,#0F4H

MOV R1,GESHU

MOV R0,#00H

MOV X A,@R0

MOV TL1,A

INC R0

MOV X A,@R0

MOV TH1,A

INC R0

DEC R1

MOV X A,@R0

MOV ZHIL,A

INC R0

MOV X 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

MOV X A,@R0

MOV ZHIL,A

INC R0

MOV X 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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632840
收藏 人收藏

    评论

    相关推荐

    学习型遥控器

    学习型遥控器
    发表于 08-16 16:59

    智能学习型红外遥控器设计

    智能学习型红外遥控器设计
    发表于 08-16 19:26

    用89C52 做一个学习型遥控器

    现在有单片机89C52 红外线发射二级管 三级管 按钮 电阻 电容 0038红外接收 晶振 想做一个 学习型遥控器 遥控电视 和空调 带串口的更好 需要给我电路图和元器件型号 还有
    发表于 02-13 09:04

    学习型红外遥控器设计

    有没有前辈知道怎么写基于MSP430F149的学习型红外遥控器设计程序的?麻烦联系我。O(∩_∩)O谢谢984300719
    发表于 05-01 15:22

    如何增加学习型遥控器学习距离?

    如图,学习型遥控器,那部分是学习天线,如何增大信号?
    发表于 08-16 09:48

    普通遥控器如何摇身变新型学习型遥控器

    ﹑录像﹑机顶盒﹑激光唱机以及音响功放等各种视听类家用电器, 从而实现了“ 一在手, 遥控天下”的梦想。  1概述  学习型遥控器包括微控
    发表于 11-05 16:00

    基于AT89C52的学习型遥控器的设计

    本文介绍了一种基于 AT89C52 的学习型遥控器,并对其工作原理及软、硬件的设计和实现方法进行了详细的阐述。关键词: AT89C52; 学习型遥控器; 红外
    发表于 08-14 08:58 208次下载

    匠人手记-单片机完整版_上

    电子发烧友网站提供《匠人手记-单片机完整版_上.txt》资料免费下载
    发表于 03-17 21:31 0次下载

    多路电压表+遥控器设置完整版

    多路电压表+遥控器设置完整版, ADC显示电压 最小0V 最大3.3V。
    发表于 07-21 16:48 0次下载

    C_基本语法详解大全完整版

    电子专业单片机相关知识学习教材资料——C_基本语法详解大全完整版
    发表于 07-25 09:49 0次下载

    智能学习型红外空调遥控器分析

    为了解决空调遥控器不兼容问题,设计了一款基于Atmega16单片机的智能空调遥控器。该遥控器采用测量脉冲宽度的方法学习红外信号,同时使用游程
    发表于 10-16 11:11 17次下载
    智能<b class='flag-5'>学习型</b>红外空调<b class='flag-5'>遥控器</b>分析

    基于stc89c52单片机的红外学习型遥控器

    很详细的红外学习型遥控器,储存在24c64中的汇编子程序,在你自己的设计中只要修改一下IO调用它就可以了,是本人的工程验证能学习市面常用的绝大部分红外线
    发表于 03-15 15:09 6343次阅读

    关于R8C/Lx学习型遥控器设计的介绍

    R8C/Lx学习型遥控器参考设计
    的头像 发表于 07-23 01:04 3205次阅读

    红外学习型遥控器方案说明

    红外学习型遥控器可通过学习操作学习其它遥控器上的部分按键,实现同一遥控器
    的头像 发表于 10-18 11:31 4340次阅读

    学习型遥控器的设计与实现

    电子发烧友网站提供《学习型遥控器的设计与实现.doc》资料免费下载
    发表于 10-24 09:33 1次下载
    <b class='flag-5'>学习型</b><b class='flag-5'>遥控器</b>的设计与实现