红外遥控编程参考(单片机读取按键编码)
- 格式:doc
- 大小:29.00 KB
- 文档页数:9
程序可以用来查看每个遥控按键的编码,以便于开发利用遥控每一个按键。
#include
#define uchar unsigned char
#define uint unsigned int
sbit en=P3^4;
sbit rs=P3^5; //用于控制1602
sbit rw=P3^6;
sbit dula=P2^6;
sbit wela=P2^7; //用于控制晶体管
sbit IRIN=P3^2; //红外接收器数据线IO 口
uchar IRCOM[4]=0;
//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码
//IRCOM[1] 高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
uchar code table[]="MAKE BY HEIQISHI"; uchar code table1[]="The code is 0x";
uchar code table2[]="0123456789abcdef";
//////////////显示程序///////////////////
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}
void Write_com(uchar com)
{
rs=0; //指令
P0=com; //写指令函数
delay(5);
en=1;
delay(5);
en=0;
}
void Write_data(uchar dat)
{
rs=1; //数据
P0=dat; //写指令函数
delay(5);
en=1;
delay(5);
en=0;
}
void _1602Init()
{
wela=0;
dula=0; //用于关闭晶体管,因为都是用P0
en=0; //初始时使能为0
rw=0;
Write_com(0x38); //显示屏模式设置为1602方案
Write_com(0x0c); //显示开关/光标设置
Write_com(0x06);
Write_com(0x01); //清屏
Write_com(0x80); //指针置零
}
/////////////////////////////////////////////////////
/////////////////解码程序///////////////////
void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS
{
uchar i;
while(x--)
{
for(i=0;i<15;i++) //13
;
}
}
//////////////初始化////////////
void IR_init(void)
{
EA=1;
EX0=1; //允许总中断中断,使能INT0 外部中断
IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化
}
////////////解码过程//////////////
void IR_CODE(void) interrupt 0 //在外部中断子程序中解码
{
uchar j,k,N=0,shi,ge;
EX0=0; //防止干扰
delay014ms(15); //延时2.1ms
if (IRIN) //2.1ms能够检测出各种错误信号
{
EX0 =1;
return;
} //确认IR信号出现while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
delay014ms(18); //2.25ms~4.5ms之间能够检测出引导码信号
if(!IRIN)
{
EX0 =1;
return;
}
//////高电平后开始检测高电平持续的时间以确定是0还是1/////
for(j=0;j<4;j++) //收集四组数据{
for(k=0;k<8;k++) //每组数据有8位
{
while (IRIN); //等IR 变为低电平,跳过4.5ms的前导高电平信号。
//引导码检验结束
while (!IRIN); //等IR 变为高电平开始检测
while (IRIN) //计算IR高电平时长
{
delay014ms(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms计数过长自动离开
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
if (N>=8)
{
IRCOM[j] = IRCOM[j] | 0x80;
} //数据最高位补"1"
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败
{
IRCOM[4]=0;
EX0=1;