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