/*
浏览器用兼容模式浏览代码
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;
}