找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9956|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)Proteus仿真實(shí)現(xiàn)步進(jìn)電機(jī)正反轉(zhuǎn),加減速的功能,同時(shí)在lcd上顯示出來

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用protues實(shí)現(xiàn)步進(jìn)電機(jī)正反轉(zhuǎn),加減速的功能,內(nèi)附Proteus仿真原理圖,用keil編程的C語(yǔ)言程序。


單片機(jī)源程序如下:
  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();//計(jì)算速度
  9. #define RIGHT_RUN 1//正轉(zhuǎn)值
  10. #define LEFT_RUN 0//反轉(zhuǎn)值
  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;//運(yùn)行狀態(tài)
  21. void main()
  22. {
  23.         //定時(shí)器設(shè)置
  24.         TMOD=0x66;
  25.         EA=1;//開中斷
  26.         
  27.         TH0=0xff;//定時(shí)器0初始值FFH;
  28.         TL0=0xff;
  29.         ET0=1;
  30.         TR0=1;

  31.         TH1=0xff;//定時(shí)器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. //定時(shí)器0中斷程序:正轉(zhuǎn)
  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. //定時(shí)器1中斷程序:反轉(zhuǎn)
  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()//設(shè)置LCD方式
  103. {
  104.         P1=0x38;//設(shè)置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;//光標(biāo)移動(dòng)設(shè)置
  114.         cmd_wr();
  115.         delay();

  116.         P1=0x0c;//顯示開及光標(biāo)設(shè)置
  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()//顯示狀態(tài)與速度
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
新建文件夾.zip (41.5 KB, 下載次數(shù): 180)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:35873 發(fā)表于 2019-4-12 19:18 | 只看該作者
好資料     謝謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:93185 發(fā)表于 2019-4-12 23:25 | 只看該作者
不能用
回復(fù)

使用道具 舉報(bào)

地板
ID:522809 發(fā)表于 2019-4-27 12:23 | 只看該作者
很好,可以用
回復(fù)

使用道具 舉報(bào)

5#
ID:762047 發(fā)表于 2020-5-27 02:55 來自手機(jī) | 只看該作者
老哥,這個(gè)可以再加個(gè)星三角啟動(dòng)嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:786505 發(fā)表于 2020-7-2 12:16 | 只看該作者
誰有這個(gè)原理圖啊,發(fā)一下,謝謝。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表