標題: 紅外遙控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.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |