首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
51单片机PT2221红外解码汇编程序
来源:本站整理  作者:佚名  2011-02-05 21:46:55



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

        MOV TL1,#0FDH

        MOV TH1,#0FDH

        MOV SCON,#40H

        MOV PCON,0

        CLR TI

        CLR RI

        SETB TR1

        MOV R0,#30H

        MOV A,@R0

        MOV SBUF,A

WAIT:   JNB TI,WAIT

        CLR TI

        RET

        ;******************************************显示子程序********************************************

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

        MOV b,#10     ;10进制/10=10进制,此时输出按键对应的键号,00~31

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

        div ab

        MOV a_bit,a   ;十位在a

        MOV b_bit,b   ;个位在b

        MOV dptr,#numtab      ;指定查表启始地址

        MOV r0,#4

dpl1:   MOV r1,#250   ;显示1000次

dplop:  MOV a,b_bit   ;取个位数

        MOV C A,@A+DPTR;查个位数的7段代码

        MOV p1,a      ;送出个位的7段代码

        SETB p0.0     ;开个位显示

        acall d1ms    ;显示1ms

        CLR P0.0

        MOV a,a_bit   ;取十位数

        MOV C A,@A+DPTR;查十位数的7段代码

        MOV p1,a      ;送出十位的7段代码

        SETB P0.1     ;开十位显示

        acall d1ms    ;显示1ms

        CLR P0.1

        CLR P0.2

        CLR P0.3

        djnz r1,dplop ;100次没完循环

        djnz r0,dpl1  ;4个100次没完循环

        ret

D1MS:   MOV R4,#250   ;延时1ms

        DJNZ R4,$

        RET

numtab: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H    ;字形码表"0","1","2"~"7"

        DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H    ;字形码表"8","9","A"~"F"

        ;=============延时子程序1,精确延时882微秒=========================================

        ;YS1: MOV R4,#20 ;12M晶振请用此句延时

YS1:    MOV R4,#17    ;11.0592M晶振请用此句延时

D1:     MOV R5,#20

        DJNZ R5,$

        DJNZ R4,D1

        RET

        ;============延时子程序2,精确延时4740微秒==========================================

YS2:    MOV R4,#10

        ;D2: MOV R5,#235 ;12M晶振请用此句延时

D2:     MOV R5,#217   ;11.0592M晶振请用此句延时

        DJNZ R5,$

        DJNZ R4,D2

        RET

        ;=============延时程序3,精确延时1000微秒===========================================

YS3:    MOV R4,#2

        ;D3: MOV R5,#248 ;12M晶振请用此句延时

D3:     MOV R5,#230   ;11.0592M晶振请用此句延时

        DJNZ R5,$

        DJNZ R4,D3

        RET

        ;=========================

        END

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:49,214.84000 毫秒