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

📄 fr-send-t0.c

📁 红外发射程序(38k).里面包涵二个文件.不同点只是发射电平的脉宽不同而以.单片机为9454
💻 C
字号:
//          *****************************
//          *****************************
//          **  广  东  海  利  集  团 **
//          **   I   C  技   术  部    **
//          **   FR-SEND-38K 主 程 序  ** 
//          *****************************

/*
利用T0产生38K频率做载波发送出编码信号
发送数据顺序为:'B'+原码(低位在先)+反码(低位在先)+'E';
*/

//----------------包涵文件------------------
#include "ioS3C9454.h"                                //包涵文件

//----------------系统设置------------------
__code  const  volatile  unsigned char SmartOption[4] @0x003c = {0x0,0x0,0x0b0,0x3};
//*************************************************************************


//----------------各变量定义------------------
unsigned char tem=0,tem10=0,tem100=0,tem1000=0;       //10ms时钟
unsigned char av_data=0;                              //要发送的值
unsigned char sycd=20;                                //声音长度
unsigned int  test=0;                                 //测试值

//----------------初始化程序------------------
void chushi(void)
{   
    BTCON   = 171;                                    //128分频 |=3清除计数器和分频器 BTCNT>=31.25即1ms
    CLKCON  = 0x18;                                   // CPU clock=0SC
    
    P0PND   = 0x0;                                    //P0/INT 关闭
    P0CONH  = 234;                                    //AD(电位器),OUT,OUT,OUT                  
    P0CONL  = 170;                                    //ALL OUT                
    P0      = 0x0; 
                                			
    P1CON   = 10;                                     //ALL OUT            
    P1=0;
   
    P2CONH  = 106;                                    //OUT,OUT(SPK),OUT(LED)
    P2CONL  = 34;                                     //IN(KEY),OUT,IN(控制相连),OUT(控制输出) |=1(即T0匹配输出)
    P2      = 0;
    
   
    PWMDATA = 0; 
    PWMCON  = 0;                                    
                          
    T0DATA  = 42;                                     //13.15us 相当于38k频率
    T0CON   = 200;                                    //TMR0 start count,f=fosc 无中断   |=8 清除计数值
    
    ADCON   = 115;                                    //启动AD7
}


//----------------红外发射------------------
//close_time为关闭t0匹配输出的时间(Unit:us)
//高电平为120us 'b'(12000),'1'(4800),'0'(2400),'e'(7200)
void T0_ctrol(char info)
{
unsigned int close_time;

if('b'==info || 'B'==info)
  close_time=12000;                             //1%
else if('1'==info)
  close_time=4800;                              //2.5%
else if('0'==info)
  close_time=2400;                              //5%
else if('e'==info || 'E'==info)
  close_time=7200;                              //1.6%

close_time=close_time/40;
//----------------------------------高电平发出
  P2      |=  1;                                //high
  P2CONL  |=  1;                                //产生PWM
        
  BTCON   |=  3; 
  while(BTCNT<=3);
//----------------------------------低电平发出
  P2CONL  &=  255-1;                            //停止PWM
  P2      &=  255-1;                            //low
  
  if(close_time>=255)
  {
    BTCON   |=  3;
    while(BTCNT<=253);                          //停止PWM 
  
    BTCON   |=  3;
    while(BTCNT<=close_time-253);               //停止PWM
  }
  else
  {
    BTCON   |=  3;
    while(BTCNT<=close_time);                   //停止PWM
  }
}


//----------------红外发射------------------
void ir_send(unsigned char data)
{
unsigned char i=0;
unsigned int  send_data=0;
  //----------------------------------计算原码和反码  低位为原码(反码在高8位)
  send_data = (~data);
  send_data <<= 8;
  send_data |=  data;
  
  //----------------------------------发'B'
  T0_ctrol('B');
  
  //----------------------------------再发送数据码(原码+反码 低位在先)
  for(i=0;i<16;i++)                                   //低位在先,先发原码再发反码
  {
    if(0x01==(send_data&0x01))
    {
       //----------------------------------发'1'
       T0_ctrol('1');
    }
    else
    {
       //----------------------------------发'0'
       T0_ctrol('0');
    }
    send_data   >>= 1;
  }
  
  //----------------------------------发'e'
  T0_ctrol('E');
}


//----------------键盘处理程序------------------
unsigned char keyys=0,keyok=0;
void jianpan(void)
{
  if(0==(P2&8)) 
  {
  keyys++;
    if((keyys>=10)&(keyok==0))
    {
      keyok = 1;
      keyys = 0;
      sycd  = 5;
      ir_send(test++);                                //发送测试码
      if(test>=256)
        test=0;
    }
  }
  
  if(0!=(P2&8))
  {
    keyok=0;
    keyys=0;
  }

}

//----------------声音处理程序------------------
void shenyin()
{
  if(sycd>0)
  {
    P2  |=  32;                                       //声音
    sycd--;
  }
  else
  {
    P2  &=  255-32;                                   //关闭声音
  }
}

//----------------AD转换程序------------------
void adzh(void)
{
      if(0!=(ADCON&8))
      {
        ADCON=115;
      }		                                      //如果转化完成,再启动下一次转换      
}

void get_av(void)
{
  if(ADDATAH<3)
  {
    if(av_data>=ADDATAH+3)
    {
      av_data=ADDATAH;
      ir_send(av_data);
    }
  }
  else if(ADDATAH>252)
  {
    if(av_data<=ADDATAH-3)
    {
      av_data=ADDATAH;
      ir_send(av_data);
    }
  }
  else                                                //得到ADC的值大于等于0+3而且小于等于255-3.
  {
    if(av_data>=ADDATAH+3 || av_data<=ADDATAH-3)
    {
      av_data=ADDATAH;
      ir_send(av_data);
    }
  }
}

//----------------主程序------------------
main()
{
//***填充系统SMART OPTION***/
unsigned char buffer = SmartOption[0];

chushi();

for(;;)
 {//主循环
 
  if(BTCNT>=25) tem+=1,BTCON|=3;
 
 //******************10ms
  if(tem10==1)tem10=0;
  if(tem>=10){tem10=1;tem=0;}
 //***********************
      if(tem10==1)
      //***********************************************************************<节拍程序>
      {//节拍10
            tem100+=1;
            if(tem100>=10)
            {//节拍100
            tem100=0;
                                  tem1000+=1;
                                  if(tem1000>=10)
                                  {//节拍1000
                                  tem1000=0;

                                  P2^=16;             //秒灯闪动显示                  
                                  }//节拍1000END              
            get_av();                      
            //100Ms
            }//节拍100END
      jianpan();
      shenyin();
      }//节拍10END
      adzh();      
 }//主循环
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -