航模接收机的PWM信号异常,无法进入想要的程序
本帖最后由 sanmaodeai 于 2018-6-1 17:52 编辑大概程序是这样的,单片机接收到航模接收机的PWM信号,对信号进行分析,如果信号值在1.5ms~2.5ms之间,并且持续值小于300ms,就触发led点亮,如果持续值大于300ms小于2s,LED1点亮,但是调试出来还是有问题
#include"STC15Fxxxx.h"
#include"intrins.h"
void timer0init();
void timer1init();
void check();
void control();
unsigned int a = 0;
unsigned int flag = 0;
unsigned int counter = 0;
sbit led = P1^0;
sbit led1 = P1^5;
void main()
{
EA=1;
INT0 = 1; //外部中断1 置位
EX0 =1;
IT0 =0; //双边触发
flag=0;
timer0init(); //初始化定时器
timer1init();
while(1)
{
check();
control();
}
}
void timer0init(void)
{
AUXR = 0x0E;
TMOD &= 0xF0;
TL0 = 0x00; //default number
TH0 = 0x00; //default number
TF0 = 0; //clear TF0 flag
TR0 = 0; //start timer0
}
void timer1init(void) //1ms@12.000MHz
{
AUXR |= 0x40; //?????1T??
TMOD &= 0x0F; //???????
TL1 = 0x20; //??????
TH1 = 0xD1; //??????
TF1 = 0; //??TF1??
TR1 = 0; //???1????
}
void ext0(void) interrupt 0 //外部中断函数
{
if(INT0==1) //上升沿触发
{
TR0=1; //开定时器1
}
if(INT0==0) //下降沿触发
{
TR0 = 0; //关定时器
a= TH0; //将定时器0值赋值到a
a=a*256+TL0;
TL0=0x00; //定时器0初值初始化
TH0=0x00;
}
}
void timer1() interrupt 3
{
counter++; //定时器1累加
}
void check()
{
if( a>1500 && a < 2500)
{
TR1=1;
ET1=1;
flag =1;
}
else
{
TR1=0;
ET1=0;
flag =0;
}
}
void control()
{
if(flag ==0)
{
if(counter<300 && counter > 0)
{
led = 0;
counter = 0;
}
else if(counter>300 && counter < 2000)
{
led1 =0;
counter =0;
}
else
{
counter = 0;
}
}
else
{
led = 1;
led1 = 1;
}
}
问题肯定是check和control两个函数,但是分析下来又不知道哪里有问题,希望旁观者能帮我解析解析
check函数的主要作用是检测a的值如果在1500-2500之间,那开启定时器1,并且将标志位flag置1,如果不在这个区间里面,关闭定时器1,并且将标志位清0
control函数首先检测标志位,如果是0,查看counter值区间是多少,然后对应不同的led亮,这个应该没有问题吧,但是就是出不来?是不是哪里逻辑不对?
看来也是玩航模的 No.5 发表于 2018-5-31 22:01
看来也是玩航模的
买了一个蓝牙控制模块,想远程控制下,单片机很久没接触了,都还给老师了 看了下,问题出现control函数里面,counter的值貌似无任何变化,为什么?timer1肯定是跑起来了,我在main函数中增加了ET1=1; 没仔细看你的程序。
不过你可以先试下:
volatile unsigned int counter = 0; 怎么觉得楼主的ID会,,, 楼主你标题不合格
页:
[1]