- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
extern uint key,kr;//key和kr都是键值,但kr是红外码二进制转换过来的,而key是处理过的键值变成如1,2,3
uchar pdata a[I*10],b[40],c[12]={0,128,64,32,16,8,4,2,1,0,0,0};
uchar code hwc[]={104,48,24,122,16,56,90,66,74,82,152,176,224,168,144};
void ini_hw()//中断初始化
硬件上,把接收头的put接单片机的外部中断的P3^2上。
下面是.h文件
#ifndef _hwcl_h_//红外处理,用于处理红外键值
#define _hwcl_h_
#include<STC12C5A60S2.H>
#include<intrins.h>
#define I 10
sbit js=P3^2;
{
EA=1;
EX0=1;
TCON=0x01;
}
void scan()interrupt 0
{
uint i,ti,lo,t=0;
uchar user=0,datai=0;
signal=1;
EX0=0;
for(lo=0;lo<36;lo++)
{
ti=0;
do
{
t=0;
js=1;
while(js)
{
t++;
{
b[lo]=a[i];
}
signal=0;
}
if(signal)
{
if(a[i]==0)
{
datai=0;
user++;
}
if(a[i]==1)
{
user=0;
datai++;
}
}
}
for(i=1,t=0;i<=8;i++)
{
t=t+c[b[i-1]*i];
}
key=t;
kr=key;
}
for(i=0;i<15;i++)
if(signal)
{
if(t<=7)
a[lo]=0;
else if(t>7&&t<=20)
a[lo]=1;
else
a[lo]=2;
}
}
if(signal)
{
lo=0;
user=0;datai=0;
for(i=0;i<36;i++)
{
if(user==0&&datai==8)
{
for(;datai;lo++,datai--,i++)
{
if(key==hwc[i])
key=i;
}
if(t!=0)
signal=1;
EX0=1;
}
_nop_();
for(i=0;i<80;i++)
_nop_();
if(t==255)
{ห้องสมุดไป่ตู้
if(lo==0)
signal=0;
break;
}
if(!signal)
break;
}
if(t==255)
ti++;
if(ti==3)
break;
}while(t==255||t==0);
if(!signal)
break;
本程序只适用于本图所显示的遥控器以及stc12c5a60s2的单片机并且晶振是11.0592M的:
使用方法:
软件上将下列.c和.h加入c51工程,在主程序运行前加入红外初始化ini_hw()函数,然后运行程序的时候,如果signal=1,代表接收到按下的按键,用完后注意清零。读key就是红外按键的值(1,2,3······代表按键依次的按键值),读kr就是按键的键值。
extern uint signal;//当按键检测到时,signal值是1
extern uchar pdata b[40];
extern void ini_hw();
#endif
下面是.c文件
#include"hwcl.h"//红外处理,用于处理红外键值
uint signal;
uint key=0,kr=0;