小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 13393|回复: 14

51简单调速程序

[复制链接]
发表于 2013-8-11 19:46:26 | 显示全部楼层 |阅读模式
程序是适应我的板子,一般要做少许改动才能用
#include<reg52.h>
#include"math.h"

#define uchar unsigned char

#define uint unsigned int

int buffer[3];

int speed=10;

int rec_flag=0;

sbit pwm1=P1^1;
sbit pwm2=P1^3;
sbit q1  =P1^0;
sbit q2  =P1^2;
sbit zd  =P1^4;
sbit dd         =P1^5;
sbit yd  =P1^6;
sbit feng=P1^7;


/*-------------------------------------------------------------*/

//串口初始化
uchar t=0;          /* 中断计数器     */   
uchar m1=0;         /* 电机1速度值    */   
uchar m2=0;         /* 电机2速度值    */   
uchar tmp1,tmp2;
char detection_m1,detection_m2,sign=0,time=0;    /* 电机当前速度值 */   

void motor(uchar index, char speed)   /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100-100) */   
{   
  if(speed>=-100 && speed<=100)   
     {   
       if(index==1)       /* 电机1的处理    */   
         {   
          m1=abs(speed);  /* 取速度的绝对值 */   
          if(speed<0)     /* 速度值为负则反转 */   
             {  

                         detection_m1=0;

             }   
            else          /* 不为负数则正转 */   
             {

                         detection_m1=1;   


             }   
         }   
       if(index==2)       /* 电机2的处理    */   
         {   
          m2=abs(speed);  /* 电机2的速度控制 */   
          if(speed<0)     /* 电机2的方向控制 */   
             {
                          
                         detection_m2=0;  

             }   
            else   
             {

                         detection_m2=1;  

             }   
         }   
     }   
  }



void delay(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j = 110;j>0;j--);
}  




void pwm(char right_m,char left_m)
{

motor(1,right_m);
motor(2,left_m );
                                         
}
void UART_Init(void)

{

TMOD = 0x22;

PCON = 0x00;

SCON = 0x50;

TH0=0x9b;

TL0=0x9b;

TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;

TR1 = 1; //启动定时器1


ES = 1; //开串口中断

EA = 1; //开总中断

IT0=0;
EX0=1;

ET0=1;
TR0=1;

}


/*-------------------------------------------------------------*/

//主函数

void main(void)

{

UART_Init(); //初始化串口

while(1)

        {
       
        }
}


void Communication_Decode(void)
{

       

        if(buffer[0]==0x00)
         
        {
         
                switch(buffer[1])
                 
                {
                 
                case 0x01:pwm(speed,speed); return;        //前
                 
                case 0x02:pwm(-speed,-speed); return;        // 后
                 
                case 0x03:pwm(-speed,speed); return;        //左
                 
                case 0x04:pwm(speed,-speed); return;        //右

                case 0x05:
                {
                 zd=~zd;
             dd=~dd;
             yd=~yd;
                 return;
                }

                case 0x00:
                {
       
                pwm(0,0);
                return;
                }
                case 0x06:feng=~feng;return;

            case 0x09:speed++; return;   //加速
               
                case 0x0a:speed--; return;        //减速
                 
                default: return;
                 
                }

        }


}

  void timer0() interrupt 1          /* T0中断服务程序 */   
  {   
   if(t==0)           /* 1个PWM周期完成后才会接受新数值 */   
     {   
       tmp1=m1;   
       tmp2=m2;   
     }   

        if(t<tmp1)
        {
          if(detection_m1==1)
          {
          
                   pwm1=0;
                q1=0;
          }
           else
           {
       
                  
            pwm1=0;
                q1=1;
           }
       
        }
        else
        {
       
        pwm1=1 ;
       
        }

        if(t<tmp2)
        {
          if(detection_m2==1)
          {
                pwm2=0;
                q2=1;

          
          }
           else
           {
                 pwm2=0;
                q2=0;
                  
           }
         
         
        }
        else
        {
       
   pwm2=1;

        }

   t++;   
   if(t>=100) t=0;          /* 1个PWM信号由100次中断产生 */   
  }   

                               

/*-------------------------------------------------------------*/

//串口接收中断函数
void INT_UartRcv(void) interrupt 4

{

static int i;



        if(RI==1)
         
        {
         
                RI = 0;
                 
                        if(rec_flag==0)
                         
                        {
                         
                               
                                if(SBUF==0xff)
                                 
                                {
                                 
                                rec_flag=1;
                                i=0;
                                 
                                }
                        }
                         
                        else
                         
                        {
                         
                                if(SBUF==0xff)
                                 
                                {
                                 
                                    rec_flag=0;
                                        if(i==3)
                                         
                                        {
                                          if(speed<0)
                          speed=0;
                                        Communication_Decode();
                                         
                                        }
                                 
                                    i=0;
                                 
                                }
                         
                                else
                                 
                                {
                                 
                                        buffer[i]=SBUF;
                                         
                                        i++;
                                 
                                }
                         
                        }
        }
         
        else
         
        {
         
        TI = 0;
         
        }
}

点评

ack
总觉得看C不适应,还是看汇编直接些,  发表于 2015-2-5 06:40

评分

参与人数 2金钱 +6 贡献 +1 收起 理由
顾春辉 + 3 赞一个!
liuviking + 3 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-8-12 19:47:19 | 显示全部楼层
不错的算法 学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-13 08:34:06 | 显示全部楼层
~V~shrimp@@@ 发表于 2013-8-12 19:47
不错的算法 学习了

以前比赛时用过的51模拟PWM程序,移植了一下,呵呵
回复 支持 反对

使用道具 举报

发表于 2013-8-14 13:12:05 | 显示全部楼层
话说,51模拟出4路pwm是不是一样的原理啊。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-14 13:25:48 | 显示全部楼层
MEGUSTAS 发表于 2013-8-14 13:12
话说,51模拟出4路pwm是不是一样的原理啊。。

话说是一样的
回复 支持 反对

使用道具 举报

发表于 2014-4-1 22:35:52 | 显示全部楼层
请问楼主,你所定义的端口
sbit pwm1=P1^1;
sbit pwm2=P1^3;
sbit q1  =P1^0;
sbit q2  =P1^2;
sbit zd  =P1^4;
sbit dd         =P1^5;
sbit yd  =P1^6;
sbit feng=P1^7;
分别代表着什么意思,与什么东西连接的呢?求解。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 20:42:22 | 显示全部楼层
sbit pwm1=P1^1;左电机一路占空比
sbit pwm2=P1^3;右电机一路占空比
sbit q1  =P1^0;左电机另一路
sbit q2  =P1^2;右电机另一路
其他都是外设不用管
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 20:43:31 | 显示全部楼层
明日华星 发表于 2014-4-1 22:35
请问楼主,你所定义的端口
sbit pwm1=P1^1;
sbit pwm2=P1^3;


sbit pwm1=P1^1;左电机一路占空比
sbit pwm2=P1^3;右电机一路占空比
sbit q1  =P1^0;左电机另一路
sbit q2  =P1^2;右电机另一路
其他都是外设不用管
回复 支持 反对

使用道具 举报

发表于 2014-6-5 13:12:19 来自手机 | 显示全部楼层
请问楼楼,这个单电机转还是双电机转?(比如执行前进双电机都转?)
回复 支持 反对

使用道具 举报

发表于 2014-6-5 21:02:20 | 显示全部楼层
学习学习学习
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-22 23:42 , Processed in 1.156630 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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