红外的一些小程序.doc
- 文档编号:337899
- 上传时间:2022-10-09
- 格式:DOC
- 页数:17
- 大小:33KB
红外的一些小程序.doc
《红外的一些小程序.doc》由会员分享,可在线阅读,更多相关《红外的一些小程序.doc(17页珍藏版)》请在冰豆网上搜索。
红外专题讲解
昵称:
一个人行走
制作日期:
2011-7-12
制作目的:
由于我刚开始学红外的时候,什么都不懂,在网上到处找资料,可是在这些找到的资料中,很多都是没有用的,找到的程序,大多都是拷贝的某某公司提供的示例源程序,大多都是千篇一律,看过很多的百度提问,可是基本上都没有从根本上解决问题,也上过豆丁之类的,看看东西还要积分,我郁闷了,当时我就立志等我学会红外红一定做个红外的专题,免费的分享给大家,以方便苦苦探索的莘莘学子。
苦恼了好一阵后,幸好认识一位嵌入的大哥,给我了帮助,给我资料,功夫不负有心人,今天我终于学了红外的一些知识,为了谢谢帮助过我的大哥,我只能将他交给我的分享给大家,以此回报他,因此在这里将我所学到的免费的分享给大家,供大家交流学习。
至于程序,它是灵活多变,大家不要习惯性的CTRl+A,CTRL+C,要读懂它的意思,根据程序的思想,然后自己发挥,从而真正掌握它的原理。
大家如有疑问的可以和我交流,我的QQ:
925171906,在此祝福所有在学习道路上孜孜不倦的可敬可佩的学子们,学业大成!
对于经济窘迫的我来说,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;让更多的人来(更容易)了解红外,贡献自己的一点力
量。
也希望大家有好资料的多分享一下,不要那么小气,还要什么积分什么的。
1硬件连接:
P0口为数码管的段选段,P2口的高四位为数码管的位选端,红外接连在P3.2端,即连接在外部中断0处
2.主要功能:
用数码管显示接收到的红外按键的键码
3.程序如下:
//硬件连接
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbithongwai=P3^2;//此表为数码管的字模,共阴数码管0-9-
uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
ucharrecieve[3];//储存用户码、用户反码与键数据码、键数据反码
uchara[]={0,0,0,0};
voiddelay(uinti)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
voidIRdelay(ucharx)//x*0.14MS
{
uchari;
while(x--)
{
for(i=0;i<13;i++);
}
}
voiddisplay(ucharkeyno)
{
uchari,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[i]];
delay(50);
}
P0=0;
}
voidIR_IN(void)interrupt0 //外部中断0,即红外接收P3.2
{
ucharj,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;
}//endfork
}//endforj
if(recieve[2]!
=~recieve[3])//校验键值码与键值反码的值,
{
EX0=1; //如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号
return;
}
EX0=1;
}
voidmain()
{
EA=1;//开放全局中断
EX0=1;//开外部中断0
IT0=1;//触发方式为脉冲负边沿触发
hongwai=1;
while
(1)
{
//显示红外键码
display(recieve[2]);
}
}
2主要功能:
当遥控器上的数字键被按下时,让八个数码管同时显示按下的数字
硬件连接:
P0口为数码管的段选段,P2口为数码管的位选端,默认位选端全部开放0x00,P3.2接红外接收头
程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbithongwai=P3^2;
uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,
0x7C,0x39,0x5E,0x79,0x71};
ucharrecieve[3];//储存用户码、用户反码与键数据码、键数据反码
uchara[]={0,0,0,0};
voidIRdelay(ucharx)//x*0.14MS
{
uchari;
while(x--)
{
for(i=0;i<13;i++);
}
}
voidmain()
{
EA=1;//开放全局中断
EX0=1;//开外部中断0
IT0=1;//触发方式为脉冲负边沿触发
hongwai=1;
while
(1)
{
P2=0x00;
switch(recieve[2])
{
case22:
P0=table[0];break;//不同的遥控器可能键值不一样,可以根据程序1测出键值,在修改case后面的值即可
case12:
P0=table[1];break;
case24:
P0=table[2];break;
case94:
P0=table[3];break;
case8:
P0=table[4];break;
case28:
P0=table[5];break;
case90:
P0=table[6];break;
case66:
P0=table[7];break;
case82:
P0=table[8];break;
case74:
P0=table[9];break;
case68:
P2=0xff;P0=0x00;break;
}
}
}
voidIR_IN(void)interrupt0 //外部中断0,即红外接收P3.2
{
ucharj,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)//如果是高电平
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外 一些 程序