找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1882|回复: 1
收起左侧

我初学,问问大佬们,如何在这个单片机代码里面加上pwm可以随意调想四轮小车速度

[复制链接]
ID:922391 发表于 2021-5-24 21:09 | 显示全部楼层 |阅读模式
#include<reg52.h>

sbit IN1 = P0^7;
sbit IN2 = P0^6;
sbit IN3 = P0^5;
sbit IN4 = P0^4;
sbit IN5 = P1^7;
sbit IN6 = P1^6;
sbit IN7 = P1^5;
sbit IN8 = P1^4;
                  

sbit Left_bizhang = P3^6;
sbit Right_bizhang = P3^7;
sbit Left_led=P2^0;
sbit Right_led=P2^1;

unsigned char pwm_val =0;
unsigned char push_val =0;

void delay(unsigned int k)
{
      unsigned int x,y;
          for(x=0;x<k;x++)
          {
             for(y=0;y<2000;y++);
           }
}

void run(void)        //           前进
{
      push_val=3;
                IN1=0;
                IN2=1;        
                IN3=0;
                IN4=1;
                IN5=0;        
                IN6=1;
                IN7=0;
                IN8=1;        
}

void backrun(void)        //        后退
{
                IN1=1;
                IN2=0;
                IN3=1;
                IN4=0;
                IN5=1;
                IN6=0;
                IN7=1;
                IN8=0;
}

void leftrun(void)         //                 左转
{
                IN1=1;
                IN2=0;
                IN3=1;
                IN4=0;
                IN5=0;
                IN6=1;
                IN7=0;
                IN8=1;
}
void rightrun(void)           //          右转
{
                IN1=0;
                IN2=1;
                IN3=0;
                IN4=1;
                IN5=1;
                IN6=0;
                IN7=1;
                IN8=0;
}
void stop(void)
{
                IN1=0;
                IN2=0;
                IN3=0;
                IN4=0;
                IN5=0;
                IN6=0;
                IN7=0;
                IN8=0;
}
void Che_init()
{
      P1=0x00;
          TMOD=0x01;
          TH0=0xFC;
          TH0=0x18;
          TR0=1;
          EA=1;
}
void UART_INIT()
{
        SM0 = 0;
        SM1 = 1;//串口工作方式1
        REN = 1;//允许串口接收
        EA = 1;//开总中断
        ES = 1;//开串口中断
        TMOD = 0x20;//8位自动重装模式
        TH1 = 0xfd;
        TL1 = 0xfd;//9600波特率
        TR1 = 1;//启动定时器1
}
//寻迹
void xunji(){

       while(1){
                        if(Left_led==1&&Right_led==1)
                {
                        ET0=1;
                        run();
                }
                else
                {
                        if(Left_led==0&&Right_led==1)
                        {
                                    IN1=0;
                                                IN2=1;
                                                IN3=0;
                                                IN4=1;
                                                IN5=1;
                                                IN6=0;
                                                IN7=1;
                                                IN8=0;
                        }
                        if(Right_led==0&&Left_led==1)
                        {
                        
                                                IN1=1;
                                                IN2=0;
                                                IN3=1;
                                                IN4=0;
                                                IN5=0;
                                                IN6=1;
                                                IN7=0;
                                                IN8=1;
                        }
                        
                }
                }
}
        //避障
void bizhang(){               

                  while(1)
        {
                run();
               
                 if(Left_bizhang==1&&Right_bizhang==1)
                 {
                         run();

                 }
                 else
                 {
                         if(Left_bizhang==1&&Right_bizhang==0)
                         {

                                 backrun();
                                 delay(50);
                                 leftrun();
                                delay(100);
                         }
                         if(Left_bizhang==0&&Right_bizhang==1)
                         {
                                 backrun();
                                 delay(50);
                                 rightrun();
                                delay(100);
                         }
                 }
        
        }
}


void UART_SER() interrupt 4
{
        if(RI)
        {
                RI = 0;//清除接收标志
                switch(SBUF)
                {
                        case 0x41: run();break;//前进
                        case 0x44: backrun();break;//后退
                        case 0x42: leftrun();break;//左转
                        case 0x43: rightrun();break;//右转
                        case 0x45: stop();break;//停止
                                                case 0x47: bizhang();break;        //避障
                                                case 0x46: xunji();break;   //寻迹
                        default:break;
                                                                                                
                }
        }
}
void pwm_out_moto(void)
{
       if(pwm_val<=push_val)
           {

                run();

        }
        else
                {
                     stop();
                }
                if(pwm_val>=10)
                     pwm_val=0;
}


void timer0()interrupt 1 using 2
{
        TH0=0xFC;
                TL0=0x18;
                pwm_val++;
                pwm_out_moto();
}
void main(void)
{
           delay(50);
           Che_init();
           UART_INIT();
           while(1);


}

回复

使用道具 举报

ID:844772 发表于 2021-5-25 09:24 | 显示全部楼层
我估计你是不知道怎么通过pwm控制电机,看样子你可能用的是298N,在4个IN 的旁边有两个EN,默认是短接拉高,你通过它们注入两路调制的pwm信号就可以分别控制两个电机的。至于怎么写pwm,网上很多抄个就行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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