1、完整word)基于51单片机红外发射与接收C程序
基于51单片机红外发射与接收程序
实验证明,效果非常好。
红外发射程序
#include
2、1; void init()//初始化作用 { key1=1; key2=1; key3=1; } void delay(uchar aa) { uchar bb,cc; for(bb=aa;bb>0;bb-—) for(cc=200;cc>0;cc—-); } void delayms(uchar aa)//延时程序 { for(a=aa;a〉0;a—-) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_
3、 } } void khz(uchar aa)//是发射38KHZ的程序 { for(a=aa;a>0;a-—) //这个for语句可以得到准确的26。3波特率 { out=0; i=7; //低了17us while(i>0)i-—; // 38kHZ out=1; //高了9us 17+9=26us 比26.3快一点点 } } //khz(116);//3.028ms 精确的时间 //khz(64);//2.006ms //khz(40); //1.052ms
4、 //delayms(125);//2.012ms 这里是一些时间的介绍 //delayms(65);//1。054ms //delayms(93);//1.5ms void fashu(uchar num) { khz(116);//发射3ms 38khz delayms(125); for(num1=8;num1>0;num1--) //原来用的是a 后来出错,肯定在这里! { khz(40); if(num&0x01) delayms(93);//delay 1。5ms else delayms(65);//de
5、lay 1ms num=num〉>1; } khz(20); } void tishi() { LED=0; delay(50); LED=1; delay(50); LED=0; delay(50); LED=1; } void keyscan()//按键扫描 { if(key1==0) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); if(key1==0) { while(!key1);
6、 fashu(0xf3); tishi(); } } if(key2==0) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); if(key2==0) { while(!key2); fashu(0x3f); tishi(); } } if(key3==0) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop
7、);
if(key3==0)
{
while(!key3);
fashu(0xf5);
tishi();
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
红外接收程序
#include〈reg51。h>
#include
8、1^2; sbit in=P3^2; uchar i,a,num; bit fleg; void init() { fleg=1; in=1; EA=1; EX0=1; IT0=1; } void delayms(uchar aa) { for(i=aa;i>0;i—-) { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); } } void main() { init(); //delayms(45);//0.642ms //delayms(35);//0。502ms
9、 //delayms(115);//1.623ms //delayms(72);//1。02ms //delayms(84);//1.188ms //delayms(31);//0.446ms while(1); } void sieasdf() interrupt 0 { EX0=0; for(a=5;a〉0;a-—) { delayms(35);//延时0。5ms 判断5次 5*0。5=2.5ms if(in)fleg=0; } if(fleg) { delayms(72);//延时1ms 判断是不是高电平了 i
10、f(in) { delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据 delayms(118);//若偏移一位,可以去掉。 for(a=8;a〉0;a——) { while(!in); delayms(86);//延时1。188ms 判断IO高低,从而得0或1 num=num〉〉1; if(in) { num=num|0x80; delayms(31);//延时0。6ms 因为上面延时1。2ms+0。6 刚好跳过1。5ms } } P2=num; } } fleg=1; EX0=1; }






