单片机+ULN2003A步进电机控制系统(正反转+加减速)

发布者:rho27最新更新时间:2019-12-11 来源: 51hei关键字:单片机  步进电机  控制系统  正反转  加减速 手机看文章 扫描二维码
随时随地手机看文章

51单片机步进电机的正反转。加减速控制
电路原理图如下:
原理图分解.jpg

仿真原理图如下
0.png 

单片机源程序如下:

#include

#include

#include


#define uchar unsigned char

#define uint unsigned int


sbit RS = P2^4;//1602数据/命令选择端(H:数据寄存器L:指令寄存器) 

sbit RW = P2^5;//1602读/写选择端 

sbit E  = P2^6;//1602使能信号端


sbit key1=P3^0;//用户按键

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

sbit key5=P3^4;


uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反转表格

uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正转表格



uchar table1[]="dir: +  spe:005";

uchar table2[]="cir:000 ang:000";


uchar num;

uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq;

//1键值2键值标志3速度4正转标志5正转圈数6反转标志7反转圈数8正转角度9反转角度10选择

float zang,fang;

/******************************************************************/

/*                    延时函数 Xms                                   */

/******************************************************************/

void delay(uint z)

{

        uint x,y;

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

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

}

/******************************************************************/

/*                   LCD1602写命令操作                            */

/******************************************************************/

void WriteCommand(uchar com)

{

        delay(5);//操作前短暂延时,保证信号稳定

        E=0;

        RS=0;

        RW=0;

        P0=com;

        E=1;

        delay(5);

        E=0;

}

/******************************************************************/

/*                   LCD1602写数据操作                            */

/******************************************************************/

void WriteData(uchar dat)

{

        delay(5);  //操作前短暂延时,保证信号稳定

        E=0;

        RS=1;

        RW=0;

        P0=dat;

        E=1;

        delay(5);

        E=0;

}

/******************************************************************/

/*                           1602初始化程序                       */

/******************************************************************/

void InitLcd()//1602初始化程序

{

        delay(15);

        WriteCommand(0x38); //display mode

        WriteCommand(0x38); //display mode

        WriteCommand(0x38); //display mode

        WriteCommand(0x06); //当读或写一个字符后地址指针加一,且光标加一

        WriteCommand(0x0c); //显示开及光标不显示

        WriteCommand(0x01); //清屏


        WriteCommand(0x80);

        for(num=0;num<15;num++)//第一行的显示

        {

                WriteData(table1[num]);

                delay(15);

        }

        WriteCommand(0x80+0x40);//第二行的显示

        for(num=0;num<15;num++)

        {

                WriteData(table2[num]);

                delay(15);

        }


}

/******************************************************************/

/*              独立键盘扫描函数                                  */

/******************************************************************/

void keyscan()  

{        

        

        P3=0xff;//拉高P3口,以读取P3口的值

        if(key1==0)//键1被按下

        {

                delay(5);//延时消抖

                if(key1==0)

                {

                        flag=1;

                }

                while(!key1);

                delay(5);//延时消抖

                while(!key1);//松手检测

        }

        if(key2==0)

        {

                delay(5);

                if(key2==0)

                {

                        flag=2;

                }

                while(!key2);

                delay(5);

                while(!key2);

        }

        if(key3==0)//键1被按下

        {

                delay(5);//延时消抖

                if(key3==0)

                {

                        flag=3;

                }

                while(!key3);

                delay(5);//延时消抖

                while(!key3);//松手检测

        }

        if(key4==0)

        {

                delay(5);

                if(key4==0)

                {

                        flag=4;

                }

                while(!key4);

                delay(5);

                while(!key4);

        }

        if(key5==0)

        {

                delay(5);

                if(key5==0)

                {

                        flag=5;

                }

                while(!key5);

                delay(5);

                while(!key5);

        }

}

/******************************************************************/

/*                           1602显示3位数                       */

/******************************************************************/

void write_sfm(uchar add,uint date)//1602显示

{

        uchar bai,shi,ge;

        bai=date/100;

        shi=date%100/10;

        ge=date%10;

        WriteCommand(0x80+add);//设置数据地址指针

        WriteData(0x30+bai);

        WriteData(0x30+shi);

        WriteData(0x30+ge);

        WriteData(0x20);

}

/******************************************************************/

/*                           键值处理                             */

/******************************************************************/

void handle_flag() 

{        


        uchar select1;

        if(TR0==0&&TR1==0)

        {        

                if(flag==1) //正转

                {

                        WriteCommand(0x80+0x05);

                        WriteData('+');

                        delay(20);

                        select=0;

                }

                if(flag==2) //反转

                {

                        WriteCommand(0x80+0x05);

                        WriteData('-');

                        delay(20);

[1] [2]
关键字:单片机  步进电机  控制系统  正反转  加减速 引用地址:单片机+ULN2003A步进电机控制系统(正反转+加减速)

上一篇:单片机自行车测速系统+源程序+proteus仿真
下一篇:非常完备的按键操作系统,单击、双击、N击,长按。可移植

推荐阅读最新更新时间:2024-11-11 08:45

基于单片机的来电显示电话测试仪的设计
1 引 言 目前,随着电信部门电话主叫识别(来电显示)业务的普遍开通,具有主叫识别功能的电话机越来越普及。根据这个情况,我们设计了一台可以测试主叫识别功能的多功能电话测试仪,采用了CML(ConsumerMicrocircuit Limited)公司的CMX860作为其中来电显示测试电路的核心元件,单片机采用了SST89C58。 1.1 CMX860简介 CMX860是一块通用的低功耗电话机信令收发集成电路。CMX860包含DTMF编码解码器、V.23调制解调器,具有铃流检测、话机摘机检测等功能,它可以广泛应用于由线路提供电源的电话设备。 CMX860的主要特性有: (1) 提供V.23 1200/75bps的FSK信号发
[单片机]
基于<font color='red'>单片机</font>的来电显示电话测试仪的设计
单片机LED点阵的横向移动(动态显示)
上下移动我们会了,那我们还想左右移动该如何操作呢? 方法一、最简单,就是把板子侧过来放,纵向取模就可以完成。 这里大家是不是有种头顶冒汗的感觉?我们要做好技术,但是不能沉溺于技术。技术是我们的工具,我们在做开发的时候除了用好这个工具外,也得多拓展自己解决问题的思路,要慢慢培养自己的多角度思维方式。 那把板子正过来,左右移动就完不成了吗?当然不是。大家慢慢的学多了就会培养了一种感觉,就是一旦硬件设计好了,我们要完成一种功能,大脑就可以直接思考出来能否完成这个功能,这个在我们进行电路设计的时候最为重要。我们在开发产品的时候,首先是设计电路,设计电路的时候,工程师就要在大脑中通过思维来验证板子硬件和程序能否完成我们想要的功能,一旦硬件做
[单片机]
<font color='red'>单片机</font>LED点阵的横向移动(动态显示)
单片机控制的自平衡小车设计探讨
最近有很多网友在问,关于用单片机控制的自平衡小车制作的问题,其实这在飞思卡尔智能车比赛的时候,清华的卓晴老师的那篇文档里面说的很清楚,很多没参加比赛的人不知道或者不重视这个文档,我用自己的理解来写一个总结希望对大家有帮助,大神勿拍砖。 首先确定一下我们的目标是什么?我们得让车站起来,小车整个身体只有电机可以控制轮子,自然对小车的控制就落在了对单片机程序对电机的控制上。很多参加比赛的朋友由于车模是组委会发的,没去想过什么样的电机是合适的? 自然启动会快,反映越快的直流电机最合适。对于直流电机的控制调速,大家都知道最常用的是脉宽调制即PWM方式,这时候就得选好电机驱动芯片了,跟你的电机匹配,电流要扛的住。再一个,把小车想成一个骑独轮
[单片机]
一种用于压力传感器的温度控制系统设计
在微电子器件领域,针对SiC器件的研究较多,已经取得了较大进展,而在MEMS领域针对SiC器件的研究仍有许多问题亟待解决。在国内,SiC MEMS的研究非常少,因而进行SiC高温MEMS压力传感器的研究具有开创意义。碳化硅(SiC)具有优良的耐高温,抗腐蚀,抗辐射性能,因而使用SiC来制作压力传感器,能够克服Si器件高温下电学、机械、化学性能下降的缺陷,稳定工作于高温环境,具有光明的应用前景。 然而当外界温度较大时,压力传感器受温度影响精度不高,会产生零点漂移等问题,从而增大测量误差。于是尝试加工一个腔体,把压力传感器和温度传感器放置在里面形成一个小的封闭腔体,在外界温度较高或较低的情况下,用加热装置先升温到几十度并维持这一温度,
[单片机]
一种用于压力传感器的温度<font color='red'>控制系统</font>设计
STM32单片机使用ST-LINK调试程序时不能设断点
我使用的是STM32单片机,昨天使用ST-LINK调试程序时,发现有些语句不能设断点。程序编译时OK的,没有错误,将程序烧录入单片机后程序看着也能正常运行,但是点击keil中debug按钮后程序进入调试状态,程序并没有停留在main函数的第一条语句,而是停留在别处。main函数第一条语句不能设置断点。 经过在网上查阅资料,发现可能是由于keil软件代码优化的问题。经过测试,发现果然是代码优化的问题。关于以上问题的解决方法:点击keil中“options for target”- 点击 C/C++ ,修改其中的 Optimization 一栏,选择“Level 0”即可。重新按keil中debug按钮进入调试状态,语
[单片机]
PIC单片机之电容触摸按键
PIC单片机电容触摸按键,最方便的地方就是外围电路简单,不需要任何外围元器件。只要从引脚连接出一条线到焊盘上即可。 电容按键触摸的原理 PIC单片机通过松弛振荡器是一个自激 RC 振荡器,它使用 2 个带 SR 锁存的比较器来改变感应电容器电压的充电方向,进行充电或者放电。通俗点说就是在管脚上产生了一个三角波。当手指按上去后就引入了一个额外的电容 使得 充放电的周期沿长。也就是说人的手靠近的时候充电时间沿长了,然后放电时间也加长了。这样我们就可以同过判断 RC震荡频率的快慢来判断 是否有手指按下。 如何判断RC震荡频率的快慢呢? 这就和我们平时判断一个人做事情快慢是一样的。比如我们给个10S的时间,让两个人吃薯条如果吃的
[单片机]
PIC<font color='red'>单片机</font>之电容触摸按键
51单片机控制的智能台灯设计
功能及概述 本系统组成如图一所示,主要由三部分组成: 传感器及信号处理部分:检测人体辐射红外信号及光强信号经过处理后变成可处理的数字信号 以80C51组成的中央处理单元:处理信号并发出控制命令 提醒电路及灯光控制电路 :给出提醒信号并根据80C51给出的命令控制灯光 整个系统是以80C51控制下工作的。其工作过程为:当环境光比较强时,光敏电阻阻值比较小,信号处理电路检测到低电平信号,禁止热释电红外传感器工作,省去了80C51处理过程。当环境光比较弱时,光敏电阻阻值变大,信号处理电路接收到高电平,从而启动热释电红外传感器工作。热释电红外传感器1探测比较远的距离,当人体进入到传感器1的控测范围内且光强较弱时,信号检测电
[单片机]
51<font color='red'>单片机</font>控制的智能台灯设计
MSP430单片机中断系统
中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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