专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机的红外发送程序(Infineon--XC866)

作者:佚名   来源:本站原创   点击数:  更新时间:2010年11月14日   【字体:

   本程序适用于Infineon--XC866的单片机,载波为38KHZ,通过P3_0作为发送端口,其中:0由0.56m的高电平和0.56ms的低电平组成,1由0.56的高电平和1.68ms的电平组成。稍加修改可应用于C51。

发送程序如下:
 

//****************************************************************************
// @Module        Project Settings
// @Filename      MAIN.C
// @Project       20W.dav
//----------------------------------------------------------------------------
// @Controller    Infineon XC866-2FR
//
// @Compiler      Keil
//
// @Codegenerator 2.0
//
// @Description   This file contains the Project initialization function.
//
//----------------------------------------------------------------------------
// @Date          2010-11-4 15:54:56
//
//****************************************************************************

// USER CODE BEGIN (MAIN_General,1)

// USER CODE END

//****************************************************************************
// @Project Includes
// 完整代码下载地址:点这里
// 与本程序对应的红外接收程序代码:http://www.51hei.com/mcu/1096.html
//****************************************************************************

#include "MAIN.H"

// USER CODE BEGIN (MAIN_General,2)
#include<intrins.h>
#define uint  unsigned int   //宏定义
#define uchar unsigned char

#define  HWTx  P3_0     //位声明:红外发射管脚 
bit  HWTx_Out;      //红外发射管脚的状态
bit  Key_Flag,Flag;     //分别是:按键按下的标志位,定时器开始的标志位
uint Count,Set_Count;    //控制定时时间的变量
uchar Table_Tx[4]={0x40,0,0,0};//待发送的缓冲区
uchar HWTx_Code,HWTx_data;
// USER CODE END


//****************************************************************************
// @Macros
//****************************************************************************

// USER CODE BEGIN (MAIN_General,3)

// USER CODE END


//****************************************************************************
// @Defines
//****************************************************************************

// USER CODE BEGIN (MAIN_General,4)

// USER CODE END


//****************************************************************************
// @Typedefs
//****************************************************************************

// USER CODE BEGIN (MAIN_General,5)

// USER CODE END


//****************************************************************************
// @Imported Global Variables
//****************************************************************************

// USER CODE BEGIN (MAIN_General,6)

// USER CODE END


//****************************************************************************
// @Global Variables
//****************************************************************************

// USER CODE BEGIN (MAIN_General,7)

// USER CODE END


//****************************************************************************
// @External Prototypes
//****************************************************************************


// USER CODE BEGIN (MAIN_General,8)

// USER CODE END


//****************************************************************************
// @Prototypes Of Local Functions
//****************************************************************************

// USER CODE BEGIN (MAIN_General,9)

// USER CODE END


//****************************************************************************
// @Function      void MAIN_vInit(void) 
//
//----------------------------------------------------------------------------
// @Description   This function initializes the microcontroller. It is 
//                assumed that the SFRs are in their reset state.
//
//----------------------------------------------------------------------------
// @Returnvalue   None
//
//----------------------------------------------------------------------------
// @Parameters    None
//
//----------------------------------------------------------------------------
// @Date          2010-11-4
//
//****************************************************************************

// USER CODE BEGIN (MAIN_Init,1)

// USER CODE END

void MAIN_vInit(void)
{
  // USER CODE BEGIN (MAIN_Init,2)

  // USER CODE END

  ///  -----------------------------------------------------------------------
  ///  Configuration of the System Clock:
  ///  -----------------------------------------------------------------------
  ///  - On Chip Osc is Selected
  ///  - PLL Mode, NDIV = 2
  ///  - input frequency is 10 MHz

 

  ///  *********************************************************************************
  ///  Note : All peripheral related IO configurations are done in the 
  ///  respective peripheral modules (alternate functions selection)
  ///  *********************************************************************************


  ///  Initialization of module 'GPIO'
  IO_vInit();

  //   Interrupt Priority

  IP            =  0x00;         // load Interrupt Priority Register
  IPH           =  0x00;         // load Interrupt Priority High Register
  IP1           =  0x00;         // load Interrupt Priority 1 Register
  IPH1          =  0x00;         // load Interrupt Priority 1 High Register


  // USER CODE BEGIN (MAIN_Init,3)

  // USER CODE END

  //   globally enable interrupts
  EA            =  1;           

} //  End of function MAIN_vInit


//****************************************************************************
// @Function      void main(void) 
//
//----------------------------------------------------------------------------
// @Description   This is the main function.
//
//----------------------------------------------------------------------------
// @Returnvalue   None
//
//----------------------------------------------------------------------------
// @Parameters    None
//
//----------------------------------------------------------------------------
// @Date          2010-11-4
//
//****************************************************************************

// USER CODE BEGIN (MAIN_Main,1)
void delay(uint z) //延时时间约为 1ms*X  晶振为12M
{
   uint x=0,y=0;
        for(x=z;x>0;x--)
             for(y=54;y>0;y--);
}

void Key_Scan()
{
         uchar Key_Temp=0,i=0;
         if(P3_1!=1)
   {
      delay(10);
      if(P3_1!=1)
      { 
         while(!P3_1);
              Key_Flag=1; 
                        for(i=1;i<4;i++)
                        Table_Tx[i]=i+0xaa;
                 }
        } 
}

void Send_Code8()
{
         uchar i=0;   //循环变量
         for(i=0;i<8;i++) //8位数据,顾循环8次
        {
                 Set_Count=0x002b;//准备发送长达0.56ms(13*43=560us)的方波
                 Flag=1;    //置标志位(通过该标志位控制高低电平的转换),

                                   因为高电平器件,38K的波形不会改变
      Count=0;  //清零,准备计数
      TR0=1;   //启动定时器
      while(Count<Set_Count); //定时0.56ms,先发送0.56ms的高电平
      TR0=0;    //关闭定时器

      if(HWTx_Code&0x01) //判断待发送的数据的最低位为1或0,
      {       //将决定低电平时间的长短,便于接收装置的接收
        Set_Count=130; //如果是1,则产生1.69ms(13*130=1690us)的低电平
      }
      else
      {
         Set_Count=43; //如果是0,则产生0.56ms(13*43=560us)的低电平
      }

      Flag=0;    //用于产生低电平的标志位
      Count=0;   //清零,准备计数
      TR0=1;    //启动定时器
      while(Count<Set_Count);//产生长达对应时间的低电平
      TR0=0;       //关闭定时器

      HWTx_Code=HWTx_Code>>1;//右移一位,准备发送  
   }
}


void Send_Code()
{
   uchar i=0;

        Set_Count=690;//准备产生9ms(13*690=9000)的高电平 
        Flag=1;    //置标志位,取反(该标志位控制高低电平的转换)
        Count=0;   //定时器计数
        TR0=1;    //启动定时器
        while(Count<Set_Count);//定时9ms,产生9ms的高电平
        TR0=0;   //关闭定时器

        Set_Count=340;//准备产生4.5ms(13*340=4500)的低电平
        Flag=0;    //置位,取反(该标志位控制高低电平的转换)
   Count=0;   //清零,准备计数
        TR0=1;    //启动定时器T0
        while(Count<Set_Count); //产生4.5ms的低电平
        TR0=0;

        for(i=0;i<4;i++) //发送缓冲区里的数据
        {
                HWTx_Code=Table_Tx[i]; //赋值,等待发送
                Send_Code8();    //发送
        }

        Set_Count=43;//准备产生4.5ms(13*340=4500)的低电平
        Flag=1;    //置位,取反(该标志位控制高低电平的转换)
        Count=0;   //清零,准备计数
        TR0=1;    //启动定时器T0
        while(Count<Set_Count); //产生4.5ms的低电平
        TR0=0;

        HWTx=1;   //置发射引脚的状态为高电平
   delay(23);//延时23ms

        Set_Count=690; //准备产生9.12ms的低电平,作为结束标志
        Flag=1;
        Count=0;
        TR0=1;
         while(Count<Set_Count);//产生时间长达9.12ms的低电平
         TR0=0;       //关闭定时器

         Set_Count=340;//准备产生4.5ms的高电平,作为结束标志
         Flag=0;
         Count=0;
         TR0=1;
         while(Count<Set_Count);
         TR0=0;

         HWTx=1;    //输出引脚拉高
}

void init_timer0()
{
         EA=1;
         TMOD=0x02;//工作在方式2,8位自动重装模式
         ET0=1;    //开分控
         TH0=0x52; //定时时间为13us,晶振12M
         TL0=0x52;
}
// USER CODE END

void main(void)
{
  // USER CODE BEGIN (MAIN_Main,2)

  // USER CODE END

       MAIN_vInit();

  // USER CODE BEGIN (MAIN_Main,3)
       init_timer0(); //定时器T0的初始化函数
       Count=0;    //定时器计数值清零
       Flag=0;     //高低电平变化标志位
       HWTx_Out=1;    //发射引脚的状态
  // USER CODE END

  while(1)
  {

  // USER CODE BEGIN (MAIN_Main,4)
           Key_Scan();    //按键扫描函数
          if(Key_Flag==1)   //按键按下的标志,是否置位
    {
       Send_Code(); //发送数据
       delay(100);  //延时5s
       Key_Flag=0;  //按键按下标志位清零
          }
  // USER CODE END

    }

} //  End of function main


// USER CODE BEGIN (MAIN_General,10)
void timer0() interrupt 1 //定时器T0
{
          Count++;   //变量计数,可得出进入T0的次数,便可得出定时时间
          if(Flag==1)
         {
                  HWTx_Out=~HWTx_Out;  //取反,不断输出周期为26us的方波
         }
        else
        {
      HWTx_Out=0;  //这里决定在接受程序,是以高电平还是低电平作为

                                          判断1  和0的依据
        }
        HWTx=HWTx_Out;  
}
// USER CODE END

 
关闭窗口

相关文章