红外线无线通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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