附录一 发射器程序 #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) { } }
|