如果网页显示格式错乱可从这里下载完整的源程序:http://www.ruidan.com/f/dpjjmhw.rar //遥控器采用Ht6221芯片 //红外线遥控 用外部中断作为红外线解码输入 红外遥控器1号键为电风扇启动键 #include <reg51.h> #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<i;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; //电扇关闭
}
}
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。
自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。