红外线无线通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/***************************

*红外线无线通信从左往右按键码0~9 按键编码16 0c 18 5e 08 1c 5a 42 52 4a

**************************************/

#include

#define uchar unsigned char

#define uint unsigned int

sbit IRIN = P3^2; //红外接收器数据线

sbit led0=P0^0;

sbit led1=P0^1;

sbit led2=P0^2;

sbit led3=P0^3;

sbit led4=P0^4;

sbit led5=P0^5;

sbit led6=P0^6;

sbit led7=P0^7;

uchar IRCOM[4];

void timer0init();

uchar i;

int a;

void IRdelay(char x);

void Display(unsigned char FirstBit,unsigned char Num);

unsigned char code dofly_DuanMa[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char code dofly_WeiMa[]={0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码

unsigned char TempData[8]; //存储显示值的全局变量

#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换

#define SegPort P2 // 位锁存

void Ir_work();

/*******************************************************************/ void IRInit()

{

EA=1; //允许总中断中断

EX0=1; //使能INT0 外部中断打开中断允许位

IT0=1; //触发方式为脉冲负边沿触发

IRIN=1; //I/O口初始化

}

void delay(uint n)

{

uint i,j;

for(i=0;i

for(j=0;j<110;j++);

}

/**********************************************************/

void timer0init(void)//定时器0初始化

{

TMOD=0x02;

TH0=0;

TL0=0;

EA=1;

ET0=1;

TR0=1;

}

void main()

{timer0init();

IRInit();

while(1)

{

}

}

void IR_IN(void) interrupt 0 //外部中断0

{

unsigned char j,k,N=0;

EX0 = 0; //关闭T0

IRdelay(15);

if (IRIN==1)

{ EX0 =1;

return;

}

//确认IR信号出现

while (!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。while(IRIN); //等IR变为低电平,跳过4,5ms的高电平信号。

for (j=0;j<4;j++) //收集四组数据32位

{

for (k=0;k<8;k++) //每组数据有8位

{

while (!IRIN); //等IR 变为高电平

while (IRIN) //计算IR高电平时长

{

IRdelay(1);

N++;

if (N>=30)

{ EX0=1;

return;}//0.14ms计数过长自动离开。

}//高电平计数完毕

IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”

if (N>=8)

{IRCOM[j] = IRCOM[j] | 0x80;}//数据最高位补“1”

N=0;

}

}

if (IRCOM[2]!=~IRCOM[3]) //检测用户码与用户反码是否相同

{ EX0=1;

return;

}

EX0 = 1;

}

void time_0() interrupt 1

{

TH0=0;

TL0=0;

Display();

}

/**********************************************************/

void IRdelay(unsigned char x) //x*0.1MS

{

unsigned char i;

while(x--)

{

for (i = 0; i<11; i++)

{}

}

}

void Display(unsigned char FirstBit,unsigned char Num)

{

// 0 1 2 3 4 5 6 7 8 9 按键数字

// 16 0c 18 5e 08 1c 5a 42 52 4a 按键码

//

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1 数码管编码

// 0 1 2 3 4 5 6 7 8 9 a b c d e f

switch (dofly_DuanMa[IRCOM[2]/16]){

case 0x06:if(dofly_DuanMa[IRCOM[2]%16]==0x7d){led0=0;} //0 按键按的是几0~7

相关文档
最新文档