注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
不写手发抖的个人空间 https://home.eeworld.com.cn/space-uid-629767.html [收藏] [复制] [分享] [RSS]
日志

基于51单片机控制的直流电机及原理图

已有 1977 次阅读2015-6-11 12:00 |个人分类:个人作品| 直流电机, 单片机, LM298n

//单片机产生PWM波,LM198n控制两个直流电机

#include<reg52.h>  //头文件

#define uint unsigned int  //对int和char进行宏定义,方便使用
#define uchar unsigned char

sbit p32=P3^2;    //控制加速共5档
sbit p33=P3^3;    //控制减速共5档

sbit s1=P2^0;
sbit s2=P2^1;    //控制电机1正反转

sbit s3=P2^2;
sbit s4=P2^3;    //控制电机2正反转

sbit s5=P2^4;
sbit s6=P2^5;  //电机1/2的使能端

sbit p26=P2^6;  //按键控制电机反转
sbit p27=P2^7;  //按键控制电机正转
sbit p17=P1^7;  //按键控制电机停止工作

sbit d0=P1^0;  //正转时,正转绿灯一直亮,否则灭
sbit d1=P1^1;  //反转时,反转红灯一直亮,否则灭
sbit d2=P1^2;  //加速时,黄灯亮0.5s,然后灭
sbit d3=P1^3;  //减速时,蓝灯亮0.5s,然后灭

uchar constant=10,flag=0;  //定义两个变量

/*函数声明*/
void delay(unsigned int z);   //延时函数
void fan();  //反转函数
void zheng();   //正转函数
void xuan();   //选择正反转函数
void stop();   //停止函数
void init();   //程序初始化

void main()
{
 init();
 while(1) 
 {
  xuan();  //选择正反转然后执行
  stop();  //选择停止模式
 }
}

/*初始化函数*/
void init()
{
 s5=0;
 s6=0;  //开始时电机不工作
 EA=1;  //总中断开启
 TMOD=0X02;    //选取定时器方式2
 EX0=1;     //外部中断0开启
 IT0=1;     //中断0触发方式为下降沿
 EX1=1;     //外部中断1开启
 IT1=1;     //中断1触发方式为下降沿
 ET0=1;     //定时器0开启
 TR0=1;     //启动定时器0
 TH0=256-156; //设置初值0.1ms
 TL0=256-156;
}

/*选择电机正反转*/
void xuan()//首先通过p26和p27来选择正反转,然后p32用来加速,p33用来减速。
{
 if(p26==0)
 {
  delay(10);
  do
  {
   fan(); //如果p26选定了反转,那么一直反转
   d0=0;  //反转时,绿灯一直亮
  }
  while(p17==1);  //如果p17=0,则停止
  d0=1;   //不反转时,绿灯熄灭
 }
 else if(p27==0)
 {
  delay(10);
  do
  {
   zheng();  //如果p27选定了正转,那么一直正转
   d1=0;   //正转时,红灯一直亮
  }
  while(p17==1); //如果p17=0,则停止
  d1=1;    //不正转时,红灯熄灭
 }
}

/*电机反转函数*/
void fan()
{
 s5=1;
 s6=1;  //使能端开启
 s1=0;
 s3=0;  //控制一边为0,根据另一边时间的不同改变占空比
 if(flag==1)
 { 
 
  flag=0;
  s2=1;    //执行反转运行
  s4=1;
 }
 if(flag==2)
 {
  flag=0;
  s2=0;   //反转停止
  s4=0;
 }
 //根据反转运行与停止的时间长短不同改变PWM信号
}

/*电机正转函数*/
void zheng()  //原理与上面反转一样
{
 s5=1;
 s6=1;
 s1=1;
 s3=1;
 if(flag==1)
 { 
 
  flag=0;
  s2=0;
  s4=0;
 }
 if(flag==2)
 {
  flag=0;
  s2=1;
  s4=1;
 }
}
/*停止函数*/
void stop()  
{
 if(p17==0)  //当p17按下时,电机停止工作
  {
   delay(10);
   if(p17==0)
   { 
    s5=0;
    s6=0; //使能端为0则停止
    constant=10;   //避免正转以后的速度影响反转启动的速度
   }
  }
}

void time0(void) interrupt 1
{
 static uchar i;
 TH0=256-156;
 TL0=256-156;
 i=i+10;
 if(i<=constant)flag=1;
 if(i>constant&&i<=100)flag=2;
 if(i==100)i=0;  //i=100时清零
 //根据constant的大小不同来使flag处于不同时间段
 //这样就可以使运行正反转的高低电平处于不同时间
}

void int1(void) interrupt 2  using 2  //减速
{     
 if(p33==0)
 {
  delay(10);
  if(constant==0)constant=0;
  /*constant为0时,则一直为0,如无,则cons会变成负数,
  根据其补码变为比较大的正数,则又开始加速*/
  else if(p33==0)
  {
   while(!p33);//如果减速按键一直按着,则执行空语句
   constant=constant-10;  //按键按下且cons不为0,则继续减10
   d3=0;
   delay(500);
   d3=1;  //减速灯亮0.5s后灭
  }
 }
}

void int0(void) interrupt 0 using 0  //加速,原理同减速
{     
 if(p32==0)
 {
  delay(10);
  if(constant==100)constant=100;
  else if(p32==0)
  {
   while(p32==0);
   constant=constant+10;
   d2=0;
   delay(500);
   d2=1;
  }
 }
}

//延时函数为Z*1ms
void delay(uint z)
{
 uint i,j;
 for(i=0;i<z;i++)
  for(j=0;j<121;j++);
}

 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章