📄 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 + -