?? receive.c
字號:
/****************************************************************
*文件名: 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; //讀數據錯誤標志
uchar Buffer[2]; //緩沖區
uchar InfrBit; //從Infr口讀出的Bit
uchar InfrData; //從Infr口讀出的Byte
//---------------------------------
void KeyISR_Init(); //鍵盤中斷初始化
void PowerDown(); //完全掉電
void ReadBit(); //讀一位
void ReadByte(); //讀一字節
void ReadData(); //讀數據
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(); //讀數據
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(); //進入掉電狀態
}
}
//-------------------------------------------------------
//功能:完全掉電
//-------------------------------------------------------
void PowerDown()
{
PCONA=0xff; //所有功能模塊掉電
PCON=0x03; //進入掉電狀態
}
//-------------------------------------------------------
//功能:鍵盤中斷初始化
//-------------------------------------------------------
void KeyISR_Init()
{
KBMASK=0x10; //設置P04為中斷源
KBCON=0x00; //清除鍵盤中斷標志
EKBI=1; //使能鍵盤中斷
EA=1; //開中斷
}
//-------------------------------------------------------
//功能:讀幀頭
//-------------------------------------------------------
void ReadHead()
{
delay100us(4);
if(Infr!=0) //讀出接收口當前狀態,判斷是否與上次相同
{HeadFlag=1;} //若不同,置錯誤標志位
delay100us(1);
if(Infr!=0) //再次判斷
{HeadFlag=1;} //若不同,置錯誤標志位
delay100us(5);
delay100us(4);
if(Infr==0) //讀出接收口當前狀態,判斷是否與上次相同
{HeadFlag=1;} //若不同,置錯誤標志位
delay100us(1);
if(Infr==0) //再次判斷
{HeadFlag=1;} //若不同,置錯誤標志位
delay100us(5);
delay100us(4);
if(Infr!=0) //讀出接收口當前狀態,判斷是否與上次相同
{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);
}
//--------------------------------------------------------
//功能;字節讀取程序
//--------------------------------------------------------
void ReadByte() //將循環讀出的8位,按先高位后低位組合成一個字節
{
uchar i;
InfrData=0;
for(i=0;i<8;i++)
{
InfrData=InfrData<<1;
ReadBit();
InfrData=InfrData|InfrBit; //循環賦值
}
}
//--------------------------------------------------------
//功能:讀取所有的數據
//--------------------------------------------------------
void ReadData() //將數據區中的各個字節,全部讀出
{
uchar i;
for(i=0;i<2;i++)
{
ReadByte();
Buffer[i]=InfrData;
}
}
//--------------------------------------------------------
//功能:us級延時
//出口參數:i,延時us數
//--------------------------------------------------------
void delayus(uchar i) //粗略延時us
{
uchar j;
for(j=0;j<i;j++);
}
//--------------------------------------------------------
//功能:100us級延時
//出口參數: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級延時
//出口參數: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--;
}
}
//--------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -