找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3712|回复: 3
收起左侧

一个有proteus,单片机源程序的电机测速文件

[复制链接]
ID:243192 发表于 2019-5-9 21:54 | 显示全部楼层 |阅读模式
电机测速,大家一起学习下。仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include "AT89X51.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. main()
  22. {
  23.                 TMOD=0x66;            //定时器0,1都为计数方式;方式2;
  24.         EA=1;                        //开中断
  25.         
  26.         TH0=0xff;                //定时器0初值FFH;
  27.         TL0=0xff;
  28.         ET0=1;
  29.         TR0=1;        
  30.         
  31.         TH1=0xff;                //定时器1初值FFH;
  32.         TL1=0xff;
  33.         ET1=1;
  34.         TR1=1;
  35.            
  36.         IT0=1;                        //脉冲方式
  37.         EX0=1;                        //开外部中断0:加速
  38.         IT1=1;                        //脉冲方式
  39.         EX1=1;                        //开外部中断1:减速

  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 SpeedDowm() interrupt 2
  79. {   

  80.     if(RunSpeed<=100)
  81.         RunSpeed=RunSpeed+2;
  82.     DoSpeed();
  83.     P1=0x01;
  84.     cmd_wr();
  85.     ShowState();


  86. }



  87. void inti_lcd()
  88. {

  89.    P1=0x38;
  90.    cmd_wr();
  91.    delay();

  92.    P1=0x01;     //清除
  93.    cmd_wr();
  94.    delay();

  95.    P1=0x0f;
  96.    cmd_wr();
  97.    delay();

  98.    P1=0x06;
  99.    cmd_wr();
  100.    delay();

  101.    P1=0x0c;
  102.    cmd_wr();
  103.    delay();
  104. }

  105. void cmd_wr()           //写控制字
  106. {
  107.    RS=0;
  108.    RW=0;
  109.    E=0;
  110.    E=1;
  111. }

  112. void show_lcd(int i)   //LCD显示子程序
  113. {  
  114.    P1=i;
  115.    RS=1;
  116.    RW=0;
  117.    E=0;
  118.    E=1;

  119. }

  120.     delay();
  121.     P1=0x80 | 0x0d;
  122.     cmd_wr();

  123.     i=0;
  124.     while(SPEED[i]!='\0')
  125.     {
  126.        delay();
  127.        show_lcd(SPEED[i]);
  128.        i++;
  129.     }

  130.     delay();
  131.     P1=0xC0;
  132.     cmd_wr();

  133.     i=0;
  134.     while(StateChar[i]!='\0')
  135.     {
  136.        delay();
  137.        show_lcd(StateChar[i]);
  138.        i++;
  139.     }

  140.     delay();
  141.     P1=0xC0 | 0x0A;
  142.     cmd_wr();

  143.     i=0;
  144.     if(RunState==RIGHT_RUN)
  145.         while(STATE_CW[i]!='\0')
  146.         {
  147.           delay();
  148.           show_lcd(STATE_CW[i]);
  149.           i++;
  150.         }
  151.     else
  152.        while(STATE_CCW[i]!='\0')
  153.         {
  154.           delay();
  155.           show_lcd(STATE_CCW[i]);
  156.           i++;
  157.         }

  158. }
  159. void clock(unsigned int Delay)   //1ms延时程序
  160. {  unsigned int i;
  161.    for(;Delay>0;Delay--)
  162.     for(i=0;i<124;i++);

  163. }

  164. void DoSpeed()
  165. {
  166.     SPEED[0]=(1000*6/RunSpeed/100)+48;
  167.     SPEED[1]=1000*6/RunSpeed%100/10+48;
  168.     SPEED[2]=1000*6/RunSpeed%10+48;
  169. }

复制代码

所有资料51hei提供下载:
电机测速.zip (24.26 KB, 下载次数: 67)
回复

使用道具 举报

ID:488365 发表于 2019-10-12 18:12 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:630260 发表于 2019-10-25 21:52 | 显示全部楼层
非常感谢!加上闭环调速就是我们这次的课后作业了
回复

使用道具 举报

ID:795427 发表于 2021-10-28 21:56 | 显示全部楼层
程序有问题,大家不要浪费积分下载,程序源码有问题(146行处,即使修复能编译,但是不能运行仿真),除了hex文件能仿真用,编译的文件不能仿真。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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