




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一文教会你红外线遥控器软件解码程序红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。#include“at89x52.h”#defineNULL0x00//数据无效#defineRESET0X01//程序复位#defineREQUEST0X02//请求信号#defineACK0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号#defineNACK0x04//应答信号,表示接收数据错误#defineBUSY0x05//忙信号,表示正在忙#defineFREE0x06//空闲信号,表示处于空闲状态#defineREAD_IR0x0b//读取红外#defineSTORE_IR0x0c//保存数据#defineREAD_KEY0x0d//读取键值#defineRECEIVE0Xf400//接收缓冲开始地址#defineSEND0xfa00//发送缓冲开始地址#defineIR0x50//红外接收缓冲开始地址#defineHEAD0xaa//数据帧头#defineTAIL0x55//数据帧尾#defineSDAP1_7#defineSCLP1_6unsignedcharxdata*buf1;//接受数据缓冲unsignedintbuf1_length;//接收到的数据实际长度unsignedcharxdata*buf2;//发送数据缓冲unsignedintbuf2_length;//要发送的数据实际长度bitbuf1_flag;//接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bitbuf2_flag;//发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsignedcharstate1,state2;//用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsignedchardata*ir;union{unsignedchara[2];unsignedintb;unsignedchardata*p1[2];unsignedintdata*p2[2];unsignedcharxdata*p3;//红外缓冲的指针unsignedintxdata*p4;}p;//union{////unsignedchara[2];////unsignedintb;//unsignedchardata*p1[2];//unsignedintdata*p2[2];//unsignedcharxdata*p3;//unsignedintxdata*p4;//地址指针//}q;//union{unsignedchara[2];unsignedintb;}count;union{unsignedchara[2];unsignedintb;}temp;union{unsignedchara[4];unsignedintb[2];unsignedlongc;}ir_code;union{unsignedchara[4];unsignedintb[2];unsignedlongc;unsignedchardata*p1[4];unsignedintdata*p2[4];unsignedcharxdata*p3[2];unsignedintxdata*p4[2];}I;unsignedcharir_key;bitir_flag;//红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出voidsub(void);voiddelay(void);voidie_0(void);voidtf_0(void);voidie_1(void);voidtf_1(void);voidtf_2(void);voidread_ir(void);voidir_jiema(void);voidir_init(void);voidir_exit(void);voidstore_ir(void);voidread_key(void);voidreset_iIC(void);unsignedcharread_byte_ack_iic(void);unsignedcharread_byte_nack_iic(void);bitwrite_byte_iic(unsignedchara);voidsend_ack_iic(void);voidsend_nack_iic(void);bitreceive_ack_iic(void);voidstart_iic(void);voidstop_iic(void);voidwrite_key_data(unsignedchara);unsignedintread_key_data(unsignedchara);voidie0(void)interrupt0{ie_0();}voidtf0(void)interrupt1{tf_0();}voidie1(void)interrupt2{ie_1();}voidtf1(void)interrupt3{tf_1();tf_2();}voidtf2(void)interrupt5{//采用中断方式跟查询方式相结合的办法解码EA=0;//禁止中断if(TF2){//判断是否是溢出还是电平变化产生的中断TF2=0;//如果是溢出产生的中断则清除溢出位,重新开放中断退出EA=1;gotoend;}EXF2=0;//清除电平变化产生的中断位*ir=RCAP2H;//把捕捉的数保存起来ir++;*ir=RCAP2L;*ir++;F0=1;TR0=1;//开启计数器0loop:TL0=0;//将计数器0重新置为零TH0=0;while(!EXF2){//查询等待EXF2变为1if(TF0)gotoexit;//检查有没超时,如果超时则退出};EXF2=0;//将EXF2清零if(!TH0)//判断是否是长低电平脉冲过来了{//不是长低电平脉冲而是短低电平if(F0)count.b++;//短脉冲数加一temp.a[0]=RCAP2H;//将捕捉数临时存放起来temp.a[1]=RCAP2L;gotoloop;//返回继续查询}else{//是低电平脉冲,则进行处理F0=0;*ir=temp.a[0];//把连续的短脉冲总时间记录下来ir++;*ir=temp.a[1];ir++;*ir=RCAP2H;//把长电平脉冲时间记录下来ir++;*ir=RCAP2L;ir++;if(ir》=0xda){gotoexit;//判断是否溢出缓冲,如果溢出则失败退出}gotoloop;//返回继续查询}exit:ir_flag=1;//置ir_flag为1表示接收成功end:;}voidrs232(void)interrupt4{staticunsignedcharsbuf1,sbuf2,rsbuf1,rsbuf2;//sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节EA=0;//禁止中断if(RI){RI=0;//清除接收中断标志位sbuf1=SBUF;//将接收缓冲的字符复制到sbuf1if(sbuf1==HEAD){//判断是否帧开头state1=10;//是则把state赋值为10buf1=RECEIVE;//初始化接收地址}else{switch(state1){case10:sbuf2=sbuf1》》4;//把高半字节右移到的半字节sbuf2=~sbuf2;//把低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判断接收是否正确{//接收错误,有可能接收的是数据帧尾,也有可能是接收错误if(sbuf1==TAIL)//判断是否接收到数据帧尾{//是接收到数据帧尾buf1=RECEIVE;//初始化接收的地址if(*buf1==RESET)//判断是否为复位命令{ES=0;sbuf2=SP+1;for(p.p1[0]=SP-0x10;p.p1[0]《=sbuf2;p.p1[0]++)*p.p1[0]=0;}state1=0;//将接收状态标志置为零,接收下一个数据帧buf1_flag=1;//置接收标志为1,表示已经接收到一个数据帧REN=0;//禁止接收}else{//不是接受到数据帧尾,表明接收错误state1=0;//将接收状态标志置为零,重新接收buf1=RECEIVE;//初始化发送的地址*buf1=NACK;//把NACK信号存入接收缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}}else{//接收正确rsbuf1=~sbuf1;//按位取反,使高半字节变原码rsbuf1&=0xf0;//仅保留高半字节,低半字节去掉state1=20;//将状态标志置为20,准备接收低半字节}break;case20:sbuf2=sbuf1》》4;//把高半字节右移到的半字节sbuf2=~sbuf2;//将低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f))//判断接收是否正确{//接受错误state1=0;//将接收状态标志置为零,重新接收buf1=RECEIVE;//初始化接收的地址*buf1=NACK;//把NACK信号存入发送缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0;//禁止接收}else{sbuf1&=0x0f;//仅保留低半字节,去掉高半字节rsbuf1“=sbuf1;//高低半字节合并*buf1++=rsbuf1;//将接收的数据保存至接收缓冲里,并且数据指针加一buf1_length++;//接收数据长度加一state1=10;//将state1置为10,准备接收下个字节的高半字节}break;}}}else{TI=0;//清除发送中断标志if(buf2_length)//判断发送长度是否为零{//发送长度不为零if(state2==0)//判断是否发送高半字节{//发送高半字节sbuf2=*buf2;//将要发送的字节送到sbuf2rsbuf2=~sbuf2;//取反,使高半字节变为反码sbuf2》》=4;//将高半字节右移到低半字节rsbuf2&=0xf0;//保留高半字节,去掉低半字节sbuf2&=0x0f;//保留低半字节,去掉高半字节rsbuf2|=sbuf2;//合并高低半字节SBUF=rsbuf2;//发送出去state2=10;//将state2置为10准备发送下半字节}else{//发送低半字节sbuf2=*buf2;//将要发送的字节送到sbuf2buf2++;//指针加一buf2_length--;//发送数据长度减一rsbuf2=~sbuf2;//取反,使低半字节变为反码rsbuf2《《=4;//将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030智慧农业产业链供应链管理服务行业风险投资发展分析及投资融资策略研究报告
- 2025-2030智慧养老院行业市场分析报告及服务模式创新与行业投资机会研究报告
- 2025-2030智慧公共服务行业市场供需分析及投资评估规划分析研究报告
- 烟草行业技能考核热点题型解析
- 2025-2030智慧交通行业市场动态分析及前景趋势与投资布局研究报告
- 2025-2030智慧交通管理系统技术与投资趋势分析报告
- 2025-2030智慧交通产业市场潜力与发展机遇深度分析报告
- 2025-2030数据中心绿色节能技术应用与能效提升方案报告
- 2025-2030数字疗法产品临床验证标准制定研究报告
- 教师职称评审述职报告写作范例全集
- 中医五脏课件
- 7075铝合金焊接工艺
- 大学军事理论课教程第三章军事思想第一节军事思想概述
- 电商合伙人协议合同范本
- 流化床粉尘分级机持料量的控制
- 园艺设施的规划设计与建设
- 尿素水解器的检修标准
- 译林版二年级上册Project1-教案
- 志愿者志愿服务与志愿精神
- 龟虽寿课件-曹操
- 课题开题报告-教学设计教案
评论
0/150
提交评论