您当前的位置:五五电子网电子知识单片机-工控设备51单片机51单片机PT2221红外解码汇编程序 正文
51单片机PT2221红外解码汇编程序

51单片机PT2221红外解码汇编程序

点击数:7801 次   录入时间:03-04 11:46:43   整理:http://www.55dianzi.com   51单片机

PT2221发送的红外编码最前面为13.5ms的引导码,而后为32位的数据,32位数据的前16位为用户码,        ;用于区别各个厂家的遥控器的不同,而后16位为数据码,分前8位和后8位,前后8位互为反码,用于检验        ;这里我们只接收了16位的数据,别的数据则丢掉了,对16的数据在程序中进行了检验        ;解码的结果用两种方式输出:1.用串口以9600的波特率发送,2.四位一体数码管显示        ;一体化接P3.2,即外部中断0        ;数码管:P1口送段码,P0口低四位送位码        ;程序中采用11.0592M的晶振,若用12M晶振只需按程序注释的提示选择相应程序即可

  b_bit equ 20h ;数码管个位数存放内存位置

        a_bit equ 21h ;数码管十位数存放内存位置

        ORG 0000H

        AJMP MAIN     ;转入主程序

        ORG 0003H     ;外部中断P3.2脚INT0入口地址

        AJMP INT      ;转入外部中断服务子程序(解码程序)

        ;=============以下为主程序进行CPU中断方式设置===================================

MAIN:   SETB EA       ;打开CPU总中断请求

        SETB IT0      ;设定INT0的触发方式为脉冲负边沿触发

        SETB EX0      ;打开INT0中断请求

        AJMP $

        ;============以下为进入P3.2脚外部中断子程序,也就是解码程序======================

INT:    CLR EA        ;暂时关闭CPU的所有中断请求,只处理当前中断,避免受外部信号干扰

        MOV R6,#10

SB:     ACALL YS1     ;调用882微秒延时子程序

        JB P3.2,EXIT  ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序,(882um就出现高电平说明是干扰信号)

        DJNZ R6, SB   ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序

        ;=======以上完成对遥控信号的9ms的初始低电平信号的识别======================

        JNB P3.2, $   ;等待高电平避开9毫秒低电平引导脉冲

        ACALL YS2     ;延时4.74毫秒避开4.5毫秒的结果码

        MOV R7,#16    ;忽略前16位系统识别码,PT2221共发送32位数据,前16位为用户码,后16为数据码才是我们需要的

JJJJA:  JNB P3.2,$    ;等待地址码第一位的高电平信号

        LCALL YS1     ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

        MOV C,P3.2    ;将P3.2引脚此时的电平状态0或1存入C中

        JNC UUUA      ;如果为0就跳转到UUUA

        LCALL YS3     ;检测到高电平1的话延时1毫秒等待脉冲高电平结束

UUUA:   DJNZ R7,JJJJA

        ;==============到此为止,已跳过13.5ms的引导码和前16位的用户码=====================

        MOV R1,#1AH   ;设定1AH为起始RAM区

        MOV R2,#2     ;接收从1AH到1BH的2个内存,用于存放操作码和操作反码,

        ;16位数据分前8位和后8位,后8位是前8位的反码,用于检验

PP:     MOV R3,#8     ;每组数据为8位

JJJJ:   JNB P3.2,$    ;等待地址码第一位的高电平信号

        LCALL YS1     ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

        MOV C,P3.2    ;将P3.2引脚此时的电平状态0或1存入C中

        JNC UUU       ;如果为0就跳转到UUU

        LCALL YS3     ;检测到高电平1的话延时1毫秒等待脉冲高电平结束,然后把C中的1存入R1

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    ;接收完8位数据码和8位数据反码,存放在1AH/1BH中

        ;==================上面的程序已完成了16位数据码的接收工作,下面进行检验==================

        MOV A,1AH

        CPL A         ;对1AH取反后和1BH比较

        CJNE A,1BH,EXIT       ;如果不等表示接收数据发生错误,放弃

        ;====================校验正确则继续执行下面程序,不正确则作为干扰丢弃===================

        LCALL SEND    ;调用串口发送程序,把16位数据码用串口发送出去

        LCALL DISPLAY ;把16位数据码送数码管显示

        CLR P3.5      ;P3.5口上的LED闪烁一次,表示解码成功

        LCALL YS2

        LCALL YS2

        LCALL YS2

        SETB P3.5

        ;==================退出子程序,解码出错时退出解码子程序========================

EXIT:   SETB EA       ;允许中断

        RETI          ;退出解码子程序

        ;===================串口发送子程序============================================

SEND:   MOV a,1AH     ;将1AH中的十六进制数转换成16进制

        MOV b,#16     ;10进制/16=16进制,此时输出按键的16进制编码,00~1F

        div ab

        SWAP A

        ADD A,B

        MOV 30H,a     ;转换为16进制代码后存到30H

        MOV TMOD,#20H

[1] [2]  下一页


本文关键字:单片机  51单片机单片机-工控设备 - 51单片机