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

单片机直流电机调速并显示的仿真与程序源码

发布时间:2020-06-17 发布时间:
|

直流电机调速系统有如下功能按钮:
正转P2^3输出PWMP2^4为1
反转P2^4输出PWMP2^3为1
PWM占空比+1
开始/暂停

直流电机调速仿真原理图如下
 

电路原理图如下:
 

67-元件清单
1)    9*15万用板
2)    STC89C51单片机
3)    40脚IC座
4)    1602液晶
5)    16p母座
6)    16p排针
7)    10k电阻*3
8)    1k电阻*5
9)    3v直流电机
10)    3*1万用板
11)    磁铁*2
12)    塑料管
13)    3144霍尔传感器
14)    4148二极管*4
15)    8050三极管*4
16)    8550三极管*2
17)    103排阻
18)    104独石电容
19)    10uf电解电容
20)    30pf瓷片电容*2
21)    12M晶振
22)    按键*6
23)    自锁开关
24)    DC电源插口
25)    导线若干
26)    焊锡若干
27)    USB电源线或电池盒

单片机源程序如下:

#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); //如果没有这句,当中断内


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

热门文章 更多
51单片机CO2检测显示程序解析