写一程序,用STC12C5A60S2读取红外编码值。以前在PIC上用定时器实现过。现用STC的捕获来实现,代码如下。 搞了好久就是不能读取红外编码。大家帮忙找一下原因。谢谢!!
捕获中断能进入,启始码也能读取。但读数据码1和0时,就很难测到,但多按几下遥控器也能运行到测试代码。我想问题就在这里,数据码不能完整读取,但程序上找不出问题。红外接收器用1838,在其电源脚和接地脚上接了一220微的电容。以前在PIC上测试时能正常工作。捕获端口用高阻输入模式和双向IO模式都一样。接上拉电阻试了也一样,估计硬件电路问题不大。
/*此处为晶振为11.0592M时的取值,如用其它频率的晶振时,要改变相应的取值。*/
unsigned int Imax=12902;//14ms
unsigned int Imin=5529;//6ms
unsigned int Inum1 =645;//0.7ms
unsigned int Inum2 =1474;//1.6ms
unsigned int Inum3 =2765;//3ms
void init()//初始化函数
{
P0M1=0;
P0M0=0; //设P0口设为推挽输出
P2M1=0;
P2M0=0xFF; //设P2口设为推挽输出
P1M1=0x08; //P1.3为输入
P1M0=0;
P1=0xff;
DU=0;//数码管段选
BZ=1;
WE3=1;//数码管位选
WE2=1;
WE1=1;
WE0=1;
SW0=1;// 按钮
SW1=1;
OUT=1;//继电器断开
CMOD=0x80;//PCA计数脉冲为系统时钟的12分频。
CCAPM0=0x11;//允许下降沿捕获,允许 CCON 中的 CCFn 触发中断
EA=1;
ET0=1;
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
IPH=0x80; //把PCA中断设为高优先级
IP=0x80;
}
void Rf_PCA0_Int(void) interrupt 7//遥控接收函数
{
if (CCF0==1)
{
tc=CCAP0H<<8+CCAP0L; //提取中断时间间隔时长。
// CCAP0H = 0x00;
//CCAP0L = 0x00;
CL = 0x00; //清PCA计数器
CH = 0x00;
CR=1; //启动计数器
CCF0=0;/*中断标志清零*/
if(rfif==0)
{
/*寻找启始码*/
if((tc>Imin)&&(tc<Imax))
{
m=0;
rfif=1; //测试代码在这里按遥控器能很快测试到,说明启始码能识别到。
}
}
/*找到启动码后,进入解码流程*/
if(rfif==1)
{
if((tc>Inum2)&&(tc<Inum3))
{
rf_buff[m/8]=rf_buff[m/8]>>1|0x80; m++;/*取码1,m除8取值*///
}
if((tc>Inum1)&&(tc<Inum2))
{
rf_buff[m/8]=rf_buff[m/8]>>1; m++;/*取码0*/ // 测试代码在这里按遥控器很难测试到,但多按两次也能测试到。说明问题取码可能存在问题。
}
/*取码完成后判断码是否正确*/
if(m==32)
{
m=0; rfif=0;
if((rf_buff[2]&rf_buff[3])==0)
{
rfok=1; //测试代码在这里按遥控器不能测试到
}
}
}
if(rfok==1)
{
rf_interpretation();//遥控键值解释
rfdataif(); //遥控判断函数
rfok=0;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
红外接收头是高增益运放,容易产生自激.
一周热门 更多>