c51单片机红外解码程序-汇编版和c语言版.doc_第1页
c51单片机红外解码程序-汇编版和c语言版.doc_第2页
c51单片机红外解码程序-汇编版和c语言版.doc_第3页
c51单片机红外解码程序-汇编版和c语言版.doc_第4页
c51单片机红外解码程序-汇编版和c语言版.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

纯软件解码 - 汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG 0000HT0ZD BIT 20H.2XH BIT P3.3 ;红外接收头数据接口 RS BIT P2.3RW BIT P2.4E BIT P2.5BB BIT P3.6ORG 0000H ;AJMP MAINORG 000BH ;T0中断入口LJMP T0ZDCXORG 0100H ;主程序首地址MAIN:LCALL CSHMOV DPTR,#TAB ;总查表SETB EA ;T0中断设定SETB ET0MOV TMOD,#01HDDXH: ;信号接收前准备SETB P2.0 ;关信号指示灯MOV P0,#0FFHCLR TR0 ;关T0中断CLR T0ZD ;接收信号时间判断MOV R5,#4 ;延时计数MOV TH0,#00HMOV TL0,#00H;=解码主要过程=关键=JB XH,$ ;等待电平变低,解码从这开始CLR P2.0 ;开信号指示灯,表示正在接收信号MOV P0,#8EH SETB TR0 ;开T0中断LCALL YS3MSJB XH,DDXH ;干扰检测LCALL YS3MSJB XH,DDXH ;干扰检测DD1:JB T0ZD,DDXH ;是否超出接收允许时间JNB XH,DD1 ;等待电平变高LCALL YS3MSJNB XH,DDXH ;干扰检测 DD2:JB T0ZD,DDXH ;是否超出接收允许时间JB XH,DD2 ;等待电平变低JSSJ: ;信号确认,开始接收数据MOV R0,#30HZJ: ;接收一个字节数据MOV R2,#8WEI: ;位数据,分辩0和1JB T0ZD,DDXH ;是否超出接收允许时间JNB XH,WEI ;等待电平变高LCALL YS845MOV C,XH ;取位数据RRC ADD3:JB T0ZD,DDXH ;是否超出接收允许时间JB XH,DD3 ;等待电平变低,为1的高电平提供过度DJNZ R2,WEI ;8位数据是否接收完MOV R0,AINC R0CJNE R0,#34H,ZJ ;四字节数据是否接收完MOV A,33HCPL ACJNE A,32H,DDXH ;键值确认,解码MOV R4,A ;=这里已经取出键值,存在R4中= MOV R7,#100;TSY:MOV R6,#255 DJNZ R6,$ CPL BB DJNZ R7,TSYMOV A,#0CDH ;键值高位输出LCALL YJP_XZLMOV A,R4MOV B,#10HDIV ABMOVC A,A+DPTRLCALL YJP_XSJMOV A,#0CEH ;键值低位输出LCALL YJP_XZLMOV A,BMOVC A,A+DPTRLCALL YJP_XSJ ;LCALL DYBF ;调用灯控制子程序LJMP DDXH ;返还等待下一次信号 YS845: ;延时845微秒MOV R7,#255DJNZ R7,$MOV R7,#165DJNZ R7,$RETYS3MS: ;延时3msMOV R7,#8DDD:MOV R6,#255DJNZ R6,$DJNZ R7,DDDRETT0ZDCX: ;T0中断程序MOV TL0,#00HMOV TH0,#00HDJNZ R5,T0FHSETB T0ZDT0FH:RETI;=以下是多余部分=DYBF:MOV A,#0C0H ;用号码前高位输出LCALL YJP_XZLMOV A,30HMOV B,#10HDIV ABMOVC A,A+DPTRLCALL YJP_XSJMOV A,#0C1H ;用户码前低位输出LCALL YJP_XZLMOV A,BMOVC A,A+DPTRLCALL YJP_XSJ MOV A,#0C4H ;用户码后高位输出LCALL YJP_XZLMOV A,31HMOV B,#10HDIV ABMOVC A,A+DPTRLCALL YJP_XSJMOV A,#0C5H ;用户码后低位输出LCALL YJP_XZLMOV A,BMOVC A,A+DPTRLCALL YJP_XSJ;=此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例MOV A,R4CJNE A,#0CH,BA1 ;是否1号键按下CPL P1.0 ;点亮1号灯BA1:CJNE A,#18H,BA2 ;是否2号键按下CPL P1.1 ;点亮1号灯BA2:CJNE A,#5EH,BA3 ;是否3号键按下CPL P1.2 ;点亮1号灯BA3:CJNE A,#08H,BA4 ;是否4号键按下CPL P1.3 ;点亮1号灯BA4:CJNE A,#1CH,BA5 ;是否5号键按下CPL P1.4 ;点亮1号灯BA5:CJNE A,#5AH,BA6 ;是否6号键按下CPL P1.5 ;点亮1号灯BA6:CJNE A,#42H,BA7 ;是否7号键按下CPL P1.6 ;点亮1号灯BA7:CJNE A,#52H,BAB ;是否8号键按下CPL P1.7 ;点亮1号灯BAB:RET CSH:;=液晶初始化=MOV A, #00111000B ;8位数据,双行显示,5-7字型LCALL YJP_XZL ;调用写液晶指令MOV A, #00001100B ;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALL YJP_XZL ;调用写液晶指令MOV A, #00000110B ;光标右移一格,AC值加一,字符全部不动LCALL YJP_XZL ;调用写液晶指令MOV A,#81H ;LCALL YJP_XZLMOV A, #4CH ;L的ASCII码LCALL YJP_XSJMOV A,#83H ;LCALL YJP_XZLMOV A, #47H ;G的ASCII码LCALL YJP_XSJMOV A,#85H ;LCALL YJP_XZLMOV A, #58H ;X的ASCII码LCALL YJP_XSJMOV A,#88H ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#89H ;LCALL YJP_XZLMOV A, #68H ;h的ASCII码LCALL YJP_XSJMOV A,#8AH ;LCALL YJP_XZLMOV A, #69H ;i的ASCII码LCALL YJP_XSJMOV A,#8CH ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#8DH ;LCALL YJP_XZLMOV A, #61H ;a的ASCII码LCALL YJP_XSJMOV A,#8EH ;LCALL YJP_XZLMOV A, #6FH ;o的ASCII码LCALL YJP_XSJMOV A,#0C2H ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJMOV A,#0C6H ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJMOV A,#0CAH ;LCALL YJP_XZLMOV A, #4AH ;J的ASCII码LCALL YJP_XSJMOV A,#0CBH ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#0CCH ;LCALL YJP_XZLMOV A, #3AH ;:的ASCII码LCALL YJP_XSJMOV A,#0CFH ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJRET;=写指令到液晶=YJP_XZL:LCALL CHECK_BUSY;查询忙碌状态CLR ECLR RSCLR RWSETB EMOV P0,A;写指令CLR ERET;=写数据到液晶=YJP_XSJ:LCALL CHECK_BUSY;查询忙碌状态CLR ESETB RSCLR RWSETB EMOV P0,A;写数据CLR ERET;=查询忙碌标志=CHECK_BUSY:PUSH ACCBUSY_LOOP: CLR ESETB RWCLR RSSETB EMOV A,P0;读取状态JB p0.7,BUSY_LOOPPOP ACCLCALL DELRETDEL: MOV R6,#5L1: MOV R7,#248 DJNZ R7,$ DJNZ R6,L1 RETTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46HEND 中断加定时器-C语言版 优点:完全是状态解码,极少的占用系统软件资源(CPU),随时都可以解码,而不管系统此时运行到何处。 缺点:占用系统两个硬件资源,一个外部中断和一个定时器。/*六哥红外解码程序*/#includeSTC15Fxxxx.H/*/用户配置区:#define xi_tong_pl 12000000 /晶振频率设定 如你的系统晶振频率是12MHz,则写12000000 #define jan_zhi P1 /解码输出二进制端口,解码成功则从该端口输出键值的二进制sbit zhi_s = P55; /解码成功标志,解码成功一次该端口取反一次/外部中断#define zd_rkdz interrupt 0 /中断入口设置#define zd_cffs IT0 /中断触发方式设置#define zd_dk EX0 /中断打开设置/#define stc_dsqsz AUXR &= 0x7F;/定时器时钟12T模式,不需要可在AUXR.前加/*/*本程序使用外部中断加定时器来实现红外解码,占用系统软件资*源极少,硬件方面占用了一个外部中断,定时器中断还可以进行*一些简单的运用,软件部分可以做很多的动作,就看你发挥了!*/#define shi_jian_ (xi_tong_pl/12000000)/定时器设置,请勿更改unsigned char hwyhmh,hwyhml,hwjz,hwsj,hwjmws;/全局变量bit hwjmok,yxjm;/全局变量,红外解码OK,允许解码void main(void) EA=1; /总中断打开 zd_cffs=1; /外部中断_边沿触发方式 zd_dk=1; /外部中断_打开 ET0=1; /定时器中断打开 stc_dsqsz TMOD &= 0xF0;/设置定时器模式 TMOD |= 0x01;/设置定时器模式 while(1) if(hwjmok) hwjmok=0; jan_zhi=hwjz; zhi_s=zhi_s; /*- 定时器0中断子程序-*/void T0ZDCX(void) interrupt 1 using 3 yxjm=0; /未收到重复码清除解码允许标志 hwjz=0; TR0=0; /关闭定时器 /* 中断方式红外接收程序*/void ZDhwjsCX(void) zd_rkdz using 3unsigned int a=TH0*256+TL0; TL0=0; TH0=0; TR0=1; /开启T0 if(ashi_jian_*13000&ashi_jian_*11000&ashi_jian_*2000&a=1; hwsj|=0x80; else if (ashi_jian_*1000&a=1; else hwjmws=32; yxjm=0; /清除允许解码标志 TR0=0; /关闭T0 / switch(hwjmws) case 24: hwyhmh=hwsj; hwsj=0; break; case 16:hwyhml=hwsj; hwsj=0; break; case 8:hwjz=hwsj; hwsj=0; break; case 0:if(hwjz=hwsj) hwjmok=1; TL0=shi_jian_*12000%256; TH0=shi_jian_*12000/256; break; default:; else; 中断加定时器-汇编版;*;*六哥红外解码程序*;*/;*;*本程序使用外部中断加定时器来实现红外解码,占用系统软件资*;*源极少,硬件方面占用了一个外部中断,定时器中断还可以进行*;*一些简单的运用,软件部分可以做很多的动作,就看你发挥了!*;*/hwyhmh data 7fhhwyhml data 7ehhwjz data 7dhhwsj data 7chDSQ_ZDCS data 7bhZDCS DATA 7AHhwjmok bit 20h.0yxjm bit 20h.1hwjmwei bit 20h.2hwjmkg BIT 20H.3HWJST BIT P3.3ORG 0000HAJMP MAINORG 0013HLJMP WBZD1ORG 000BHLJMP DSQ_0ORG 0050HMAIN:SETB EASETB IT1SETB EX1SETB ET0MOV TMOD,#01HCLR hwjmkgCLR yxjmCLR hwjmokHHHH:JB hwjmok,jm_cg ;JBC:为1跳转并把该位清零,为0则顺序执行 ;此部分可写其他程序,不会影响接收LJMP HHHHjm_cg: ;这里写解码成功后的动作CLR hwjmokMOV P1,hwjzLJMP HHHH;=WBZD1:INC ZDCSMOV A,ZDCSJNB yxjm,ZD0_5 ;CLR TR0MOV TH0,#0FAH ;设置定时1400usMOV TL0,#70H ;SETB TR0 ;开定时器XCH A,hwsjMOV C,hwjmweiCLR hwjmweiRRC AXCH A,hwsjCJNE A,#10,ZD0_0 ;取出用户码高位MOV hwyhmh,hwsjAJMP ZD0_4ZD0_0:CJNE A,#18,ZD0_1 ;取出用户码低位MOV hwyhml,hwsjAJMP ZD0_4ZD0_1:CJNE A,#26,ZD0_2 ;取出键值MOV hwjz,hwsjAJMP ZD0_4ZD0_2:CJNE A,#34,ZD0_4 ;取出键值反码MOV A,hwsjCPL A CJNE A,hwjz,ZD0_3 ;键值判断SETB hwjmok ;解码正确,置位标志位ZD0_3: ;解码不成功CLR TR0 ;关闭定时器CLR hwjmkg ;关闭解码开关CLR yxjm ;清除允许解码标志MO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论