找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2174|回复: 2
打印 上一主题 下一主题
收起左侧

单片机履带车程序求助

[复制链接]
跳转到指定楼层
楼主
ID:231793 发表于 2020-7-30 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人单片机新手,做了一个履带车,必须七个遥控功能,前进,后退,加速,减速,左转,右转还有停车。使用PT2272M6最多六个通道,设想在pt2262遥控的前进键用软件(51单片机)实现按一下前进,再按一下停车,按说很简单的程序我就是弄不好,哪位专业师傅给帮我弄一下,不胜感谢。下面是源程序,K1是前进键,K5是停止键。

单片机源程序如下:
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;

//L298N????
sbit ena = P0^0;
sbit in1 = P0^1;
sbit in2 = P0^2;
sbit in3 = P0^3;
sbit in4 = P0^4;
sbit enb = P0^5;

//??
sbit key1 = P3^3;    //????
sbit key2 = P3^4;         //????
sbit key3 = P3^6;         //????
sbit key4 = P3^7;
sbit key5 = P2^0;
sbit key6 = P2^1;
sbit key7 = P2^2;
sbit key8 = P2^3;
sbit relay = P2^4;//????

u16 MA = 0,MB = 0;      //pwm???

u16 SpeedA = 20; //50%???
u16 SpeedB = 20;

u8 flag;                 //??,1????,0????
         //???????sbuf


void delay(u16 z);        //??????

//??
void forward()
{
flag = 1;                 //??????
in1=1;                    //l298n??
in2=0;  
in3=1;  
in4=0;
}


//??
void fallback()
{
flag = 0;                //??????
in1=0;  
in2=1;  
in3=0;  
in4=1;
}


//??
void quick()
{
SpeedA += 1;  //???1
if(SpeedA >= 40)        //??40
{
SpeedA = 40;
}
SpeedB += 1;
if(SpeedB >= 40)
{
SpeedB = 40;
}
}


//??
void slow()
{
SpeedA -= 1;        //???1
if(SpeedA <= 5)//??5
{
SpeedA = 5;
}
SpeedB -= 1;
if(SpeedB <= 5)
{
SpeedB = 5;
}
}


//??
void move_left()   

{
in1=1;  
in2=0;  
in3=0;  
in4=0;
}





void move_right()

{
in1=0;  
in2=0;  
in3=1;  
in4=0;
}



//??
void stop()
{
in1=0;  
in2=0;  
in3=0;  
in4=0;
}

void delay(u16 z)
{  
u16 x,y;  
for(x=z;x>0;x--)   
for(y=125;y>0;y--);
}   




void main()
{   
//????? ???T0
TMOD = 0x21;  //T0?????????,T1?????????
//PCON = 0x00;  //???????,???
//SCON = 0x50;                 //???????,???????,????
        TH1 = 0xFD;                   //????
        TL1 = 0xFD;                   //????
//TR1 = 1;                          //?????T1


TH0 = 0xF4;                    //????
TL0 = 0x48;          //????
TR0 = 1; //?????T0


//ES = 1;//??????
//PS = 1;                         //??????
//PT0 = 1;                 //???0????
ET0 = 1;//?????T0??
EA = 1;//?????

//??????
while(1)
{
if(key1 == 0)
{
delay(10);
if(key1 == 0)
{
forward();

}
while(key1 == 0);
}
if(key2 == 0)
{
delay(10);
if(key2 == 0)
{
fallback();

}
while(key2 == 0);
}
if(key3 == 0)
{
delay(10);
if(key3 == 0)
{
quick();

}
while(key3 == 0);
}
if(key4 == 0)
{
delay(10);
if(key4 == 0)
{
slow();

}
while(key4 == 0);
}
if(key5 == 0)
{
delay(10);
if(key5 == 0)
{
stop();
}
while(key5 == 0);
}
if(key6 == 0)
{
delay(10);
if(key6 == 0)
{
move_left();
}
while(key6 == 0);
}
if(key7 == 0)
{
delay(10);
if(key7 == 0)
{
move_right();
}
while(key7 == 0);
}
if(key8 == 0)
{
delay(10);
if(key8 == 0)
{
relay=~relay;
}
while(!key8);
}
}
}


void time0_int() interrupt 1   //T = 3ms * 40 = 120ms
{  
TR0 = 0;      
TH0 = 0xF4;
TL0 = 0x48; //3000;  3ms
MA++;         
if(MA < SpeedA)  
{   
ena = 1;  
}  
else
  ena = 0;  
if(MA == 40)
{   
  MA = 0;  
}  

MB++;         
if(MB < SpeedB)  
{   
enb = 1;  
}  
else
  enb = 0;  
if(MB == 40)
{   
  MB = 0;  
}  
TR0 = 1;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:808485 发表于 2020-7-30 17:34 | 只看该作者
我假设你车辆控制程序都正常了,只是这个按键逻辑搞不定,给出如下建议:
设计档位概念,共 5 档:前进2档,前进1档,停车0档,后退-1档,后退-2档
key1 升档, key2 降档,key3/key4空闲,key5停车保留
可以通过连续按 key1 从-2档一直升到+2档,key2同理
代码如下:

while(1)
{
        static char speed=0;
        if(key1 == 0)
        {
                delay(10);
                if(key1 == 0)
                {
                        if(++speed > 2)speed = 2;
                }
                while(key1 == 0);
        }
        if(key2 == 0)
        {
                delay(10);
                if(key2 == 0)
                {
                        if(--speed < -2)speed = -2;
                }
                while(key2 == 0);
        }
        if(key3 == 0)
        {
                delay(10);
                if(key3 == 0)
                {
                }
                while(key3 == 0);
        }
        if(key4 == 0)
        {
                delay(10);
                if(key4 == 0)
                {
                }
                while(key4 == 0);
        }
        if(key5 == 0)
        {
                delay(10);
                if(key5 == 0)
                {
                        stop();
                }
                while(key5 == 0);
        }
        if(key6 == 0)
        {
                delay(10);
                if(key6 == 0)
                {
                        move_left();
                }
                while(key6 == 0);
        }
        if(key7 == 0)
        {
                delay(10);
                if(key7 == 0)
                {
                        move_right();
                }
                while(key7 == 0);
        }
        if(key8 == 0)
        {
                delay(10);
                if(key8 == 0)
                {
                        relay=~relay;
                }
                while(!key8);
        }
        //根据速度代码输出
        switch( speed )
        {
                case 2:
                //高速前进
                        quick();
                break;
                case 1:
                //低速前进
                        forward();
                        slow();
                break;
                case 0:
                //停车
                        stop();
                break;
                case -1:
                //低速后退
                        fallback();
                        slow();
                break;
                case -2:
                //高速后退
                        quick();
                break;
                default:
                        speed=0;
                break;
        }
}
回复

使用道具 举报

板凳
ID:231793 发表于 2020-7-30 20:33 | 只看该作者
gbchang 发表于 2020-7-30 17:34
我假设你车辆控制程序都正常了,只是这个按键逻辑搞不定,给出如下建议:
设计档位概念,共 5 档:前进2档 ...

谢谢这么快就回复了,你的这个思路和程序很好,我马上调试程序,再次谢谢!谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表