本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:20 编辑
#define YK_PORT P0M4
#define YK_PIN P0_4
CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
YK_PORT=0x62; // 上拉浮动输入有中断
void TIM0_Config(void)//定时器0初始化
{
T0_MAP = 0x12; //T0映射为P12口
TCON1 |= 0x01; //T0时钟1分频
TMOD = 0x01;
TH0 = 0;
TL0 = 0;
//TH0 = 0xFA;
// TL0 = 0xCB; //T0定时时间1ms
TF0=0; //清除T0中断标识
ET0=1;//使能T0中断
IP0|=0x08;//中断优先级二级最高,防止被其他中断打断造成及时不准
TR0=0;//先关闭定时器T0
}
void EXTINT4_Config(void) //P0.4外部中断初始化
{
EA = 0; //关总中断
PITS1 |= 0x01; //INT0下降沿
PINTE0|= 0x10; //允许中断int4端口
// IP4|=0x03; //INT2_7 中断优先级控制位 10为第二高等级中断
EX2_7=1;
EA = 1; //开总中断
}
//T0中断处理
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{
TR0=0;//关闭定时器T0
Ir_Status=0;
TF0=0; //清除T0中断标识
TH0 = 0;
TL0 = 0;
}
//处理外部中断P0.4
void INT4_Rpt() interrupt INT2_7_VECTORT0X12
{
Ir_Receive_Handle();
PINTF0&=~ 0x10; //清除P4中断标志位
}
//红外线接收处理
void Ir_Receive_Handle(void)
{
switch(Ir_Status)
{
case 0://第一个下降沿,定时器开始计数
Ir_Status=1;
TH0 = 0;
TL0 = 0;
TR0=1;
//Enable TIM2
//定时器计数值清零
break;
case 1://第二个下降沿,定时器关闭,读取定时器计数值
TR0=0;
Interval_tim=0;
Interval_tim=TH0;
Interval_tim=Interval_tim<<8;
Interval_tim=Interval_tim+TL0;
TH0 = 0;
TL0 = 0;
TR0=1;
// TIM2_Cmd(ENABLE); //Enable TIM2
if( (Interval_tim>=12500)&&(Interval_tim<=14500) )//判断引导码是否正确9+4.5ms
{
Ir_Status=2; //进入下一状态
}
else //引导码错误,从新接收
{
Ir_Status=0;
Ir_Receive_Count=0;
}
break;
case 2://开始32位数据的接收
TR0=0;
Interval_tim=0;
Interval_tim=TH0;
Interval_tim=Interval_tim<<8;
Interval_tim=Interval_tim+TL0;
TH0 = 0;
TL0 = 0;
TR0=1;
if( (Interval_tim>=1000)&&(Interval_tim<=1300) ) //间隔1.12ms ->0
{
Ir_Receive_Data=Ir_Receive_Data<<1;
Ir_Receive_Count++;
}
else if( (Interval_tim>=2000)&&(Interval_tim<=2600) ) //间隔2.25ms ->1
{
Ir_Receive_Data=Ir_Receive_Data<<1;
Ir_Receive_Data=Ir_Receive_Data|0x0001;
Ir_Receive_Count++;
}
else//不是0,1 接收错误,从新接收
{
Ir_Status=0;
Ir_Receive_Data=0;
Ir_Receive_Count=0;
}
//超出接收数据位数,接收下一个
while(Ir_Receive_Count>31)
{
Ir_receive_ok=1;//红外接收完成
Ir_Status=0;
Ir_Receive_Count=0;
break;
}
break;
default :
break;
}
}
现在这个TH0,TL0数据每次很大18500,没法进入下一步,此程序是在stm8s105上更改,之前换过网上多种方案中断技术方式,也是乱飞的计数值。有点郁闷,搞了好几天 完不成
求官方,高手帮忙,或者在HC0541上有实现的接收遥控器的代码或者准确实现T0定时数据1Us |