标题: 红外遥控led 双机通信发射接收程序 [打印本页]
作者: Tinasliver 时间: 2018-10-18 22:15
标题: 红外遥控led 双机通信发射接收程序
附录一 发射器程序
#include <at89c51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
# define _BV(bit) (1<<(bit))
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit k4=P2^3;
sbit k5=P2^4;
sbit k6=P2^5;
sbit k7=P2^6;
sbit k8=P2^7;
sbit out=P3^7;
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char Flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
uchar t=16;
uchar CODE=0Xff;
void delay_LCM(uint); //LCD延时子程序
/*********延时K*1ms,12.000mhz**********/
void delay_LCM(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++)
{;}
}
}
void key()
{
if(k1==0)// 开
{
delay_LCM(5);
if(k1==0)
{
SendIRdata(1);
P0=1;
while(k1==0);
}
}
if(k2==0)// 开
{
delay_LCM(5);
if(k2==0)
{
SendIRdata(2);
P0=2;
while(k2==0);
}
}
if(k3==0)// 开
{
delay_LCM(5);
if(k3==0)
{
SendIRdata(3);
P0=3;
while(k3==0);
}
}
if(k4==0)// 开
{
delay_LCM(5);
if(k4==0)
{
SendIRdata(4);
P0=4;
while(k4==0);
}
}
if(k5==0)// 开
{
delay_LCM(5);
if(k5==0)
{
SendIRdata(5);
P0=5;
while(k5==0);
}
}
if(k6==0)// 开
{
delay_LCM(5);
if(k6==0)
{
SendIRdata(6);
P0=6;
while(k6==0);
}
}
if(k7==0)// 开
{
delay_LCM(5);
if(k7==0)
{
SendIRdata(7);
P0=7;
while(k7==0);
}
}
if(k8==0)// 开
{
delay_LCM(5);
if(k8==0)
{
SendIRdata(8);
P0=8;
while(k8==0);
}
}
} //定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xe6; //设定时值为38K 也就是每隔26us中断一次
count++;
} //定时器1中断处理
void time1(void) interrupt 3
{
out=!out;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata; //发送9ms的起始码
endcount=74;
Flag=1;
count=0;
out=0;
TR1=1;
do{}while(count<endcount);
TR1=0;
out=1; //发送4.5ms的结果码
//endcount=117;
//Flag=0;
//count=0;
//out=1;
//do{}while(count<endcount);
endcount=25;
Flag=1;
count=0;
out=1; //TR1=1;
do{}while(count<endcount); //发送八位数据
//irdata=~p_irdata;
for(i=0;i<irdata;i++)
{
endcount=25;
Flag=1;
count=0;
out=0;
TR1=1;
do{}while(count<endcount);
TR1=0;
out=1;
endcount=25;
Flag=1;
count=0;
out=1;
//TR1=1;
do{}while(count<endcount);
}
}
main()
{
count = 0;
Flag = 0;
OP = 0;
out = 1;
EA = 1; //允许CPU中断
TMOD = 0x21; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
P1=0xff;
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
TH1 = 256-13;
TL1 = 256-13; //设定时值0为38K 也就是每隔26us中断一次
ET1 = 1; //定时器1中断允许
//TR1 = 1;
//定时器1中断允许
iraddr1=0x00;
iraddr2=0x00;
while(1)
{
key();
//P2=CODE=P1;
//delay_LCM(100);
//SendIRdata(CODE);
}
}
附录二 接收器程序
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码
uchar CodeTemp; //编码字节缓存变量
uchar i,j,k; //延时用的循环变量
uchar dat=0;
uchar num;
uint time;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
sbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)
void delay(uint z);
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{uchar i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2
{
EX0=0;
P3_0=!P3_0;
num=0;
for(k=0;k<4;k++)
{
Delay0_9ms();
if (IRsignal==1) //如果0.9ms后IRsignal=1,说明不是引导码
{
k=4;
break; //P0=0XFF;
}
else if(k==2) //如果持续了3×0.9ms=9ms的低电平,说明是引导码
{
//P0=0;
time=0;
num=0;
while(IRsignal==0);
//if(IRsignal==0)
// num+=1;
// P1=num;
// while(IRsignal==0);
while(time<100)
{
time++;
Delay0_9ms(); //跳过持续1ms的高电平
Delay0_9ms(); //跳过持续1ms的高电平
if(IRsignal==0)
{
P0=num;
num+=1;
//P1=num;
}
while(IRsignal==0);
}
if(num==1)
led1=!led1;
if(num==2)
led2=!led2;
if(num==3)
led3=!led3;
if(num==4)
led4=!led4;
if(num==5)
led5=!led5;
if(num==6)
led6=!led6;
if(num==7)
led7=!led7;
if(num==8)
led8=!led8;
break;
// delay(2);
}
}
EX0=1;
}
void init()// 定时器初始化
{
TMOD=0x11;
EA=1;
IT0=1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1; //外部中断INT0开, (1:开, 0:关 )
CodeTemp=0; //初始化红外编码字节缓存变量
}
main()
{
init();
while(1)
{
}
}
作者: admin 时间: 2018-10-18 23:53
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |