基于51单片机红外发射与接收C程序

发布时间:2018-06-27 22:10:00   来源:文档文库   
字号:

基于51单片机红外发射与接收程序

实验证明,效果非常好。

红外发射程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit key1=P3^3;

sbit key2=P3^4;

sbit key3=P3^5;

sbit LED=P1^0; //发射指示灯

sbit out=P3^7;

uchar i,a,num1;

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_();

}

}

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

//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);//delay 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);

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_();

if(key3==0)

{

while(!key3);

fashu(0xf5);

tishi();

}

}

}

void main()

{

init();

while(1)

{

keyscan();

}

}

红外接收程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

sbit led2=P1^1;

sbit led3=P1^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

//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.52.5ms

if(in)fleg=0;

}

if(fleg)

{

delayms(72);//延时1ms 判断是不是高电平了

if(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高低,从而得01

num=num>>1;

if(in)

{

num=num|0x80;

delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms

}

}

P2=num;

}

}

fleg=1;

EX0=1;

}

本文来源:https://www.2haoxitong.net/k/doc/41d8425077232f60ddcca1b6.html

《基于51单片机红外发射与接收C程序.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式