单片机控制步进电机程序(含电路原理图和程序)

1、设计电路:

主要元件:与门AND_5(5路),ULN2003A(放大电压用来驱动电机),AT89C52,步进电机MOTOR-STEPPER

单片机控制步进电机总结(单片机控制步进电机)(1)

步进电机连接电路图

2、编写程序:

#include #define uint unsigned int #define uchar unsigned #include #define uint unsigned int #define uchar unsigned char int State = 0; char int state = 0; //定义电机的状态 state = 1 正转 state = -1电机反转 state = 0 电机停止 uint time = 50; //定义延时时间 int step[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//每一步的通电顺序 //几个控制开关量 sbit drive = P3^5; sbit stop = P3^6; sbit re_drive = P3^7; sbit add = P3^1; sbit reduce = P3^0; //延时程序 x*10ms void Delay_xms(uint x) { uint i,j; for(i=0;i<x;i ) for(j=0;j<112;j );//10ms } //反转 void Move_reverse(uint time) { uint i; for(i= 0;i < 8;i ) { P2 = step[i]; Delay_xms(time); } } //正转 void Move(uint time) { int i; for(i= 7;i >= 0;i--) { P2 = step[i]; Delay_xms(time); } } //定义外部中断INT0的中断函数 开关量变化时做出反应 void ChangeState() interrupt 0 { if(!drive) { state = 1; drive = 1; } if(!stop) { state = 0; stop = 1; } if(!re_drive) { state = -1; re_drive = 1; } if(!add) { time -= 10; add = 1; if(time <= 10) time = 10; } if(!reduce) { time = 10; reduce = 1; if(time >= 100) time = 100; } } void main() { EA = 1; //EA (IE.7), CPU中断允许(总允许)位。 EX0 = 1; //EX0(IE.0),外部中断0允许位 IE0(TCON.1),外部中断0中断请求标志位。 IT0 = 1; //定义下降沿触发 while(1) { switch(state) { case 1: Move(time); break; case 0: Delay_xms(10); break; case -1: Move_reverse(time); break; } } } // 由于编辑器排版问题,没办法做到代码对齐

3、运行结果:

单片机控制步进电机总结(单片机控制步进电机)(2)

运行结果

来自:https://zhuanlan.zhihu.com/p/33405952


觉得文章不错,收藏的同时,麻烦点个赞~~~~~

关注微信公众号『混说Linux

你也可以继续阅读 点击 以下文章,下面是我推荐给大家的几篇文章:

1.《竟然把通信协议讲的如此通俗?》

2.《Linux为什么使用内核模块?》

3.《Linux为什么区分内核空间和用户空间?》

4.《常见硬件通信(SPI、I2C、CAN、USB、UART)协议介绍》

,