找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求帮助本人小白 帮忙整合两个程序或写一个

[复制链接]
跳转到指定楼层
楼主
ID:59956 发表于 2014-3-24 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
控制直流电机和舵机的电机驱动模块是L298N
程序一
#include <reg52.h>

sbit  out = P1^0;              //舵机信号线
sbit  K1  = P1^4;
sbit  K2  = P1^5;
sbit  K3  = P1^6;

char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节

/**********************************************************

us延时子函数 (500us)

**********************************************************/
void delayus(unsigned char x)
{
  unsigned char i;                                                 
  while (x--)
  {
    for (i = 0; i < 58; i++)
      ;
  }
}

/**********************************************************

归中子函数 (0度)

**********************************************************/
void  Prog0(void)
{
   unsigned char m;

   for(m=0; m<30; m++)
   {
     out = 1;
     delayus(3);           //延时1.5ms
     out = 0;
     delayus(37);          //延时18.5ms
   }
}

/**********************************************************

逆时针转动子函数  1ms

**********************************************************/
void  Prog1(void)
{
   unsigned char m;
   
   for(m=0; m<40; m++)
   {
     out = 1;             //延时1ms
     delayus(2);
     out = 0;
     delayus(38);        //延时19ms
   }
}
/**********************************************************

顺时针转动子函数 2ms

**********************************************************/
void  Prog2(void)
{
   unsigned char m;
   
   for(m=0; m<40; m++)
   {
     out = 1;
     delayus(4);           //延时2ms
     out = 0;
     delayus(36);          //延时18ms
   }
}
/**********************************************************

主函数

**********************************************************/
void  main(void)
{
   P1 = 0xf0;
   Prog0();               //0度位置
   
   while(1)
   {
     if(K1 == 0)
     {
       delayus(40);       //延时20ms
       if(K1 == 0)
       Prog0();           //返回0度位置
     }
     else
     if(K2 == 0)
     {
       delayus(40);       //延时20ms
       if(K2 == 0)
       Prog1();           //逆时针转动
     }
     else
     if(K3 == 0)
     {
       delayus(40);       //延时20ms
       if(K3 == 0)
       Prog2();           //顺时针转动
     }
   }
}
程序二
#include<reg52.h>  
                   #define uchar unsigned char
                   #define uint unsigned int
                   sbit k1=P3^0;
                   sbit k2=P3^1;
                   sbit k3=P3^2;
                   sbit k4=P3^3;
                   sbit k5=P3^4;
                   sbit IN1=P2^0;
                   sbit IN2=P2^1;
                   sbit EN=P2^2;
                  
         

                   uchar num=0, show_num=1, gao_num=1, di_num=3, num1;
                   uchar code table[]={
                                 0xc0,0xf9,0xa4,0xb0,0x99,
                                  0x92,0x82,0xf8,0x80,0x90
                                                                };
                           void delay(uint x)                   //延时函数
                                     {        uint i,j;
                                         for(i=x;i>0;i--)
                                               for(j=110;j>0;j--);
                                                                                     }
                  void keyscan()
                     {
                        if(k1==0)             //   正转
                           {          delay(10);
                                 if(k1==0)
                                      {
                                                IN1=0;   IN2=1;    num1=1;
                                               while(!k1);
                                                              }
                                           }
                     
                              if(k2==0)             //   反转
                           {          delay(10);
                                 if(k2==0)
                                      {
                                                IN1=1;   IN2=0;    num1=0;
                                               while(!k2);
                                                              }
                                           }

                         if(k3==0)             //   加速
                           {          delay(10);
                                 if(k3==0)
                                      {   num++;
                                           if(num==4)
                                                 num=3;
                                                
                                               while(!k3);
                                                              }
                                           }
                     
                              if(k4==0)                //减速
                             {     delay(10);
                                      if(k4==0)
                                          {        if(num!=0)
                                                    num--;
                                                else
                                                    num=0;
                                                while(!k4);
                                                          }
                                                            }
                             
                           if(k5==0)             //   停止
                           {          delay(10);
                                 if(k5==0)
                                      {
                                                IN1=1;   IN2=1;   
                                               while(!k5);
                                                              }
                                           }
                                 
                                                     }

                   void display()
                      {   
                                P2=0xfe;                 //第一个数码管显示正转(1)还是反转(0)
                          P0=table[num] ;
                          delay(5);

                          P2=0xfd;                   //第二位数码管显示速度标志
                          P0=table[show_num];
                          delay(5);

                          P2=0xfb;                  //  显示0
                          P0=table[0];
                          delay(5);

                          P2=0xf7;                    //            显示0
                          P0=table[0];
                          delay(5);
                                                }

            void dispose()                          //根据速度标记进行数据处理
                {
                     switch (num)
                       {
                          case 0:
                                show_num=1;
                                  gao_num=1;
                                   di_num=3;
                                    break;
                       
                           case 1:
                                show_num=2;
                                  gao_num=2;
                                   di_num=2;
                                    break;

                            case 2:
                                show_num=3;
                                  gao_num=3;
                                   di_num=1;
                                    break;

                            case 3:
                                show_num=4;
                                  gao_num=4;
                                   di_num=0;
                                    break;
                                          }
                 
                                                 }
            void qudong()              //控制电机程序
                 {
                      uchar x;
                       if(num1==1)          //正转占空比调节
                         {if(di_num!=0)
                           {
                              for(x=0;x<=di_num;  x++)
                                  { IN1=0;                   //PWM低电平输出
                                     display();            //显示函数延时
                                         }
                                           }
                              for(x=0;x<=gao_num;x++ )
                                   {        IN1=1;
                                       display();            //PWM高电平输出
                                                         }
                                                            }
                               
                        if(num1==0)                  //反转占空比调节
                         {if(di_num!=0)
                           {
                              for(x=0;x<=di_num;  x++)
                                  { IN2=0;
                                     display();
                                         }
                                           }
                              for(x=0;x<=gao_num;x++ )
                                   {        IN2=1;
                                       display();
                                                         }
                                                            }               
                                            
                                                  }


                        void main ()
                          {
                                   while(1)
                                   {        EN=1;
                                       keyscan();
                                        dispose();
                                        qudong();
                                                   }
                          
                                                          }




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:59956 发表于 2014-3-24 12:49 | 只看该作者
求大神帮忙啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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