標(biāo)題: 一個(gè)有proteus,單片機(jī)源程序的電機(jī)測(cè)速文件 [打印本頁]

作者: fsafa    時(shí)間: 2019-5-9 21:54
標(biāo)題: 一個(gè)有proteus,單片機(jī)源程序的電機(jī)測(cè)速文件
電機(jī)測(cè)速,大家一起學(xué)習(xí)下。仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  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;  //運(yùn)行狀態(tài)
  21. main()
  22. {
  23.                 TMOD=0x66;            //定時(shí)器0,1都為計(jì)數(shù)方式;方式2;
  24.         EA=1;                        //開中斷
  25.         
  26.         TH0=0xff;                //定時(shí)器0初值FFH;
  27.         TL0=0xff;
  28.         ET0=1;
  29.         TR0=1;        
  30.         
  31.         TH1=0xff;                //定時(shí)器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. //定時(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 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延時(shí)程序
  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. }

復(fù)制代碼

所有資料51hei提供下載:
電機(jī)測(cè)速.zip (24.26 KB, 下載次數(shù): 67)



作者: 466162659    時(shí)間: 2019-10-12 18:12
非常感謝
作者: 夢(mèng)醒荒唐    時(shí)間: 2019-10-25 21:52
非常感謝!加上閉環(huán)調(diào)速就是我們這次的課后作業(yè)了
作者: perseverance51    時(shí)間: 2021-10-28 21:56
程序有問題,大家不要浪費(fèi)積分下載,程序源碼有問題(146行處,即使修復(fù)能編譯,但是不能運(yùn)行仿真),除了hex文件能仿真用,編譯的文件不能仿真。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1