51单片机红外接收解码程序(详细解析)(共8页).doc
精选优质文档-倾情为你奉上51单片机红外接收解码程序接收以S52单片机作为接收系统。以S52的P3.3口作为接收端口,该端口是外部中断1。这个接受程序是以XC866作为红外发送控制系统,接收程序如下:#include<reg52.h> /头文件#include<intrins.h>#define uchar unsigned char /宏定义#define uint unsigned intsbit HWRx=P33; /位声明code uchar Table= /共阴数码管 0-9 a-f - 表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40;uchar Table_Data8=0,0,0,0,0,0,0,0;/用于显示的数组uchar Table_Rx67;/用于存储判断接收是1或0的参数void Delay();/延时子函数void Display(uchar *lp,uchar lc)/显示 uchar i; /定义变量 P2=0; /端口2为输出,关闭 P1=P1&0xF8; /将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0;i<lc;i+) /循环显示,采用动态扫描 P2=Tablelpi; /查表法得到要显示数字的数码段 if(lpi>0x7f) P2+=0x80; Delay(); /延时 P2=0; /清0端口,准备显示下位 if(i=7) /检测显示完8位否,完成直接退出,不让P1口再加1, 否则进位影响到第四位数据 break; P1+; /点亮下一位数码管 void main() /主函数 EA=1; /首先开启总中断 EX1=1; /开启外部中断 1 IT1=1; /设置成下降沿触发方式 while(1) /一直显示,其它由中断处理 Display(Table_Data,8); void Delay() /延时时间大约为31us,晶振12M uchar i=13; while(i) i-;void Delay_ms(uint z) /延时时间约为 1ms*X 晶振为12M uint x=0,y=0; for(x=z;x>0;x-) for(y=54;y>0;y-);void hongwai() interrupt 2 /外部中断 1 ,INT1(P33)连接红外线接收IC数据脚 uchar i,j,tmp; EX1=0; /关闭中断 j=33; /传送一组数包括引导码1位,4个八位数据,总共33位 i=0; /从第一维数组开始 Delay_ms(10); if(HWRx) /然后再检测红线接收脚是有数据招收,有继续,没有则退出 EX1=1; return; while(j-) /循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平 时间常数,只接低电平常数就 /可以判断1或0了,在这里我们都接收,还有一点要知道, 接收波形是反向,在没有接收时端口为高电平 tmp=0; Table_Rxi=1; /时间量从1开始 while(!HWRx) /检测高低电平的变化,这里检测的是高电平 Table_Rxi+; /没变继续加1 Delay(); /家一个延时防止,计数值一下子就加满了 tmp+; /加1 if(tmp=250) break; i+; tmp=0; Table_Rxi=1; /时间量从1开始 while(HWRx) /检测高低电平的变化,这里检测的是低电平 Table_Rxi+; /没变继续加1 Delay(); /同上 tmp+; /加1,用于判断是1还是0的,低电平来了 if(tmp=250) break; i+; P1=0xf8; i=200; /加入循环延时,抗干扰 while(i) /在有接收数据的时候显示一个H tmp=255; while(tmp) tmp-; P2=0x76; i-; tmp=0; for(i=3;i<19;i+,i+) /处理发送的数据 tmp>>=1; /右移一位,接收低位在前 if(Table_Rxi>30) /检测低电平时间超过30就确认为1 tmp+=0x80; Table_Data0=tmp/16; /分开2位以16进制显示,用显示发送的数据 Table_Data1=tmp%16; tmp=0; for(i=19;i<35;i+,i+) /同上 tmp>>=1; if(Table_Rxi>30) tmp+=0x80; Table_Data2=tmp/16; Table_Data3=tmp%16; tmp=0; for(i=35;i<51;i+,i+) tmp>>=1; if(Table_Rxi>30) tmp+=0x80; Table_Data4=tmp/16; Table_Data5=tmp%16; tmp=0; for(i=51;i<67;i+,i+) tmp>>=1; if(Table_Rxi>30) tmp+=0x80; Table_Data6=tmp/16; Table_Data7=tmp%16; EX1=1; /刚进中断时关闭了分控,现在要打开 专心-专注-专业