资讯详情

8051单片机红外线遥控实验

如果网页显示格式错乱可从这里下载完整的源程序: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种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台