由于我刚开始学红外的时候,什么都不懂,在网上到处找资料,可是在这些找到的资料中,很多都是没有用的,找到的程序,大多都是拷贝的某某公司提供的示例源程序,大多都是千篇一律,看过很多的百度提问,可是基本上都没有从根本上解决问题,也上过豆丁之类的,看看东西还要积分,我郁闷了,当时我就立志等我学会红外红一定做个红外的专题,免费的分享给大家,以方便苦苦探索的莘莘学子。 苦恼了好一阵后,幸好认识一位嵌入的大哥,给我了帮助,给我资料,功夫不负有心人,今天我终于学了红外的一些知识,为了谢谢帮助过我的大哥,我只能将他交给我的分享给大家,以此回报他,因此在这里将我所学到的免费的分享给大家,供大家交流学习。 至于程序,它是灵活多变,大家不要习惯性的CTRl+A,CTRL+C,要读懂它的意思,根据程序的思想,然后自己发挥,从而真正掌握它的原理。 大家如有疑问的可以和我交流,我的QQ:925171906,在此祝福所有在学习道路上孜孜不倦的可敬可佩的学子们,学业大成!对于经济窘迫的我来说,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;让更多的人来(更容易)了解红外,贡献自己的一点力 量。也希望大家有好资料的多分享一下,不要那么小气,还要什么积分什么的。 1硬件连接:P0口为数码管的段选段,P2口的高四位为数码管的位选端,红外接连在P3.2端,即连接在外部中断0处
2.主要功能:用数码管显示接收到的红外按键的键码 3.程序如下: //硬件连接 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2;//此表为 数码管的字模, 共阴数码管 0-9 - uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; uchar recieve[3];//储存用户码、用户反码与键数据码、键数据反码 uchar a[]={0,0,0,0}; void delay(uint i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void IRdelay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void display(uchar keyno) { uchar i,j; a[0]=keyno%10000/1000; a[1]=keyno%1000/100; a[2]=keyno%100/10; //十位 a[3]=keyno%10; //个位 j=0xfe; //对数码管进行逐位扫描显示 for(i=0; i<=3; i++) { j=_cror_(j,1); P2=j; P0 = table[a]; delay(50); } P0 = 0; } void IR_IN(void) interrupt 0 //外部中断0,即红外接收P3.2 { uchar j,k,count=0; EX0 = 0; //关闭外部中断0,即停止接收红外 IRdelay(5); if (hongwai==1) { EX0 =1; return; } //确认IR信号出现 while (!hongwai) //等IR变为高电平,跳过9ms的前导低电平信号。 { IRdelay(1); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (hongwai) //等 IR 变为低电平,跳过4.5ms的前导高电平 信号。 { IRdelay(1); } while (!hongwai) //等 IR 变为高电平 { IRdelay(1); } while (hongwai) //计算IR高电平时长 { IRdelay(1); count++; if (count>=30) { EX0=1; return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 recieve [j]= recieve [j] >> 1; //数据最高位补"0" if (count>=8) { recieve [j] = recieve [j] | 0x80; } //数据最高位补"1" count=0; }//end for k }//end for j if (recieve [2]!=~ recieve [3])//校验键值码与键值反码的值, { EX0=1; //如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号 return; } EX0 = 1; } void main() { EA=1;//开放全局中断 EX0=1;//开外部中断0 IT0=1;//触发方式为脉冲负边沿触发 hongwai=1; while(1) { //显示红外键码 display(recieve [2]); } } 2 主要功能:当遥控器上的数字键被按下时,让八个数码管同时显示按下的数字 硬件连接:P0口为数码管的段选段,P2口为数码管的位选端,默认位选端全部开放0x00,P3.2接红外接收头 程序如下: #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2; uchar code table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77, 0x7C,0x39,0x5E,0x79,0x71}; uchar recieve[3];//储存用户码、用户反码与键数据码、键数据反码 uchar a[]={0,0,0,0}; void IRdelay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void main() { EA=1;//开放全局中断 EX0=1;//开外部中断0 IT0=1;//触发方式为脉冲负边沿触发 hongwai=1; while(1) { P2=0x00; switch(recieve[2]) { case 22:P0=table[0];break;//不同的遥控器可能键值不一样,可以根据程序1测出键值,在修改case后面的值即可 case 12:P0=table[1];break; case 24:P0=table[2];break; case 94:P0=table[3];break; case 8:P0=table[4];break; case 28:P0=table[5];break; case 90:P0=table[6];break; case 66:P0=table[7];break; case 82:P0=table[8];break; case 74:P0=table[9];break; case 68:P2=0xff;P0=0x00;break; } } } void IR_IN(void) interrupt 0 //外部中断0,即红外接收P3.2 { uchar j,k,count=0; EX0 = 0; //关闭外部中断0,即停止接收红外 IRdelay(5); if (hongwai==1) { EX0 =1; return; } //确认红外信号出现 while (!hongwai) //等红外变为高电平,跳过9ms的前导低电平信号。 { IRdelay(1); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (hongwai) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 { IRdelay(1); } while (!hongwai) //等 IR 变为高电平 { IRdelay(1); } while (hongwai) //计算IR高电平时长 { IRdelay(1); count++; if (count>=30) { EX0=1;//高电平时间过长则开外部中断,并返回 return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 recieve[j]=recieve[j] >> 1; //各数据位右移一位,因为先读出的是高位数据 if (count>=8) //如果是高电平则将高位变为1,反之则为0,不做修改 { recieve[j] = recieve[j] | 0x80; } count=0; } } if (recieve[2]!=~recieve[3])//校验键值码与键值反码的值, { EX0=1; //如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号 return; } EX0 = 1; } 3.红外控制蜂鸣器,硬件连接很简单,P3.2接红外接收头,蜂鸣器接在P1.5端 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2; sbit beep=P1^5; uchar recieve[3];//储存用户码、用户反码与键数据码、键数据反码 uchar a[]={0,0,0,0}; void delay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void main() { EA=1;//开放全局中断 EX0=1;//开外部中断0 IT0=1;//触发方式为脉冲负边沿触发 hongwai=1; beep=1; while(1) { if(recieve[2]==69) { beep=~beep;recieve[2]=98; } } } void hongwaizhongduan(void) interrupt 0 //外部中断0,即红外接收P3.2 { uchar j,k,count=0; EX0 = 0; //关闭外部中断0,即停止接收红外 delay(5); if (hongwai==1) { EX0 =1; return; } //确认红外信号出现 while (!hongwai) //等红外变为高电平,跳过9ms的前导低电平信号。 { delay(1); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (hongwai) //等 红外 变为低电平,跳过4.5ms的前导高电平信号。 { delay(1); } while (!hongwai) //等 红外 变为高电平 { delay(1); } while (hongwai) //计算红外高电平时长 { delay(1); count++; if (count>=30) { EX0=1;//高电平时间过长则开外部中断,并返回 return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 recieve[j]=recieve[j] >> 1; //各数据位右移一位,因为先读出的是高位数据 if (count>=8) //如果是高电平则将高位变为1,反之则为0,不做修改 { recieve[j] = recieve[j] | 0x80;
…………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料下载:
红外线.rar
(2.53 MB, 下载次数: 108)
|