微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8051单片机红外线遥控实验

8051单片机红外线遥控实验

时间:11-30 来源:互联网 点击:


如果网页显示格式错乱可从这里下载完整的源程序:http://www.51hei.com/f/dpjjmhw.rar

//遥控器采用Ht6221芯片

//红外线遥控 用外部中断作为红外线解码输入 红外遥控器1号键为电风扇启动键

#include

#define uchar unsigned char
#define uint unsigned int
code uchar seg[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; //数码管码表
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位选

code uchar ss[]={0x10,0x03,0x01,0x06,0x09,0x1d,0x1f,0x0d,0x19,0x1b,0x11,0x15,0x17,0x12,0x16,0x4c,0x40,0x48,0x04,0x00,
0x02,0x05,0x54,0x4d,0x0a,0x1e,0x0e,0x1a,0x1c,0x14,0x0f,0x0c}; //红外线键码1--32

void delay(uint k)
{
while(k--);
}

void show(uint k) //显示数值
{
uchar i=0,j;
uchar s[4]; //显示最终位数
do
{
s[i++]=k%10; //数据分离

}while(k/=10);

for(j=0;j{
P0=seg[s[j]];
P2=~(1<(3-j));
delay(100);
P0=0xff;
P2=0xff;
}

}

uchar buf[4]; //存放解码结果
sbit out=P3^2; //红外线发射点
sbit fan=P1^0; //电扇控制位

void time0_init()
{
TMOD|=0x01; //设置定时器0方式
TH0=0;
TL0=0;
TR0=0;
ET0=0;
}

uint low_test() //测低电平时间
{
uint t;
TR0=1; //启动定时器
while((out==0)&&(TH0&0x80)==0) //低电平时间不超时最多9ms
{
if(TH0&0x80)break; // 超时结束
}
TR0=0; //关闭定时器
t=TH0;
t<=8;
t|=TL0;
TH0=0; //定时器清零
TL0=0;
return t;
}

uint high_test() //测高电平时间
{
uint t;
TR0=1; //启动定时器
while((out==1)&&(TH0&0x80)==0) //低电平时间不超时最多9ms
{
if(TH0&0x80)break; // 超时结束
}
TR0=0; //关闭定时器
t=TH0;
t<=8;
t|=TL0;
TH0=0;
TL0=0;
return t;
}

uchar get_byte() //红外线接受先接受低位数据后接受高位数据
{
uint t;
uchar i,dat;
for(i=0;i<8;i++)
{
t=low_test();
t=high_test();
dat>>=1;
if((t>1400)&&(t<1700))
{
dat|=0x80;
}
}
return dat;
}

void decode() //红外线解码
{
uint t;
if(out==0) //表示接受到红外线信号
{
t=low_test();
if((t>8000)&&(t<8500)) //低电平时间在9ms左右
{
t=high_test();
if((t>4000)&&(t<4500))//高电平时间在4.5ms左右
{
buf[0]=get_byte(); // 获取解码值
buf[1]=get_byte();
buf[2]=get_byte();
buf[3]=get_byte();
if(buf[2]==~buf[3]) //键码校验
;
again:
t=low_test();
t=high_test();
if((t-2500)<500) //测停止位时间
{
goto again;
}
}
}
}
}

void int0()//外部中断0设定
{
EA=1;
IT0=1; //外部中断下降沿触发
EX0=1; //外部中断0开启
}

void int0_exe() interrupt 0 //外部中断函数
{
decode();
}

uchar panduan() //键码按键数判断
{
uchar i;
for(i=0;i<32;i++)
{
if(buf[2]==ss[i])break;

}
return i+1;

}

void main()
{
uchar start;
time0_init();
int0();
P1=0xff;
while(1)
{
show(panduan());
start=panduan();
if(start==1)
{
fan=0; //电扇启动
}
else
fan=1; //电扇关闭
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top