七、STC15W手扫开关

/*       
浏览器用兼容模式浏览代码
1、二脚红外发射管,接法:管子正极正电源,管子负极接102电阻再接到单片机引脚,由单片机来控制电源关断

2、三脚38K红外接收管,接法:管子正极接电源,管子负极接单片机引脚,管子接收脚接单片机引脚,由单片机控制电源关断
3、原理:采用PCA口发送38K脉冲,每次发送3ms,关闭3ms,在发送期间才判断是否有接收,间隔1秒以上才触发
*/
#define    D_38K    (MAIN_Fosc/38000/2) 
void PCA_Init()
{
    
    CCON=0;   //初始化PCA控制寄存器
              //PCA timer stop running    PCA定时器停止
              //clr CF flag    清CF标志
              //clear all module interrupt flag
          //CR=0   运行控制位
    CL=0;     //reset PCA base timer 复位PCA寄存器
    CH=0;
    CMOD=0X08; //PCA时钟源 Fosc/2 ECF为0.禁止CF中断
    PPCA=1;
    PCA_USE_P34P35P36P37();
    Value=D_38K;          
  //    PCA_PWM1=0X00;//PCA模块1工作于8位PWM  此时的EPC1L=0 EPC1H=0分别与CCAP1L CCAP1H组成9位数 P850页 对PWM 8位有影响
   CCAP1L=Value;        //CH CL小于 CCAP1H,CCAP1L时,输出为低
   CCAP1H=Value>>8;        //
   CCAPM1=0X4d;             //PCA模块1为16位定时器模式,同时反转CCP1 使能PCA中断 输出高速脉冲            
   CR=0;                 //PCA timer stop run    1时启动
   P_IR_TX=1;          //发射管的负极,1时关断
}

void main( )
{     
    u16 cnt;
    PCA_Init();
    GPIO_Inilize();
//    Exti_Inilize();
    Timer0_Inilize(); //定时1ms
    EA=1;
    IR_G=0;   //接收管的负极,接通电源
    RED1=0;
    TR0=1;
    CR=0;
    while(1)
    {
        if(B_1ms)
        {
            B_1ms=0;
            if(++ircnt>3)  //3ms关闭和输出
            {
              CR=~CR;      //启动或关闭PCA
                ircnt=0;
            } 
if(CR==0) handcnt=0; else
if(CR&&++cnt>200) // 开启输出时,且距上一次有效值1秒以上 { if(IR==0) { if(++handcnt>2) { RED1=~RED1; handcnt=0; cnt=0; //检测到后,间隔1秒后再检测 } } } else handcnt=0; } } } /********************* Timer0中断函数************************/ void timer0_int (void) interrupt TIMER0_VECTOR { TF0=0; B_1ms=1; }
/******************************************
    PCA中断 
******************************************/
void PCA_ISR() interrupt 7 using 1
{
    CCF1=0; //CLEAR FLAG
            
    Value+=D_38K;    
    CCAP1L=Value;
    CCAP1H=Value>>8;
    
}
 

 

 
posted @ 2022-06-17 11:27  来去勿扰  阅读(585)  评论(0)    收藏  举报