找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12758|回复: 12
收起左侧

二相四线步进电机的单片机源程序 用L298N模块驱动

  [复制链接]
ID:220436 发表于 2017-7-18 09:07 | 显示全部楼层 |阅读模式
在网上找了很久资料,都没有直接的源代码去驱动二相四线步进电机。本人编写了一些基本的代码,再加上L298N模块,就可以轻松驱动啦。
0.png 0.png 0.png 0.png

单片机源程序如下:
  1. #include "reg52.h"

  2. //电机IO
  3. #define GPIO_MOTOR P1
  4. //sbit F1 = P1^0;
  5. //sbit F2 = P1^1;
  6. //sbit F3 = P1^2;
  7. //sbit F4 = P1^3;
  8. //按键IO

  9. sbit K1=P3^0;
  10. sbit K2=P3^1;
  11. sbit K3=P3^2;
  12. sbit K4=P3^3;

  13.                                                                                                                                                                     
  14. sbit a0=P1^0;                          
  15. sbit a1=P1^1;           
  16. sbit b0=P1^3;
  17. sbit b1=P1^4;

  18. void right(unsigned int y);
  19. void left(unsigned int x);
  20. void Delay(unsigned int t);
  21. unsigned char Direction,Speed;
  22. void motor();
  23. /*******************************************************************************
  24. * 函 数 名         : main
  25. * 函数功能                   : 主函数
  26. * 输    入         : 无
  27. * 输    出         : 无
  28. *******************************************************************************/

  29. void main(void)
  30. {
  31.         unsigned char i;       
  32.    Speed=10;

  33.   while(1)
  34.         {
  35.                          
  36.           if(K1==0)                //检测按键K1是否按下
  37.                 {
  38.                         Delay(50);        //消除抖动
  39.                         if(K1==0)
  40.                         {
  41.                                 Direction=1;
  42.                         }
  43.                         while((i<200)&&(K1==0))         //检测按键是否松开
  44.                         {
  45.                                 Delay(50);
  46.                                 i++;
  47.                         }
  48.                         i=0;
  49.                 }


  50.                 if(K2==0)                //检测按键K1是否按下
  51.                 {
  52.                         Delay(50);        //消除抖动
  53.                         if(K2==0)
  54.                         {
  55.                                 Direction=2;
  56.                         }
  57.                         while((i<200)&&(K2==0))         //检测按键是否松开
  58.                         {
  59.                                 Delay(50);
  60.                                 i++;
  61.                         }
  62.                         i=0;
  63.                 }       



  64.                  if(K3==0)                //检测按键K1是否按下
  65.                 {
  66.                         Delay(100);        //消除抖动
  67.                         if(K3==0)
  68.                         {
  69.                                 Speed--;
  70.                                 if(Speed<=3)
  71.                                 Speed=4;
  72.                         }
  73.                         while((i<200)&&(K2==0))         //检测按键是否松开
  74.                         {
  75.                                 Delay(1);
  76.                                 i++;
  77.                         }
  78.                         i=0;
  79.                 }
  80.          
  81.                 if(K4==0)                //检测按键K1是否按下
  82.                 {
  83.                         Delay(100);        //消除抖动
  84.                         if(K4==0)
  85.                         {
  86.                                 Speed++;
  87.                         }
  88.                         while((i<200)&&(K4==0))         //检测按键是否松开
  89.                         {
  90.                                 Delay(100);
  91.                                 i++;
  92.                         }
  93.                         i=0;
  94.                 }       

  95.           motor();
  96.   

  97.         }
  98. }





  99. void motor()
  100. {

  101. if(Direction==1)
  102.         {
  103.         a0=0;
  104.         a1=1;
  105.         b0=1;
  106.         b1=1;
  107.         Delay(Speed);
  108.         a0=1;
  109.         a1=0;
  110.         b0=1;
  111.         b1=1;
  112.         Delay(Speed);
  113.         a0=1;
  114.         a1=1;
  115.         b0=0;
  116.         b1=1;
  117.         Delay(Speed);
  118.         a0=1;
  119.         a1=1;
  120.         b0=1;
  121.         b1=0;
  122.         Delay(Speed);
  123.         }


  124. if(Direction==2)
  125.                  
  126.         {
  127.         a0=1;
  128.         a1=1;
  129.         b0=1;
  130.         b1=0;
  131.         Delay(Speed);
  132.         a0=1;
  133.         a1=1;
  134.         b0=0;
  135.         b1=1;
  136.         Delay(Speed);
  137.         a0=1;
  138.         a1=0;
  139.         b0=1;
  140.         b1=1;
  141.         Delay(Speed);
  142.         a0=0;
  143.         a1=1;
  144.         b0=1;
  145.         b1=1;
  146.         Delay(Speed);
  147.         }


  148. }

  149.                                                                                                                                                                           
  150. void Delay(unsigned int t)
  151. {                           
  152.         unsigned int k;
  153.         while(t--)
  154.         {
  155.                 for(k=0; k<70; k++)
  156.                 { }
  157.         }
  158. }
















  159. /*void left(unsigned int x)
  160. {
  161. a0=0;
  162. a1=1;
  163. b0=1;
  164. b1=1;
  165. Delay(x);
  166. a0=1;
  167. a1=0;
  168. b0=1;
  169. b1=1;
  170. Delay(x);
  171. a0=1;
  172. a1=1;
  173. b0=0;
  174. b1=1;
  175. Delay(x);
  176. a0=1;
  177. a1=1;
  178. b0=1;
  179. b1=0;
  180. Delay(x);
  181. }


  182. void right(unsigned int y)
  183. {
  184. a0=1;
  185. a1=1;
  186. b0=1;
  187. b1=0;
  188. Delay(y);
  189. a0=1;
  190. a1=1;
  191. b0=0;
  192. b1=1;
  193. Delay(y);
  194. a0=1;
  195. a1=0;
  196. b0=1;
  197. b1=1;
  198. Delay(y);
  199. a0=0;
  200. a1=1;
  201. b0=1;
  202. b1=1;
  203. Delay(y);


  204. }*/




  205.   /*
  206. #include<reg52.h>
  207.                                                           
  208. sbit a0=P1^0;
  209. sbit a1=P1^1;           
  210. sbit b0=P1^3;
  211. sbit b1=P1^4;





  212.                                                           
  213. void Delay(unsigned int t)       
  214.                                                          

  215. void main()
  216. {
  217. en0=1;
  218. en1=1;
  219. while(1)
  220. {


  221. a0=0;
  222. a1=1;
  223. b0=1;
  224. b1=1;
  225. Delay(500);



  226. a0=1;
  227. a1=0;
  228. b0=1;
  229. b1=1;
  230. Delay(500);

  231. a0=1;
  232. a1=1;
  233. b0=0;
  234. b1=1;
  235. Delay(500);

  236. a0=1;
  237. a1=1;
  238. b0=1;
  239. b1=0;
  240. Delay(500);

  241. }
  242. }


  243. void Delay(unsigned int t)
  244. {                           
  245.         unsigned int k;

  246.         while(t--)
  247.         {
  248.                 for(k=0; k<80; k++)
  249.                 { }
  250.         }
  251. }



  252. #include<reg52.h>
  253. #define uint unsigned int
  254. #define uchar unsigned char

  255. sbit a0=P1^0;
  256. sbit a1=P1^1;
  257. sbit en0=P1^2;

  258. //1
  259. sbit b0=P1^3;
  260. sbit b1=P1^4;

  261. sbit en1=P1^5;
  262. //2


  263. void zheng(uchar k,uchar j);
  264. void yanshi(uint z);
  265. void xifen(uchar k1,uchar j1);
  266. uchar b,num,n,num1,n1,h;
  267. void main()
  268. {
  269. en0=1;
  270. en1=1;
  271. while(1)
  272. {

  273. xifen(10,100); //1/210mS100   果步  1.890
  274. yanshi(400);


  275. zheng(15,50);          //15mS  50 1.890
  276. yanshi(400);

  277. }
  278. }



  279. void zheng(uchar k,uchar j)


  280. {


  281. b=j/4;
  282. b=b+1;
  283. num=0;

  284. for(b;b>0;b--)

  285. {


  286. if(num<j&n==0)//A-B+

  287. {


  288. a0=0;
  289. a1=1;
  290. b0=1;
  291. b1=0;

  292. yanshi(k);
  293. num++;

  294. n=1;

  295. }


  296. if(num<j&n==1) //A- B-
  297. {
  298. a0=0;
  299. a1=1;
  300. b0=0;
  301. b1=1;
  302. yanshi(k);
  303. num++;
  304. n=2;

  305. }

  306. if(num<j&n==2)//A+ B-

  307. {
  308. a0=1; a1=0; b0=0; b1=1;
  309. yanshi(k);
  310. num++;
  311. n=3;
  312. }



  313. if(num<j&n==3)//A+ B+

  314. {
  315. a0=1;
  316. a1=0;
  317. b0=1;
  318. b1=0;
  319. yanshi(k);
  320. num++;
  321.          
  322. n=0;
  323. }
  324. }
  325. }

  326. void xifen(uchar k1,uchar j1)

  327. {
  328. h=j1/8;
  329. h=h+1;
  330. num1=0;
  331. for(h;h>0;h--)
  332. {
  333. if(num1<j1&n1==0)//A- B+
  334. {
  335. a0=0;
  336. a1=1;
  337. b0=1;
  338. b1=0;
  339. yanshi(k1);
  340. num1++;
  341. n1=1;
  342. }
  343. if(num1<j1&n1==1) //A-
  344. {
  345. a0=0;
  346. a1=1;
  347. b0=0;
  348. b1=0;
  349. yanshi(k1);
  350. num1++;
  351. n1=2;
  352. }
  353. if(num1<j1&n1==2) //A- B-

  354. {
  355. a0=0;
  356. a1=1;
  357. b0=0;
  358. b1=1;
  359. yanshi(k1);
  360. num1++;
  361. n1=3;
  362. }
  363. if(num1<j1&n1==3)// B-
  364. {
  365. a0=0;
  366. a1=0;
  367. b0=0;
  368. b1=1;
  369. yanshi(k1);
  370. num1++;
  371. n1=4;
  372. }
  373. if(num1<j1&n1==4) //A+B-

  374. ……………………

  375. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
二相四线步进电机(可调速度)1.zip (1.04 MB, 下载次数: 345)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:146206 发表于 2017-7-22 13:18 | 显示全部楼层
非常好的资料,先学习了
回复

使用道具 举报

ID:401113 发表于 2018-12-16 22:47 | 显示全部楼层
几个月前从软盘驱动器上拆下了个二相四线步进电机,用实验板上的ULN2003试了近百次都没成功,今天看到楼主的贴子再上网一查原来是ULN2003驱动不了二相四线步进电机,唉!早该想到是驱动芯片的问题。
回复

使用道具 举报

ID:322594 发表于 2019-3-17 17:35 | 显示全部楼层
非常好的资料
回复

使用道具 举报

ID:46475 发表于 2019-5-28 13:05 | 显示全部楼层
非常好的资料,先学习了
回复

使用道具 举报

ID:648939 发表于 2019-11-29 21:51 | 显示全部楼层
感谢分享。
回复

使用道具 举报

ID:499477 发表于 2020-2-18 10:19 | 显示全部楼层
谢谢分享 学习了
回复

使用道具 举报

ID:495287 发表于 2020-6-20 02:11 | 显示全部楼层
谢谢楼主分享,好人一生平安。
回复

使用道具 举报

ID:495287 发表于 2020-6-20 02:15 | 显示全部楼层
海洋渔业 发表于 2018-12-16 22:47
几个月前从软盘驱动器上拆下了个二相四线步进电机,用实验板上的ULN2003试了近百次都没成功,今天看到楼主 ...

看到你的分享,你用的事L293D吧,我用的298,怎么轻微的正反交互蠕动,我是单独用的L298N,请指点下谢谢!
回复

使用道具 举报

ID:187947 发表于 2020-6-26 10:32 | 显示全部楼层
谢谢分享        
回复

使用道具 举报

ID:689902 发表于 2020-12-15 16:31 | 显示全部楼层
正在寻找的资料,谢谢分享
回复

使用道具 举报

ID:431123 发表于 2021-6-23 21:20 | 显示全部楼层
之前用其他模块驱动步进电机,一直不成功,想着换这个模块试试,正好找到楼主的资料,非常感谢。
回复

使用道具 举报

ID:975345 发表于 2021-10-27 10:50 | 显示全部楼层
非常好的资料,先学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表