2019-07-16 04:01发布
lstcspring 发表于 2012-11-4 13:31 基于HX1838(HS0038)与STC10F04单片机的红外遥控器的读码程序) //此程序在硬件上测试通过,要弄懂的话就 ...
最多设置5个标签!
//此程序可以将读到的键值,地址码通过串口发送到计算机,上位机可用串口调试助手查看。
///C51的红外解码程序,可以根据需要自己修改:
//2009年9月18日 徐学军作
////////////////////////////
//11.0592Mhz
#include<reg51.h>
//根据自己的接线来改
sbit IRIN = P3^2; //红外接收器数据线
sbit led = P3^7; //指示灯
////////////////////////////////////////////
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0] 低8位地址码
//IRCOM[1] 高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
/////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
uchar IRCOM[4]=0;
bit flag=0;
bit flagcom=0; //串口发送标志
/********************/
void delay014ms(unsigned char x); //x*0.14MS
void IR_init(void);
void delay014ms(unsigned char x) //x*0.14MS STC10F04延时约0.15MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<125; i++) //13
{;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
EA=1;
EX0=1; //允许总中断中断,使能 INT0 外部中断
IT0=1; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
//////////
//解码过程
//////////////
void IR_CODE(void) interrupt 0 //在外部中断子程序中解码
{
unsigned char j,k,N=0;
EX0 = 0;
delay014ms(15);
if (IRIN==1)
{ EX0 =1;
return;
} //确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay014ms(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay014ms(1);}
while (!IRIN) //等 IR 变为高电平
{delay014ms(1);}
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;
return;
}
flagcom = 1; //正确解码后,置串口发送标志
flag = !flag;//pro();//解码成功后运行的程序
EX0=1;
return;
}
//主程序
void main(void)
{
unsigned char k;
IR_init( ); //初始化外部中断0
SCON=0x50; //串口 方式 1
TMOD=0x20; //T1 方式 1
TL1=0xfd; //波特率 9600 的常数
TH1=0xfd;
TR1=1; //开定时器1
flag = 0;
while(1)
{
led=flag;
if(flagcom)
{
flagcom = 0;
for(k=0;k<4;k++)
{
SBUF=IRCOM[k]; //串口输出键盘输入的值
while(TI==0); //是否发送完毕
TI=0;
}
}
}
}
谢谢了
一周热门 更多>