51红外的一些小程序.docx

上传人:b****5 文档编号:30685361 上传时间:2023-08-19 格式:DOCX 页数:13 大小:17.52KB
下载 相关 举报
51红外的一些小程序.docx_第1页
第1页 / 共13页
51红外的一些小程序.docx_第2页
第2页 / 共13页
51红外的一些小程序.docx_第3页
第3页 / 共13页
51红外的一些小程序.docx_第4页
第4页 / 共13页
51红外的一些小程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

51红外的一些小程序.docx

《51红外的一些小程序.docx》由会员分享,可在线阅读,更多相关《51红外的一些小程序.docx(13页珍藏版)》请在冰豆网上搜索。

51红外的一些小程序.docx

51红外的一些小程序

 

红外专题讲解

 

昵称:

一个人行走

 

制作日期:

2011-7-12

制作目的:

由于我刚开始学红外的时候,什么都不懂,在网上到处找资料,可是在这些找到的资料中,很多都是没有用的,找到的程序,大多都是拷贝的某某公司提供的示例源程序,大多都是千篇一律,看过很多的XX提问,可是基本上都没有从根本上解决问题,也上过豆丁之类的,看看东西还要积分,我郁闷了,当时我就立志等我学会红外红一定做个红外的专题,免费的分享给大家,以方便苦苦探索的莘莘学子。

苦恼了好一阵后,幸好认识一位嵌入的大哥,给我了帮助,给我资料,功夫不负有心人,今天我终于学了红外的一些知识,为了谢谢帮助过我的大哥,我只能将他交给我的分享给大家,以此回报他,因此在这里将我所学到的免费的分享给大家,供大家交流学习。

至于程序,它是灵活多变,大家不要习惯性的CTRl+A,CTRL+C,要读懂它的意思,根据程序的思想,然后自己发挥,从而真正掌握它的原理。

大家如有疑问的可以和我交流,我的QQ:

925171906,在此祝福所有在学习道路上孜孜不倦的可敬可佩的学子们,学业大成!

对于经济窘迫的我来说,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;让更多的人来(更容易)了解红外,贡献自己的一点力

量。

也希望大家有好资料的多分享一下,不要那么小气,还要什么积分什么的。

 

1硬件连接:

P0口为数码管的段选段,P2口的高四位为数码管的位选端,红外接连在P3.2端,即连接在外部中断0处

2.主要功能:

用数码管显示接收到的红外按键的键码

3.程序如下:

//硬件连接

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbithongwai=P3^2;//此表为数码管的字模,共阴数码管0-9-

ucharcodetable[]={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;

ucharcodetable[]={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)//如果是高电平则将高位变为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

#include

#defineucharunsignedchar

#defineuintunsignedint

sbithongwai=P3^2;

sbitbeep=P1^5;

ucharrecieve[3];//储存用户码、用户反码与键数据码、键数据反码

uchara[]={0,0,0,0};

voiddelay(ucharx)//x*0.14MS

{

uchari;

while(x--)

{

for(i=0;i<13;i++);

}

}

voidmain()

{

EA=1;//开放全局中断

EX0=1;//开外部中断0

IT0=1;//触发方式为脉冲负边沿触发

hongwai=1;

beep=1;

while

(1)

{

if(recieve[2]==69)

{

beep=~beep;recieve[2]=98;

}

}

}

voidhongwaizhongduan(void)interrupt0//外部中断0,即红外接收P3.2

{

ucharj,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;

}//数据最高位补"1"

count=0;

}

}

if(recieve[2]!

=~recieve[3])//校验键值码与键值反码的值,

{

EX0=1;//如果键值码与键值反码取反后相等,则开外部中断中断0,开始接收下一个红外信号

return;

}

EX0=1;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1