sanmaodeai 发表于 2018-5-31 21:33:04

航模接收机的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:20

看来也是玩航模的

sanmaodeai 发表于 2018-5-31 22:06:05

No.5 发表于 2018-5-31 22:01
看来也是玩航模的

买了一个蓝牙控制模块,想远程控制下,单片机很久没接触了,都还给老师了

sanmaodeai 发表于 2018-5-31 22:33:15

看了下,问题出现control函数里面,counter的值貌似无任何变化,为什么?timer1肯定是跑起来了,我在main函数中增加了ET1=1;

zhenke 发表于 2018-5-31 23:08:57

没仔细看你的程序。
不过你可以先试下:
volatile unsigned int counter = 0;

huike 发表于 2018-6-1 01:44:50

怎么觉得楼主的ID会,,,

vtte 发表于 2018-6-1 01:46:37

楼主你标题不合格

armok 发表于 2018-6-1 05:39:23

页: [1]
查看完整版本: 航模接收机的PWM信号异常,无法进入想要的程序