⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive.c

📁 一个单片机驱动红外通信的程序,很有意义.当然你也可以举一反三,用作无线通信,也可以仿照该程序做蓝牙通信协议
💻 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 + -