找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8881|回复: 5
打印 上一主题 下一主题
收起左侧

单片机Proteus仿真实现步进电机正反转,加减速的功能,同时在lcd上显示出来

[复制链接]
跳转到指定楼层
楼主
用protues实现步进电机正反转,加减速的功能,内附Proteus仿真原理图,用keil编程的C语言程序。


单片机源程序如下:
  1. #include <AT89X52.H>
  2. int delay();
  3. void inti_lcd();
  4. void show_lcd(int);
  5. void cmd_wr();
  6. void ShowState();
  7. void clock(unsigned int Delay);
  8. void DoSpeed();//计算速度
  9. #define RIGHT_RUN 1//正转值
  10. #define LEFT_RUN 0//反转值
  11. sbit RS=0xA0;
  12. sbit RW=0xA1;
  13. sbit E=0xA2;
  14. char SpeedChar[]="SPEED(n/min):";
  15. char StateChar[]="RUN STATE:";
  16. char STATE_CW[]="CW";
  17. char STATE_CCW[]="CCW";
  18. char SPEED[3]="050";
  19. unsigned int RunSpeed=50;//速度
  20. unsigned char RunState=RIGHT_RUN;//运行状态
  21. void main()
  22. {
  23.         //定时器设置
  24.         TMOD=0x66;
  25.         EA=1;//开中断
  26.         
  27.         TH0=0xff;//定时器0初始值FFH;
  28.         TL0=0xff;
  29.         ET0=1;
  30.         TR0=1;

  31.         TH1=0xff;//定时器1初始值FFH
  32.         TL1=0xff;
  33.         ET1=1;
  34.         TR1=1;

  35.         IT0=1;//脉冲方式
  36.         EX0=1;//开外部中断0:加速
  37.         IT1=1;//脉冲方式
  38.         EX1=1;//开外部中断1:减速
  39.         
  40.         inti_lcd();
  41.         DoSpeed();
  42.         ShowState();
  43.         while(1)
  44.                 {
  45.                         clock(RunSpeed);
  46.                         P0_1=P0_1^0x01;
  47.                 }
  48. }
  49. //定时器0中断程序:正转
  50. void t_0(void)interrupt 1
  51. {
  52.         RunState=RIGHT_RUN;
  53.         P0_0=1;
  54.         P1=0x01;
  55.         cmd_wr();
  56.         ShowState();
  57. }
  58. //定时器1中断程序:反转
  59. void t_1(void)interrupt 3
  60. {
  61.         RunState=LEFT_RUN;
  62.         P0_0=0;
  63.         P1=0x01;
  64.         cmd_wr();
  65.         ShowState();
  66. }
  67. //中断0:加速程序
  68. void SpeedUp()interrupt 0
  69. {
  70.         if(RunSpeed>=12)
  71.                 RunSpeed=RunSpeed-2;
  72.         DoSpeed();
  73.         P1=0x01;
  74.         cmd_wr();
  75.         ShowState();
  76. }
  77. //中断1:减速程序
  78. void SpeedDown()interrupt 2
  79. {
  80.         if(RunSpeed<=100)
  81.                 RunSpeed=RunSpeed+2;
  82.         DoSpeed();
  83.         P1=0x01;
  84.         cmd_wr();
  85.         ShowState();
  86. }
  87. int delay()//判断LCD是否忙
  88. {
  89.         int a;
  90. start:
  91.         RS=0;
  92.         RW=1;
  93.         E=0;
  94.         for(a=0;a<2;a++);
  95.         E=1;
  96.         P1=0xff;
  97.         if(P1_7==0)
  98.                 return 0;
  99.         else
  100.                 goto start;
  101. }
  102. void inti_lcd()//设置LCD方式
  103. {
  104.         P1=0x38;//设置16*2显示
  105.         cmd_wr();
  106.         delay();

  107.         P1=0x01;//清除
  108.         cmd_wr();
  109.         delay();

  110.         P1=0x0f;
  111.         cmd_wr();
  112.         delay();

  113.         P1=0x06;//光标移动设置
  114.         cmd_wr();
  115.         delay();

  116.         P1=0x0c;//显示开及光标设置
  117.         cmd_wr();
  118.         delay();
  119. }
  120. void cmd_wr()//写控制字
  121. {
  122.         RS=0;
  123.         RW=0;
  124.         E=0;
  125.         E=1;
  126. }
  127. void show_lcd(int i)//LCD显示子程序
  128. {
  129.         P1=i;
  130.         RS=1;
  131.         RW=0;
  132.         E=0;
  133.         E=1;
  134. }
  135. void ShowState()//显示状态与速度
  136. {
  137.         int i=0;
  138.         while(SpeedChar[i]!='\0')        ///char SpeedChar[]="SPEED(n/min)";
  139.         {
  140.                 delay();
  141.                 show_lcd(SpeedChar[i]);
  142.                 i++;
  143.         }
  144.         delay();
  145.         P1=0x80|0x0d;
  146.         cmd_wr();
  147.         i=0;
  148.         while(SPEED[i]!='\0')
  149.         {
  150.                 delay();
  151.                 show_lcd(SPEED[i]); SPEED[3]="050";
  152.                 i++;
  153.         }
  154.                 delay();
  155.                 P1=0xC0;
  156.                 cmd_wr();
  157.                 i=0;
  158.                 while(StateChar[i]!='\0')
  159.         {
  160.                 delay();
  161.                 show_lcd(StateChar[i]);/// char StateChar[]="RUN STATE";
  162.                 i++;
  163.         }
  164.         delay();
  165.         P1=0xC0|0x0A;
  166.         cmd_wr();
  167.         i=0;
  168.         if(RunState==RIGHT_RUN)
  169.                 while(STATE_CW[i]!='\0')
  170.         {
  171.                 delay();
  172. ……………………

  173. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
新建文件夹.zip (41.5 KB, 下载次数: 180)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:35873 发表于 2019-4-12 19:18 | 只看该作者
好资料     谢谢分享
回复

使用道具 举报

板凳
ID:93185 发表于 2019-4-12 23:25 | 只看该作者
不能用
回复

使用道具 举报

地板
ID:522809 发表于 2019-4-27 12:23 | 只看该作者
很好,可以用
回复

使用道具 举报

5#
ID:762047 发表于 2020-5-27 02:55 来自手机 | 只看该作者
老哥,这个可以再加个星三角启动吗
回复

使用道具 举报

6#
ID:786505 发表于 2020-7-2 12:16 | 只看该作者
谁有这个原理图啊,发一下,谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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