历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | 单片机按键&串口控制步进电机正反转调速含程序和仿真

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;

推荐阅读

史海拾趣

Elpakco Inc公司的发展小趣事

Elpakco Inc公司的创立,源于创始人对电子行业未来趋势的敏锐洞察。在电子科技日新月异的时代,创始人凭借在半导体封装领域的丰富经验和深厚技术积累,决定创立一家专注于高精度电子元件封装的公司。初创时期,资金紧张、技术难度大、市场竞争激烈,但创始人带领团队夜以继日地研发,不断突破技术瓶颈,终于成功研制出第一款高精度、高可靠性的电子封装产品,为公司的发展奠定了坚实的基础。

Applied Micro Circuits (MACOM)公司的发展小趣事

在某一时期,MACOM宣布收购Applied Micro Circuits Corp.,这一举动标志着公司在业务领域上的又一次重要扩张。收购完成后,MACOM迅速进行了业务分拆,将不感兴趣的服务器芯片业务与自身的主营业务进行剥离。这一战略调整使得MACOM能够更专注于自身擅长的领域,同时也为被剥离的业务提供了更好的发展机会。

Exar [Exar Corporation]公司的发展小趣事

Exar公司一直注重全球布局和客户支持。公司在全球设立了多个研发基地和客户服务中心,以确保能够为客户提供及时、高效的技术支持和服务。此外,Exar还积极与全球各地的合作伙伴建立合作关系,共同推动电子行业的发展和进步。这种全球化的战略布局不仅为Exar赢得了更多的市场份额和客户信任,也为其未来的发展奠定了坚实的基础。

以上五个故事简要概述了Exar在电子行业中的重要发展历程。通过这些故事,我们可以看到Exar如何通过不断的技术创新、市场拓展和全球化战略来保持其在行业中的领先地位。

Cincon公司的发展小趣事

随着业务的快速发展,Cincon开始将目光投向国际市场。1999年,公司在美国加州设立了办事处,以便更好地服务北美市场。同一年,为了应对日益增长的生产需求,Cincon在中国东莞设立了新工厂。这些举措极大地提升了公司的生产能力和国际市场竞争力,为Cincon的全球化发展打下了坚实的基础。

EDSYN公司的发展小趣事

Econais公司自创立之初,就致力于研发超低功耗(ULP)的无线模块。随着物联网(IoT)和机器对机器(M2M)通信技术的兴起,市场对低功耗嵌入式模块的需求日益增长。Econais工程师团队凭借几十年的行业经验,成功研发出了一系列超低功耗Wi-Fi模块,这些模块不仅性能卓越,而且易于集成,为各种物联网应用提供了强大的技术支持。

Cavium Networks公司的发展小趣事

在电子行业的快速发展中,Cavium Networks 公司凭借其创新的技术和敏锐的市场洞察力,成功推出了基于 MIPS64 的单核和双核 OCTEON 处理器系列。这款处理器为网络、无线、控制和存储应用提供了高度集成化和低成本的64位计算解决方案,成为当时业界领先的面向下一代智能网络的新型处理器。OCTEON 处理器的诞生,标志着 Cavium Networks 在网络通信领域的技术实力得到了进一步提升,也为其后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

FPGA内部块RAM的应用技巧

FPGA内部块RAM的应用技巧…

查看全部问答>

LPC1100中文版--完成版

把soso给的pdf合并到一起了,方便大家下载 同时感谢soso提供这么好的资料 …

查看全部问答>

Altera参考设计- 10-Gbps Ethernet IP User Guide

This datasheet describes the Altera® 10-Gbps Ethernet IP core which implements the IEEE 802.3 2005 and 802.1Q Ethernet standards. You can use the Quartus® II software to parameterize and implement this IP core in your de ...…

查看全部问答>

驱动程序的makefile详细解释

obj-m (tab)= module.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD (tab) := $(shell pwd) all: (tab) $(MAKE) –C $(KERNELDIR) M=$(PWD) clean: (tab)rm –rf *.o *~ core .depend .*.cmd *.ko *.mod.c .temp_version ...…

查看全部问答>

wince初级问题:builder生成的nk.bin是做什么的?请大侠详细说明下!

我用vs2005 + platform 6.0创建了一个小项目(\'hello world application\').build run-time image 生成之后的nk.bin是做什么用的?还有我现在有一个wince的虚拟器,怎么样在上面跑起来这个程序?谢谢指教。…

查看全部问答>

求助向CE5.0开始菜单中添加自己的应用程序的问题

   我想在开始菜单的程序菜单项中添加自己开发的应用程序,在网上查了下资料,说是给应用程序建立快捷方式,然后把快捷方式文件放在Program Files目录下,这样就可以实现添加功能,我给自己的应用程序建立了一个快捷方式文件,把这两个文 ...…

查看全部问答>

fm1182e

请用过fm1182e的朋友帮下忙,我用fm1182e做电话机的全双工面提,现遇到2个问题:1、只要让fm1182工作在dsp下,电源(稳压电源或电池都试过)就有纹波,喇叭有比较大的电流声              2、侧音很大, ...…

查看全部问答>

寻求程控交换机缓存器供货商

寻求程控交换机缓存器供货商 我们公司是从事程控交换机计费软件的开发,现在需要计费缓存器来存储话单,缓存器主要是用来存话单。是串口连接,寻求能够长期给我们公司供货的厂家 联系方式:13601039521 msn:zmfhawk@hotmail.com …

查看全部问答>

通过GPS坐标计算两点的距离,有什么比较精确和运算效率比较高的办法

通过GPS坐标计算两点的距离,有什么比较精确和运算效率比较高的办法。 根据两个点的坐标(经纬度)计算它们之间的距离的算法。…

查看全部问答>

发个AVR的网络开发板资料

AVRNET !~包括原理图,源码以及web-loger [ 本帖最后由 wanghongyang 于 2010-10-7 19:44 编辑 ]…

查看全部问答>