您的位置:首页单片机其他单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

多机红外通信接收端(C程序代码)

[日期:2007-12-30 ] [来源:周立功 作者:] [字体: (投递新闻)

/****************************************************************
*文件名: 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--;
 }
}
//--------------------------------------------------------

阅读:
录入:admin

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐