单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4665|回复: 7
收起左侧

单片机控制直流电机程序(注释详细)与Proteus仿真

  [复制链接]
H昌S 发表于 2019-4-15 15:43 | 显示全部楼层 |阅读模式
仿真基本效果
1.       按下正转按钮,绿灯长亮,电机低速正转,档位为1档。2.       按下正转按钮,绿灯长亮,电机低速正转,档位为1档。3.       在未达到最高档(3档)的情况下,按下加速按钮,电机档位加一,绿灯闪烁8次,每次闪烁的时间间隔为1秒。如果达到最高档,按下加速按钮,电机档位不变。然后判断电机的转动方向,如果正转,绿灯常亮;如果反转,红灯常亮。4.       在未达到最低档位(1档)的情况下,按下减速按钮,电机档位减一,红灯闪烁8秒,每次闪烁的室间隔为1秒。如果达到最低档,按下减速按钮,电机档位不变。然后判断电机的转动方向,如果正转,绿灯常亮;如果反转,红灯常亮。5.       按下停止按钮,蜂鸣器报警,且所有LED灯灭,电机停止,并使电机档位置1档。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar m;               //用来标志速度档位
  5. uint t;                           //计数标志
  6. sbit k1=P2^0;     //正转按钮
  7. sbit k2=P2^1;      //反转按钮  
  8. sbit k3=P2^2;             //停止按钮
  9. sbit k4=P2^3;           //加速按钮
  10. sbit k5=P2^4;           //减速按钮
  11. sbit k6=P1^0;
  12. sbit k7=P1^1;           //控制电动机的两个输入
  13. sbit pwm1=P1^4;           //PWM信号从P1^4输出
  14. void init() ;      //定义定时器的初始化函数         
  15. void delay(uint x)        //延时程序,延时x ms
  16. {
  17.       uint i,j;
  18.       for(i=x;i>0;i--)
  19.        for(j=110;j>0;j--);
  20. }

  21. main()
  22. {   
  23.    init();                        //定时器的初始化
  24.    while(1)
  25.    {      
  26.        if(k1==0)           //检测是否按下正转按钮
  27.         {
  28.            delay(10);  // 消抖10ms
  29.            if(k1==0)   //如果正转按钮按下
  30.            {  
  31.             P1=0x01;        //IN1=1,IN2=0;控制电动机正转
  32.             P0=0X00;        //绿灯常亮
  33.            }
  34.            while(!k1);        //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行
  35.         }
  36.       
  37.         if(k2==0)                //检测是否按下反转按钮
  38.         {
  39.            delay(10);        //消抖10ms
  40.            if(k2==0)        //如果按下反转按钮
  41.            {
  42.              P1=0x02;         //IN1=0,IN2=1,控制电动机反转
  43.              P0=0X01;         //红灯常亮
  44.            }
  45.            while(!k2);           //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行      
  46.         }
  47.         if(k3==0)                  //检测是否按下停止按钮
  48.         {
  49.            delay(10);                //消抖10ms
  50.            if(k3==0)                //如果按下停止按钮
  51.            {
  52.                     m=1;                         //电动机重置为1档
  53.             P1=0X00;                 //IN1=0.IN2=0,电动机停止
  54.             P0=0x02;                 //蜂鸣器响
  55.             delay(1000);         //延时1秒
  56.                         P0=0XFF;                  //灯全熄灭,蜂鸣器不响
  57.             pwm1=0;                         //PWM输出低电平
  58.            }
  59.         while(!k3);                         //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行
  60.         }
  61.         if(k4==0)                          //检测加速按钮是否按下
  62.         {
  63.            delay(10);                   //消抖10ms
  64.            if(k4==0)                        //如果加速按钮按下
  65.            {  
  66.              m++;                                 //档位加一
  67.                          if(m<4){                         //在不超过最高3档的情况下,按下加速按钮,执行以下
  68.               for(t=8;t>0;t--){         //绿灯闪烁8次
  69.                 P0=0x03;
  70.                 delay(500);
  71.                 P0=0X07;
  72.                 delay(500);} }
  73.                                 if(k6==1&&k7==0)          //如果电动机正转,绿灯常亮
  74.                                 P0=0X00;
  75.                                 else if(k6==0&&k7==1)         //如果电动机反转,红灯常亮
  76.                                 P0=0X01;
  77.                                 else P0=0X07;                        //如果电动机停止,灯全熄灭
  78.            }
  79.            while(!k4);                                   //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行
  80.         }
  81.         if(k5==0)                                           //检测减速按钮是否按下
  82.         {
  83.             delay(10);                                   //消抖10ms
  84.             if(k5==0)                                   //如果减速按钮按下
  85.              {  
  86.               m--;                                                //档位减一
  87.                           if(m>0){                                        //当档位未小于一档,按下减速按钮,执行以下
  88.                for(t=8;t>0;t--){                 //红灯闪烁8次
  89.                 P0=0x04;
  90.                 delay(500);
  91.                 P0=0X07;
  92.                 delay(500);}}
  93.                                 if(k6==1&&k7==0)                 //如果电动机正转,绿灯常亮
  94.                                 P0=0X00;
  95.                                 else if(k6==0&&k7==1)          //如果电动机反转,红灯常亮
  96.                                 P0=0X01;
  97.                                 else P0=0X07;                          //如果电动机停止,灯全熄灭
  98.              }
  99.              while(!k5);                         //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行
  100.         }
  101.                 if(m>3)m=3;                                          //档位最大为3档
  102.                 if(m<1)m=1;                                     //档位最小为1档
  103.      }
  104. }
  105. void init()                                                         //定义定时器的初始化
  106. {
  107.    
  108.    TMOD=0X01;                                                 //工作方式寄存器,选用定时器0的工作方式1
  109.    TH0=(65536-50000)/256;
  110.    TL0=(65536-50000)%256;                          //装载初值
  111.    TR0=1;                                                         //开始计数
  112.    ET0=1;                                                          //开启定时器中断使能
  113.    EA=1;                                                          //开启总中断
  114.    P0=0Xff;                                                          //设定开始时灯全熄灭,蜂鸣器不响
  115.    P1=0X00;                                                     //电动机不运转
  116.    P2=0Xff;                                                     //P2端口全置1
  117.    m=1;                                                                   //开启电动机为1档
  118. }
  119. ……………………

  120. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
单片机电机控制.zip (31.46 KB, 下载次数: 150)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

南宫云亦 发表于 2019-6-20 15:17 | 显示全部楼层
有问题的好吧
回复

使用道具 举报

米明 发表于 2020-3-6 11:24 | 显示全部楼层
多谢分享!
回复

使用道具 举报

majiedong2020 发表于 2020-3-7 12:42 | 显示全部楼层
连接单片机与电机之间的那个叫什么,可以介绍一下吗?
回复

使用道具 举报

MYSD 发表于 2020-3-14 14:16 | 显示全部楼层
不对啊  有错
回复

使用道具 举报

繁星、、、 发表于 2020-4-24 11:58 | 显示全部楼层
电机都不转
回复

使用道具 举报

须臾9q 发表于 2020-4-30 18:28 | 显示全部楼层
这这有重大错误,没法仿真

回复

使用道具 举报

阿giao 发表于 2020-6-17 17:35 | 显示全部楼层

电机都不转,有错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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