博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
步进电机驱动控制
阅读量:5917 次
发布时间:2019-06-19

本文共 1788 字,大约阅读时间需要 5 分钟。

#include <reg52.h>

typedef unsigned char uchar;
uchar direction = 0;  //0为正转,1为反转
uchar onoff = 0; //关为0,开为1
uchar n = 0; //每次定时器中断触发时n++,当n==max时电机转动1/4
uchar max = 10;
uchar index = 0; //通过index指示电机转动,AB,BC,CD,DA
sbit LED = P3 ^ 7; //当n==max时LED闪烁提示
int main()
{
    /* LED */
    P2 = 0xff;
    /* 初始化中断 */
    EA = 1;
    EX0 = 1; //要用到的中断是两个外部中断和定时器中断0
    IT0 = 1;
    EX1 = 1;
    IT1 = 1;
    ET0 = 1;
    /* 定时器0 */
    TMOD = 0x01; //使用定时器0,方式1
    TH0 = (65536 - 10000) / 256; //12MHz晶振下,定时器为10ms触发中断,更方便观察转动情况
    TL0 = (65536 - 10000) % 256;
    TR0 = 1;
    while(1)
    {
        switch(P0)
        {
        case 0xfe: //11111110
            max = 1;
            P2 = 1;
            break;
        case 0xfd: //11111101
            max = 10;
            P2 = 2;
            break;
        case 0xfb: //11111011
            max = 50;
            P2 = 3;
            break;
        case 0xf7: //11110111
            max = 100;
            P2 = 4;
            break;
        }
    }
}
void Stop()interrupt 0
{
    onoff++;
    if (onoff > 1)
        onoff = 0;
}
void int1()interrupt 2
{
    direction++;
    if (direction > 1)
        direction = 0;
}
void delay50ms(void)
{
    unsigned char a, b;
    for(b = 173; b > 0; b--)
        for(a = 143; a > 0; a--);
}
void time()interrupt 1
{
    TH0 = (65536 - 10000) / 256;
    TL0 = (65536 - 10000) % 256;
    if (onoff == 1) //在开状态下
    {
        if (n == max) //设定档位速度,经过了max次中断后,步进电机转1/4圈
        {
            LED = 0; //每次n==max时LED闪烁
            delay50ms();
            LED = 1;
            if (direction == 0)
            {
                switch(index) //正转时以AB,BC,CD,DA顺序
                {
                case 0:P1 = 0x03;break; //00000011 AB高电平
                case 1:P1 = 0x06;break; //00000110 BC高电平
                case 2:P1 = 0x0c;break; //00001100 CD高电平
                case 3:P1 = 0x09;break; //00001001 DA高电平
                }
                index ++;
                if (index == 4) //步进电机转完一圈时index清零
                    index = 0;
                n = 0; //到达max,n重置为0
            }
            if (direction == 1)
            {
                switch(index) //反转时以DA,CD,BC,AB顺序
                {
                case 0:P1 = 0x09;break;
                case 1:P1 = 0x0c;break;
                case 2:P1 = 0x06;break;
                case 3:P1 = 0x03;break;
                }
                index ++;
                if (index == 4)
                    index = 0;
                n = 0;
            }
            else n = 0;
        }
        n++; //n!=max时,n++
    }
    else n = 0; //在关状态下,n始终为0,无法触发电机转动
}

转载于:https://www.cnblogs.com/lk98/p/9763172.html

你可能感兴趣的文章
SQL Server中sys.syslogin中updatedate字段的浅析
查看>>
从头认识Spring-2.4 基于java的标准注解装配-@Inject(2)-通过set方法或者其它方法注入...
查看>>
JavaFX本地应用自己主动更新功能的实现FXLauncher
查看>>
JS实现关闭当前子窗口,刷新父窗口及调用父窗口的方法
查看>>
MapReduce源代码分析之JobSubmitter(一)
查看>>
/proc/modules分析
查看>>
POJ 2253 Frogger
查看>>
Sublime Text 格式化代码快捷键
查看>>
HTML5新特性:元素的classList属性与应用
查看>>
linux下yum命令出现Loaded plugins: fastestmirror
查看>>
String、StringBuffer、StringBuilder
查看>>
字节、字、位、比特,这四者之间的关系
查看>>
JVM 内存模型
查看>>
BZOJ离线版
查看>>
Redis 集合 set 操作, 有序集合
查看>>
2012年1月编程语言排行榜:Objective-C成为年度语言
查看>>
pku Blue Jeans 字符串匹配
查看>>
css3 calc()功能小窥
查看>>
因为工作,急需待补的东西(笔记)
查看>>
RoR transaction
查看>>