单片机按键&串口控制步进电机正反转调速含程序和仿真

发布者:数字狂舞最新更新时间:2019-11-08 来源: 51hei关键字:单片机  按键  串口控制  步进电机  正反转调速 手机看文章 扫描二维码
随时随地手机看文章

包含程序和仿真


功能:按键或串口发送字符指令,控制步进电机正转、反转、停止、加速、减速动作


仿真过程可直接通过按下电脑键盘控制

仿真原理图如下

单片机源程序如下:

#include

#define uint  unsigned int

#define uchar unsigned char

//------8拍-----

uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};                        //正转

uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};                        //反转


sbit K1=P3^0;        //停止

sbit K2=P3^1;        //正转

sbit K3=P3^2;        //反转

sbit K4=P3^3;        //加速

sbit K5=P3^4;        //减速


uchar state=0;        //状态变量


uint Time=60;         //延时时间,用于调速


unsigned char receiveData='0';


void UsartConfiguration();           //初始化串口


void delay(uint ms)                           //延时,用于调速

{

        uint t;

        while(ms--)

                for(t=0;t<120;t++);

}


void motor_zz()                  //正传函数

{

        uint j;

        for(j=0;j<8;j++)

        {

                if(P3==0xfb)

                        break;

                P1=zz[j];

                delay(Time);

        }

}


void motor_fz()                  //反转函数

{

        uint j;

        for(j=0;j<8;j++)

        {

                if(P3==0xfb)

                        break;

                P1=fz[j];

                delay(Time);

        }

}


void main()

{

        UsartConfiguration();

        while(1)

        {

                while(state==0)                        //状态0,停止

                {

                        if((K2==0)||(receiveData=='z'))           //按下K2或串口接收到'z',电机正转

                        {

                                state=1;

                                receiveData='0';

                                break;

                        }

                        if((K3==0)||(receiveData=='f'))           //按下K3或串口接收到'f',电机反转

                        {

                                state=2;

                                receiveData='0';

                                break;

                        }

                        P0=0xfb;

                        P1=0x03;

                }


                


                while(state==1)                        //状态1,正转

                {

                        if((K1==0)||(receiveData=='t'))           //按下K1或串口接收到'f',电机反转

                        {

                                state=0;

                                receiveData='0';

                                break;

                        }

                        if((K2==0)||(receiveData=='z'))                //按下K2或串口接收到'z',电机正转

                        {

                                state=1;

                                receiveData='0';

                                break;

                        }

                        if((K3==0)||(receiveData=='f'))                //按下K3或串口接收到'f',电机反转

                        {

                                state=2;

                                receiveData='0';

                                break;

                        }

                        if((K4==0)||(receiveData=='+'))                //按下K4或串口接收到'+',电机加速

                        {

                                Time=Time-5;

                                if(Time<20)

                                Time=20;

                                while(K4==0);

                        }

                        if((K5==0)||(receiveData=='-'))                //按下K5或串口接收到'-',电机减速

                        {

                                Time=Time+5;

                                if(Time>100)

                                Time=100;

                                while(K5==0);

                        }

                        motor_zz();                 //状态1,正转

                }


                while(state==2)                   //状态2,反转

                {

                        if((K1==0)||(receiveData=='t'))                 //按下K1或串口接收到'f',电机反转

                        {

                                state=0;

                                receiveData='0';

                                break;

                        }

                        if((K2==0)||(receiveData=='z'))                 //按下K2或串口接收到'z',电机正转

                        {

                                state=1;

[1] [2]
关键字:单片机  按键  串口控制  步进电机  正反转调速 引用地址:单片机按键&串口控制步进电机正反转调速含程序和仿真

上一篇:LED8x8点阵显示屏设计报告+PCB原理图与单片机程序
下一篇:TTP229触摸模块的51单片机驱动程序

推荐阅读最新更新时间:2024-11-07 20:42

基于51单片机的简易电子琴课程设计
1.本设计采用51单片机作为主控制器 2.外部加上放音设备如喇叭等,来实现音乐演奏控制器的硬件电路 3.用8个手工的按键发出八个音阶 制作出来的电子琴实物图如下: 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 视频讲解: 电子琴原件清单 1.8欧0.25w小喇叭 2.8050三极管*2 3.10k电阻*2 4.30欧姆电阻 5.40脚座 6.STC89c51 7.10uf电容 8.30pf电容*2 9.小按键*8 10.自锁开关 11.DC电源座 12.12m晶振 13.7*9万用板 14.导线若干 15.焊锡若干 16.usb电源线或电池盒+DC电源插头 单片机源程序如下: #include reg
[单片机]
基于51<font color='red'>单片机</font>的简易电子琴课程设计
将基于AT89C2051的解码器应用于安防系统
1 引 言      目前,我国应用极广的编解码器是Princeton公司生产的具有531441(3 12 )种状态的PT2262编码芯片和与之配套的PT2272解码芯片。但一片PT2272只能对一种地址的PT2262的15种状态进行解码,对于较大的编解码保安防盗控制系统,常使用多片PT2272组合解码,但仍远远满足不了大中型安防系统的设计要求。因此,采用AT89C2051单片机,实现了PT2262的大容量解码功能。 2 PT2262的编码原理      PT2262(可参阅http://www.princeton.com.tw)的工作原理如图1所示,图中K0~K7为地址端,应该预置其状态;K8~K11为数据端,按下按钮开
[单片机]
单片机实现通用存贮器IC卡的读写
    摘要: 本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。     关键词: E2PROM I2C总线 FLASH ROM IC卡 AT24C01 AT89C2051 1 概述 通用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的
[应用]
MCS-51系列单片机寻找操作数存放单元的地址的方式
寻找操作数存放单元的地址的方式,共6种方式。 1.立即数寻址 所要找的操作数是一二进制数或十进制数,出现在指令中,用“#”作前缀 MOV A,#20H 2.寄存器寻址 操作数存放在工作寄存器R0 ~ R7中,或寄存器B中。 MOV A,R2 3.直接寻址 指令中直接给出操作数的地址。 MOV A,30H MOV 30H,DPH 4.寄存器间接寻址 指令中寄存器的内容作为操作数存放的地址,指令中间接寻址寄存器前用“@”表示前缀。 MOV R0,#30H MOV A,@R0 MOV A,#20H MOV R1,#40H MOV @R1,A 5.变址寻址 操作数地址 = 变地
[单片机]
单片电机控制器进一步简化高性能电机应用的设计
  意法半导体推出具有更强功能的电机控制系统级芯片。新产品针对安全摄像头、自动取款机、自动售票机、舞台灯光、打印机以及自动售货机等应用所开发,让设备厂商以更低的成本实现反应更快的高性能电机驱动器。   ‘digital SPIN’(DSPIN)采用意法半导体独有的BCD制程,整合了控制步进电机所需的数字控制、模拟测量、功率转换等各种电路。这是意法半导体dSPIN产品系列的首款单片电机控制IC,可帮助设计人员避免专门的软硬件设计工作、缩减元器件数量和印刷电路板空间以及加快产品上市时间。新产品采用硬件执行电机控制计算,控制电机只需微控制器提供加速、减速、转速以及目标位置指令,从而简化了软件设计,进一步释放微控制器的资源,以支持更多
[嵌入式]
E2.2 单片机开源框架--时间片轮询--思路
时间片轮询--思路 实际上大部分文章把时间片轮询框架讲复杂了,它的内涵是: 将每个工作划分为一个子任务,你可以把子任务看成一个个工作人员 每个任务通过主程序定时去检查或者询问,你可以把主程序看成一位领导者 领导定时询问每位工作人员你准备好了吗?或者工作做完了吗?进度如何? 假设你是其中的一位工作人员 你的工位位置有几个信号灯(指示牌),空闲、计数、准备好、忙碌中,这就是工作状态(状态机的状态) 领导只是问你一句你的工作状态,简单直接点,你就回复你现在的状态是什么就行了 接着领导又去问其他人员 如果你已经准备好了去做一件事了,那就去做,领导会把一定的资源给你(例如材料、工具、场地,这时候其他人如果同时也要用这些东西可
[单片机]
第三节 趣讲51单片机之P1P2P3口深入讲解
一、P1口 P1口是4组Parallel Ports中最简单的。其结构图如下: 与P0口的区别是:由于没有端口复用功能,所以,P0口的V1变成了一个上拉电阻。 由于内部就有上拉电阻,所以,作为GPIO时,P1口不需要接上拉电阻,当然,您接了也没关系啦,就相当于两个上拉电阻并联嘛。 读端口、读引脚、写功能在P0中已经讲得非常详细了,此处略个一万字。 二、P2口 P2口的原理图如下图: 咋一看,和P0口有点像,都有控制信号,选择作为 地址/数据 总线还是作为GPIO;又和P0口有些不同,P2口没有推挽式输出的结构,即没有V1 MOS管。 我们说过,P0在作为 地址/数据 总线时
[单片机]
第三节 趣讲51<font color='red'>单片机</font>之P1P2P3口深入讲解
什么是GD32 MCU读保护?
如今电子产品市场风云变幻,暗流汹涌,有没有小伙伴遇到自己费了大力气写出来的代码,很容易就被别人“借鉴”了,真的是让闻者伤心,听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢?答案当然是肯定的,GD32 MCU全系列都有“读保护”功能,我们以GD32F30x系列为例,来看下用户手册中的选项字节的介绍: 我们可以看到,地址0x1fff f800存储的是安全保护值,也就是我们所说的读保护。当该值为0xA5的时候,MCU处于无保护状态,此时可以通过Jlink、GDlink配合一些上位机比如Jflash、GDlink Programmer就可以读出,当然,通过串口ISP也可以读出代码;当读保护值为非0xA5时,
[单片机]
什么是GD32 <font color='red'>MCU</font>读保护?
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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