单片机控制直流电机程序

发布者:ShimmeringMoon最新更新时间:2020-08-28 来源: 51hei关键字:单片机控制  直流电机  蜂鸣器 手机看文章 扫描二维码
随时随地手机看文章

仿真基本效果

1.按下正转按钮,绿灯长亮,电机低速正转,档位为1档。

2.按下正转按钮,绿灯长亮,电机低速正转,档位为1档。

3.在未达到最高档(3档)的情况下,按下加速按钮,电机档位加一,绿灯闪烁8次,每次闪烁的时间间隔为1秒。如果达到最高档,按下加速按钮,电机档位不变。然后判断电机的转动方向,如果正转,绿灯常亮;如果反转,红灯常亮。

4.在未达到最低档位(1档)的情况下,按下减速按钮,电机档位减一,红灯闪烁8秒,每次闪烁的室间隔为1秒。如果达到最低档,按下减速按钮,电机档位不变。然后判断电机的转动方向,如果正转,绿灯常亮;如果反转,红灯常亮。

5.按下停止按钮,蜂鸣器报警,且所有LED灯灭,电机停止,并使电机档位置1档。


仿真原理图如下

单片机源程序如下:

#include

#define uint unsigned int

#define uchar unsigned char

uchar m;               //用来标志速度档位

uint t;                           //计数标志

sbit k1=P2^0;     //正转按钮

sbit k2=P2^1;      //反转按钮  

sbit k3=P2^2;             //停止按钮

sbit k4=P2^3;           //加速按钮

sbit k5=P2^4;           //减速按钮

sbit k6=P1^0;

sbit k7=P1^1;           //控制电动机的两个输入

sbit pwm1=P1^4;           //PWM信号从P1^4输出

void init() ;      //定义定时器的初始化函数         

void delay(uint x)        //延时程序,延时x ms

{

      uint i,j;

      for(i=x;i>0;i--)

       for(j=110;j>0;j--);

}


main()

{   

   init();                        //定时器的初始化

   while(1)

   {      

       if(k1==0)           //检测是否按下正转按钮

        {

           delay(10);  // 消抖10ms

           if(k1==0)   //如果正转按钮按下

           {  

            P1=0x01;        //IN1=1,IN2=0;控制电动机正转

            P0=0X00;        //绿灯常亮

           }

           while(!k1);        //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行

        }

      

        if(k2==0)                //检测是否按下反转按钮

        {

           delay(10);        //消抖10ms

           if(k2==0)        //如果按下反转按钮

           {

             P1=0x02;         //IN1=0,IN2=1,控制电动机反转

             P0=0X01;         //红灯常亮

           }

           while(!k2);           //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行      

        }

        if(k3==0)                  //检测是否按下停止按钮

        {

           delay(10);                //消抖10ms

           if(k3==0)                //如果按下停止按钮

           {

                    m=1;                         //电动机重置为1档

            P1=0X00;                 //IN1=0.IN2=0,电动机停止

            P0=0x02;                 //蜂鸣器响

            delay(1000);         //延时1秒

                        P0=0XFF;                  //灯全熄灭,蜂鸣器不响

            pwm1=0;                         //PWM输出低电平

           }

        while(!k3);                         //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行

        }

        if(k4==0)                          //检测加速按钮是否按下

        {

           delay(10);                   //消抖10ms

           if(k4==0)                        //如果加速按钮按下

           {  

             m++;                                 //档位加一

                         if(m<4){                         //在不超过最高3档的情况下,按下加速按钮,执行以下

              for(t=8;t>0;t--){         //绿灯闪烁8次

                P0=0x03;

                delay(500);

                P0=0X07;

                delay(500);} }

                                if(k6==1&&k7==0)          //如果电动机正转,绿灯常亮

                                P0=0X00;

                                else if(k6==0&&k7==1)         //如果电动机反转,红灯常亮

                                P0=0X01;

                                else P0=0X07;                        //如果电动机停止,灯全熄灭

           }

           while(!k4);                                   //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行

        }

        if(k5==0)                                           //检测减速按钮是否按下

        {

            delay(10);                                   //消抖10ms

            if(k5==0)                                   //如果减速按钮按下

             {  

              m--;                                                //档位减一

                          if(m>0){                                        //当档位未小于一档,按下减速按钮,执行以下

               for(t=8;t>0;t--){                 //红灯闪烁8次

                P0=0x04;

                delay(500);

                P0=0X07;

                delay(500);}}

                                if(k6==1&&k7==0)                 //如果电动机正转,绿灯常亮

                                P0=0X00;

                                else if(k6==0&&k7==1)          //如果电动机反转,红灯常亮

                                P0=0X01;

                                else P0=0X07;                          //如果电动机停止,灯全熄灭

             }

             while(!k5);                         //判断按钮是否松开,不松开一直死循环,松开后跳出循环,继续执行

        }

                if(m>3)m=3;                                          //档位最大为3档

                if(m<1)m=1;                                     //档位最小为1档

     }

}

void init()                                                         //定义定时器的初始化

[1] [2]
关键字:单片机控制  直流电机  蜂鸣器 引用地址:单片机控制直流电机程序

上一篇:基于单片机的精简八路抢答器
下一篇:基于51单片机矩阵键盘的简易计算器制作

推荐阅读最新更新时间:2024-11-10 10:53

【自学51单片机】9 -- 步进电机原理、蜂鸣器原理,单片机IO
【自学51单片机】9 -- 步进电机原理、蜂鸣器原理,单片机IO口的结构,上下拉电阻 1、单片机IO口的结构 单片机IO口有四种结构:准双向IO,开漏输出、强推挽输出和高阻态输出。内部结构如下图。 T1和T2为MOS管,靠电压导通的原件。(1)准双向IO口特点:内部输出为1,才能正常读取外部信号。(2)开漏输出特点:必须外加上拉电阻,不然单片机IO电平是个不确定的态。(3)强推挽输出特点:可输出或输入高电流,驱动能力强。(4)强阻态特点:状态取决与外部输入。 标准51单片机P0默认开漏输出。 2、上下拉电阻 上下拉电阻:上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻也起限流作用,下拉电阻同理。 上拉电
[单片机]
【自学51单片机】9 -- 步进电机原理、<font color='red'>蜂鸣器</font>原理,单片机IO
AVR单片机控制的开关电源
单片机 控制开关电源,单从对电源输出的控制来说,可以有几种控制方式。 其一是 单片机 输出一个电压(经DA芯片或PWM方式),用作电源的基准电压。这种方式仅仅是用单片机代替了原来的基准电压,可以用按键输入电源的输出电压值,单片机并没有加入电源的反馈环,电源电路并没有什么改动。这种方式最简单。 其二是 单片机 扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,调整DA的输出,控制PWM芯片,间接控制电源的工作。这种方式单片机已加入到电源的反馈环中,代替原来的比较放大环节,单片机的程序要采用比较复杂的PID算法。 其三是 单片机 扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,输
[单片机]
STM8 开发故事--之蜂鸣器 BEEP设计坑爹的引脚(一)
为什么选stm? 最近才又开始搞stm8开发。虽然以前从来没用过stm的产品,但是stm在嵌入界鼎鼎大名可是早有耳闻。据某IC供应商提供的数据当今(2019年)56%的MCU都是stm的。要说为什么这么火,最直接的原因:便宜而且功能强大。淘宝上stm8s的最小系统板才1块多RMB。 因为要要开发的产品要用液晶显示数字,而且是用电池供电。所以选择了stm8L052c6t6。有朋友推荐我用华大的HC32L136。本想支持国行的,但是供应商不跟进就涮了,还有一个原因又怕资料太少,还是暂时放弃了。我以前做过51的项目,同样的51atmel的质量就好过华邦,华邦掉程序的概率要高很多。这也是我选stm的原因。于是在tb买了一块带液晶显示的
[单片机]
STM8 开发故事--之<font color='red'>蜂鸣器</font> BEEP设计坑爹的引脚(一)
合泰单片机控制5线4相步进电机控制程序
;步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 28BYJ48步进电机步进角为 5.625度 ; A组线圈对应 PC.0 ; B组线圈对应 PC.1 ; C组线圈对应 PC.2 ; D组线圈对应 PC.3 ; 正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转5.625度) ; 完整的源程序下载:http://www.51hei.com/f/htbjdj.rar include HT66F50.inc ORG 0000H JMP A1 ORG 0014H ;多功能中断入口地址 JMP ZD1 ORG 002DH Q1: DC 03H ; 0 AB DC 06H ;
[单片机]
S3C6410的PWM驱动实例
我们使用PWM来控制蜂鸣器,主要是两种功能,一是使能蜂鸣器,并设置其频率;二是禁止蜂鸣器。这些操作均可通过ioctl来完成。所以在pwm的设备驱动中,主要也就是ioctl这个函数。 首先,我们要定义两个命令,用在ioctl函数中的switch语句中,至于怎么来定义这两个命令呢?其实简单的做法,我们可以将其定义为两个不同的常量,能用在switch语句中即可,但是这样会造成一定的问题。例如,其他的设备也有支持设个命令的,例如串口支持设置波特率等,很有可能在写代码时不小心,写成了串口,结果调用的时候,驱动没报错,因为串口也支持这个命令,解决办法就是不同的设备支持不同的命令号,及时目前有一部分驱动依旧是使用之前的那种简单定义命令号的方
[单片机]
直流电机调速器电枢电压的设置
直流电机调速器的电枢电压,电枢电流,励磁电流的设置是通过拨码开关来设定的,SSD590P直流电机调速器的这些参数是通过菜单来设定,这也是直流电机调速器的最大区别,软件的菜单基本没变。 下面来详细讲解直流电机调速器的电枢电压、电流等参数的设置。 直流电机调速器面板开关布置介绍: 1)面板上六个方形金属膜电位器,从左往右依次为:电枢电流百位设定值, 电枢电流十位设定值,电枢电流个位设定值,励磁电流十位设定值,励磁电流个位设定值,励磁电流小数点位设定值。 2)右侧VA CAL四位拨码开关是用来设定电枢电流的,拨码开关打在右侧的位置代表1,打在左侧位置代表0,电枢电压根据以上参数。设定电枢电流为29.6(直流电机调速器的电枢电流没
[嵌入式]
改变直流电机的转速
直流电机是一种非常重要的机电设备,现在广泛应用于各个领域中。但是在实际使用过程中,有时候需要改变其转速来满足不同的工作需求。接下来我们将详细介绍改变直流电机转速的原理及方法。 一、直流电机转速的原理 直流电机是由电枢、永磁体和电刷组成的。在电机的旋转过程中,电刷通过交换电极极性将电能转换成机械能,驱动电枢和永磁体旋转。电机的转速与电压和电流密度有关系,可以通过改变这些参数来改变电机的转速。 二、改变直流电机转速的方法 1. 改变电机电压 直流电机转速与电压成正比。增大电压可以使电机转速加快,降低电压可以使电机转速减慢。 2. 改变电机电流密度 电机的电流密度通常也称电流强度,是指通过电机的电流,在一定时间内通过电机的电量。电机的转
[嵌入式]
蜂鸣器驱动
蜂鸣器是S3C6410开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫。 (1)前提是eclipse中安装了CDT插件。 (2)在eclipse中单击File-New-Other,选择C Project项,单击next进行相应的设置,例如工程名为word_count,然后Finish建立一个空的C工程。 (3)单击word_count工程右击菜单中的New-Soruce Folder,打开New Soruce Folder对话框,在Folder name文本框中输入src,然后Finish建立保存linux驱动源代码文件的目录。 (4)单击src目录,右键单击Import打开对话框,选择File Syst
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved