|
/**************************************************************** *文件名: Receive.C *版權: www.zlgmcu.com *日期: 16:27 04-3-16 *功能: 多機紅外通信接收端程序代碼 ****************************************************************/ #include "reg932.h" #define uchar unsigned char sbit Infr=P0^4; //定義P0.4為紅外接收口 sbit Motor_Control=P0^5; //--------------------------------- uchar HeadFlag; //幀頭錯誤標志 uchar BitFlag; //讀數(shù)據(jù)錯誤標志 uchar Buffer[2]; //緩沖區(qū) uchar InfrBit; //從Infr口讀出的Bit uchar InfrData; //從Infr口讀出的Byte //--------------------------------- void KeyISR_Init(); //鍵盤中斷初始化 void PowerDown(); //完全掉電 void ReadBit(); //讀一位 void ReadByte(); //讀一字節(jié) void ReadData(); //讀數(shù)據(jù) void ReadHead(); //讀幀頭 void delayus(uchar i); //us級延時 void delay100us(uchar i); //100us級延時 void delayms(uchar i); //ms級延時 //--------------------------------- void KEY_ISR() interrupt 7 { EA=0; //關中斷 PCONA=0x00; //完全掉電喚醒 while(Infr==0); //等待Infr為1; delayms(5); while(Infr==1); //等待Infr為0; ReadHead(); //讀幀頭 ReadData(); //讀數(shù)據(jù) if(Buffer[0]==0x01) //如果讀出來的Buffer[0]為0x01,則開燈。 { Motor_Control=1; } /* if(Buffer[0]==0x02) //如果讀出來的Buffer[0]為0x02,則開燈。 { Motor_Control=1; } */ KBCON=0; //清鍵盤中斷標志位 EA=1; //開中斷 } //-------------------------------------------------------- main() { P0M1=0x00; P0M2=0x00; KeyISR_Init(); //鍵盤中斷初始化 while(1) { PowerDown(); //進入掉電狀態(tài) } } //------------------------------------------------------- //功能:完全掉電 //------------------------------------------------------- void PowerDown() { PCONA=0xff; //所有功能模塊掉電 PCON=0x03; //進入掉電狀態(tài) } //------------------------------------------------------- //功能:鍵盤中斷初始化 //------------------------------------------------------- void KeyISR_Init() { KBMASK=0x10; //設置P04為中斷源 KBCON=0x00; //清除鍵盤中斷標志 EKBI=1; //使能鍵盤中斷 EA=1; //開中斷 } //------------------------------------------------------- //功能:讀幀頭 //------------------------------------------------------- void ReadHead() { delay100us(4); if(Infr!=0) //讀出接收口當前狀態(tài),判斷是否與上次相同 {HeadFlag=1;} //若不同,置錯誤標志位 delay100us(1); if(Infr!=0) //再次判斷 {HeadFlag=1;} //若不同,置錯誤標志位 delay100us(5); delay100us(4); if(Infr==0) //讀出接收口當前狀態(tài),判斷是否與上次相同 {HeadFlag=1;} //若不同,置錯誤標志位 delay100us(1); if(Infr==0) //再次判斷 {HeadFlag=1;} //若不同,置錯誤標志位 delay100us(5); delay100us(4); if(Infr!=0) //讀出接收口當前狀態(tài),判斷是否與上次相同 {HeadFlag=1;} //若不同,置錯誤標志位 delay100us(1); if(Infr!=0) //再次判斷 {HeadFlag=1;} //若不同,置幀錯誤標志 delay100us(5); } //------------------------------------------------------- //功能:位讀取程序 //------------------------------------------------------- void ReadBit() { InfrBit=0; delay100us(1); InfrBit=Infr; //讀出Infr端口的當前值 delay100us(1); if(InfrBit!=Infr) //再次讀出Infr端口的當前值,判斷是否與上次相同 {BitFlag=1;} //若不同,則置位錯誤標志 delay100us(2); } //-------------------------------------------------------- //功能;字節(jié)讀取程序 //-------------------------------------------------------- void ReadByte() //將循環(huán)讀出的8位,按先高位后低位組合成一個字節(jié) { uchar i; InfrData=0; for(i=0;i<8;i++) { InfrData=InfrData<<1; ReadBit(); InfrData=InfrData|InfrBit; //循環(huán)賦值 } } //-------------------------------------------------------- //功能:讀取所有的數(shù)據(jù) //-------------------------------------------------------- void ReadData() //將數(shù)據(jù)區(qū)中的各個字節(jié),全部讀出 { uchar i; for(i=0;i<2;i++) { ReadByte(); Buffer[i]=InfrData; } } //-------------------------------------------------------- //功能:us級延時 //出口參數(shù):i,延時us數(shù) //-------------------------------------------------------- void delayus(uchar i) //粗略延時us { uchar j; for(j=0;j<i;j++); } //-------------------------------------------------------- //功能:100us級延時 //出口參數(shù):i,延時i x 100us //-------------------------------------------------------- void delay100us(uchar i) //在7.373MHz時,精確延時100us,誤差0.5us { uchar j; while(i>0) { for(j=0;j<118;j++); i--; } } //-------------------------------------------------------- //功能:ms級延時 //出口參數(shù):i,延時i x 1ms //-------------------------------------------------------- void delayms(uchar i) //在7.373MHz時,精確延時1ms,誤差0.5us { int j; while(i>0) { for(j=0;j<670;j++); i--; } } //--------------------------------------------------------
|