×
单片机 > 单片机程序设计 > 详情

单片机+直流电机转速控制程序+Proteus仿真电路

发布时间:2020-08-26 发布时间:
|

·1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器

·2.采用霍尔传感器非接触式测电机转速

·3.LCD1602液晶显示当前的转速,转速单位为转/分(RPM)。和显示当前的pwm占空比0~100%。

·4.电机的速度可以通过按键调整,也可以开始暂停,正转和反转。


注意:磁铁和霍尔元件最近距离在2mm左右,太近可能会在电机转动时碰到霍尔元件,太远霍尔元件可能会检测不到磁铁。


使用说明:

液晶屏第一行显示电机转速,第二行显示占空比,占空比数值越大,电机转速越快。

系统一共有6个按键,单片机附近的独立按键是系统的复位按键,按下单片机会复位。


下面一排是控制按键:

1键:加速键,可以短按,占空比加1,也可长按,占空比连续加;

2键:减速键,可以短按,占空比减1,也可长按,占空比连续减;

3键:正转切换键,按下后电机正转;

4键:反转切换键,按下后电机反转;

5键:开始暂停键,按一下开始,再按一下暂停。

程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

void displaym();

sbit en=P2^5;                //1602  6管脚

sbit rs=P2^7;         //1602端口        4管脚

sbit rw=P2^6;//lcd1602控制端口 5管脚

sbit num1=P1^0;                                                //占空比加1

sbit num2=P1^1;                                                                   //占空比减一

sbit num3=P1^2;                                                                                           //正传

sbit num4=P1^3;                                                                                                         //反转

sbit num5=P1^4;                                                                                                                   //开始停止切换

sbit out=P3^4;                                                         //PWM输出用于正传

sbit out1=P3^7;                        //PWM输出用于反转

uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;

void delay(uint z)//延时1ms函数

{

uint x,y;

for(x=0;x

     for(y=0;y<110;y++);

}

void write_com(uchar com)//向1602写一字节(控制指令)

{

  rs=0;

  P0=com;

  delay(5);

  en=0;

  delay(10);

  en=1;

}

void write_data(uchar date)//向1602写一字节(数据)

{

  rs=1;

  P0=date;

  delay(5);

  en=0;

  delay(5);

  en=1;

}

void init()//初始化函数

{

  en=0;

  rw=0;

  write_com(0x01);         //lcd初始化

  write_com(0x38);                                           //5X7显示

  write_com(0x0c);                         //关闭光标

  TMOD=0x01;               //定时器方式1           

  TH0=0xdc;

  TL0=0x00;                //定时器装入初值

  EA=1;                    //开总中断

  ET0=1;                   //定时器0开中断

  TR0=1;

  EX1=1;

IT1=1;                 //定时器启动  

TH1=0xfc;

  TL1=0x66;//定时100us

  ET1=1;                   //定时器1开中断

  TR1=1;

  write_com(0x80);

  write_data('V');

  write_data(':');

  write_com(0x87);                 //第一行显示转速

  write_data('r');

  write_data('p');

  write_data('m');

  write_com(0xc0);

  write_data('z');

  write_data('h');

  write_data('a');

  write_data('n');

  write_data('k');

  write_data('o');

  write_data('n');

  write_data('g');

  write_data('b');

  write_data('i');          //在第二行显示zhankongbi:

  write_data(':');

  displaym();

}

void keyscan()  //键盘扫描函数

{

  if(num1==0)     

  {

    delay(5);      //消除抖动

         if(num1==0)

         {

                if(m<=199)

                 m++;

                        displaym();                                                                  //设定占空比加一

     }

  }

  if(num2==0)

  {

    delay(5);

         if(num2==0)

         {

                  if(m>=1)

                m--;

                        displaym();                                        //设定占空比减一

         }

  }

    if(num3==0)

  {

    delay(5);

         if(num3==0)

         {

          zheng=1;                //正传标志置1

          fan=0;          // 反转标志置0

         }

  }

      if(num4==0)

  {

    delay(5);

         if(num4==0)

         {

          zheng=0;                 //正传标志置0

          fan=1;          // 反转标志置1

         }

  }

      if(num5==0)

  {

    delay(5);

         if(num5==0)

         {

         while(num5==0)         ;

          kai=1-kai;

         }

  }

}

void display()

{

  write_com(0x82);

  zhuansu=zhuansu*30;          //将两秒内的计数乘以30得到转每分

  if(zhuansu/10000!=0)

   write_data(zhuansu/10000+0x30);                                                  //如果转速的万位不为0        正常显示否则显示空格

   else

   write_data(' ');

  if(zhuansu/1000==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000+0x30);                                                                //如果转速小于1000 千位为空格 否则正常显示

  if(zhuansu/100==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000/100+0x30);                                           //如果转速小于100 百位为空格 否则正常显示

    if(zhuansu/10==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000%100/10+0x30);                                  //如果转速小于10 十位为空格 否则正常显示

  write_data(zhuansu%10000%1000%100%10+0x30);

write_com(0xd0); //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空


关键字:单片机  直流电机  转速控制 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会