#include<reg52.h> #include<intrins.h> #define uchar unsigned char//宏定義 #define uint unsigned int #define ulong unsigned long sbit sound=P2^3; //蜂鳴器 sbit IR=P1^2; //IR_DATA uchar dm,i,j,k; //IR_解碼用的變量 uchar aa[2]; //定義1個數組,用來存儲代碼,8位的數據碼和8位的數據反碼 ulong bb; //定義bb用來存放用戶識別碼,這里采用的是26位的用戶識別 uchar newdata; //IR收到新的數據提示主函數去處理 //0.9ms void delay0_9ms(void) { unsigned char j,k; for(j=18;j>0;j--) for(k=20;k>0;k--) ; } //1ms void delay1ms(void) { unsigned char i,j; for(i=2;i>0;i--) for(j=230;j>0;j--) ; } //4.5ms void delay4_5ms(void) { unsigned char i,j; for(i=10;i>0;i--) for(j=225;j>0;j--) ; } //100ms void delay100ms(void) { unsigned char i,j,k; for(i=200;i>0;i--) for(j=20;j>0;j--) for(k=10;k>0;k--) ; } IR_JM(unsigned char date) { switch(date) { case 0x01: {P0=0X00; break; } case 0x10: { break; } default: { break; } } } void main() { IT0=1; //外部中斷0觸發方式控制位,下降沿觸發 EX0=1; //外部中斷0(INT0)中斷允許位 EA=1; //總中斷 dm=0; while(newdata) { newdata=0; IR_JM(aa[0]); } } void t0(void) interrupt 0//外部中斷0的函數 { EA=0; //暫時關閉CPU的所有中斷請求 for(k=0;k<10;k++) //重復10次,目的是檢測在9毫秒內如果出現高電平就退出解碼程序 { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa delay0_9ms(); //延時0.9毫秒 if (IR==1) { k=10;break; } //延時0.9毫秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序 else if(k==9) //重復10次? { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb while(IR==0); //等待高電平避開9毫秒低電平引導脈沖 delay4_5ms(); //延時4.5毫秒避開4.5毫秒的結果碼 /******************************************** //26位的用戶碼,前13位數據碼,后13位數據反碼 *********************************************/ for(j=1;j<=26;j++)//每組數據為26位 { while(IR==0); // delay0_9ms(); if(IR==1) { delay1ms(); dm=dm|0x2000000; //因為是26位,一個"1",后面25個"0",轉化二進制即為"1000000" if(j<26) dm=dm>>1; //數據"1",右移一個"1",一共25次 } else if(j<26) dm=dm>>1; //數據"0",一共25次 } bb=dm; dm=0; /*************************************************** //16位的用戶碼,前8位數據碼,后8位數據反碼 ****************************************************/ for(i=0;i<2;i++) { for(j=1;j<=8;j++)//每組數據為8位 { while(IR==0); // delay0_9ms(); if(IR==1) { delay1ms(); dm=dm|0x80; if(j<8) dm=dm>>1; //數據"1",右移一個"1",一共7次 } else if(j<8) dm=dm>>1; //數據"0",一共7次 } aa[i]=dm; dm=0; } /*************************************************** //顯示部分 ****************************************************/ if(aa[0]==~aa[1]) //驗證成功 { sound=0; delay100ms(); sound=1; newdata=1; } } //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb } //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa EA=1; }