求助-51单片机-PWM-蓝牙控制-小车电机调速问题

2020-01-24 12:03发布

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit YF  = P1^0;
sbit YZ  = P1^1;
sbit ZZ  = P1^2;
sbit ZF  = P1^3;
bit flag1,flag2,temp;

void right();
void left();
void speed();
void slow();
void start();
void stop();
//void back();

uchar dat,ZKB1,ZKB2;

void init()
{
        TMOD = 0x21;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ET0 = 1;
        TR0 = 1;
        ES = 1;
//        IP = 0x10;
        SCON =0x50;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA  = 1;
        TR1 = 1;
        ET1 = 1;
        flag1 = flag2 = 0;
        ZZ = ZF = YZ = YF = 0;
}
void main()
{
        init();
        while(1)
        {

        }
}

void start()
{ZKB1 = 50;ZKB2 = 50;}

void stop()
{ZKB1 = 0; ZKB2 = 0; }

void speed()
{
        ZKB1 += 10;
        ZKB2 += 10;
        if(ZKB1 >= 100){ZKB1 = 100;}
        if(ZKB2 >= 100){ZKB2 = 100;}
}

void slow()
{
        ZKB1 -= 10;
        ZKB2 -= 10;
        if(ZKB1 <= 0){ZKB1 = 0;}
        if(ZKB2 <= 0){ZKB2 = 0;}
}

void left()
{
        if(!flag1){ZKB1 = ZKB1 - 30;ZKB2 = ZKB2 + 20;flag1 = ~flag1;}
        if(flag1) {ZKB1 = ZKB1 + 30;ZKB2 = ZKB2 - 20;flag1 = ~flag1;}       
}

void right()
{
        if(!flag2){ZKB2 = ZKB2 - 30;ZKB1 = ZKB1 + 20;flag2 = ~flag2;}
        if(flag2) {ZKB2 = ZKB2 + 30;ZKB1 = ZKB1 - 20;flag2 = ~flag2;}       
}

void uart_ISR() interrupt 4
{
        RI = 0;
        dat = SBUF;       
                switch(dat)
                {
                        case 0xAA: speed();break;
                        case 0xBB: slow();break;
        //                case 0xCC: back();break;
                        case 0xDD: left();break;
                        case 0xEE: right();break;               
                        case 0xFF: start();break;
                        default :  stop();break;
                }
}

void timer0() interrupt 1
{
        static uchar count = 0;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ++count;
        if(count > 100){count = 0;}

        if(count < ZKB1)
                ZZ = 1;
        else ZZ = 0;               
        if(count < ZKB2)
                YZ = 1;
        else YZ = 0;

}

我是用蓝牙串口通信控制51单片机小车的电机调速。
现在的问题是,先发送0XFF,执行Start()后,两个占空比都设置为50,再发送一个字节的0XAA后,ZKB1与ZKB2不是变为 60 60 小车效果是直接速度变为最大,无法实现调速。
Start() 后再按slow() 同样无法减速,只是占空比变高了一点。

感觉程序就这么点了,还是无法看出自己的问题,请大家帮我看下我到底哪里出了问题了 = =!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
weijia
1楼-- · 2020-01-24 17:22
帮你顶一下,免得沉下去。我讲一下,也许不对。你确定你按发射后,只执行一次吗?要是被执行了多次呢?还有那个slow的uchar变量怎么会小于0?
weijia
2楼-- · 2020-01-24 19:06
再看了半天,你这个方案,为什么不直接用蓝牙送两个电机的速度量,上位机想改就改,控制还方便。
LTREE
3楼-- · 2020-01-25 00:19
weijia 发表于 2014-3-18 01:55
再看了半天,你这个方案,为什么不直接用蓝牙送两个电机的速度量,上位机想改就改,控制还方便。 ...

感谢回复~~      
发送数据时,可以看到电脑串口助手  一次发出的是一个字节的数据。
我是想用上位机的几个按键实现小车的前进   加速  减速   左转  右转  后退等方向控制。

您说直接用蓝牙发送速度值来控制吗,怎么样做呀。我是想通过蓝牙发送数据改变占空比(ZKB1 ZKB2)来间接地改变小车的速度。  
LTREE
4楼-- · 2020-01-25 03:00
weijia 发表于 2014-3-18 01:47
帮你顶一下,免得沉下去。我讲一下,也许不对。你确定你按发射后,只执行一次吗?要是被执行了多次呢?还有那 ...

uchar 这个地方是我编写错误没有注意,感谢提醒

一个小问题哈,这里
void slow()
{
        ZKB1 -= 10;
        ZKB2 -= 10;
        if(ZKB1 <= 0){ZKB1 = 0;}
        if(ZKB2 <= 0){ZKB2 = 0;}
}
如果ZKB1 ZKB2减到0后,再执行一次就会出错吧,程序会怎么处理呢。  
weijia
5楼-- · 2020-01-25 08:27
 精彩回答 2  元偷偷看……
weijia
6楼-- · 2020-01-25 10:05
LTREE 发表于 2014-3-18 10:18
感谢回复~~      
发送数据时,可以看到电脑串口助手  一次发出的是一个字节的数据。
我是想用上位机的 ...

我就是说 你可以 让上位机 直接送 ZKB1 ZKB2 两个数啊,这些什么前后左右的,都在上位机实现,不还方便操作一些。

大概下面这个意思。上位机把ZKB1处理一下, ZKB1 |=0x80; 这样就没有什么 其它的指令了。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit YF  = P1^0;
sbit YZ  = P1^1;
sbit ZZ  = P1^2;
sbit ZF  = P1^3;

uchar dat,ZKB1,ZKB2;

void init()
{
        TMOD = 0x21;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ET0 = 1;
        TR0 = 1;
        ES = 1;
//        IP = 0x10;
        SCON =0x50;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA  = 1;
        TR1 = 1;
        ET1 = 1;
        flag1 = flag2 = 0;
        ZZ = ZF = YZ = YF = 0;
}
void main()
{
        init();
        while(1)
        {

        }
}

void uart_ISR() interrupt 4
{
        RI = 0;
        dat = SBUF;      
        
        if(dat >100) ZKB1 = dat & 0x7f;
        else  ZKB2 = dat;
}

void timer0() interrupt 1
{
        static uchar count = 0;
        TH0 = 0xFF;
        TL0 = 0xA0;
        ++count;
        if(count > 100){count = 0;}

        if(count < ZKB1)
                ZZ = 1;
        else ZZ = 0;               
        if(count < ZKB2)
                YZ = 1;
        else YZ = 0;

}

一周热门 更多>