久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3627|回復: 2
打印 上一主題 下一主題
收起左側

求直流伺服電機怎么控制輸出脈沖個數轉動一度角度,哪位大佬能改下我這程序

[復制鏈接]
跳轉到指定樓層
樓主
哪位大佬能看看我這程序,為啥我按鍵輸入一度角度值,電機不能轉轉動對應角度,是脈沖函數部分錯了嗎,會的大佬能不能改一下,有感謝


單片機源程序如下:
  1. #include <reg52.h>
  2. #include<string.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.      
  7. sbit lcdrs=P2^0;       //寄存器選擇,0:數據寄存器。1:為狀態/命令寄存器
  8. sbit lcden=P2^1;         //--LCD控制引腳

  9. sbit angle=P3^3;                                        //測轉角端口
  10. sbit ENA=P2^2;                                        //電機使能控制端
  11. sbit Zheng=P2^5;                                                //正反轉電平設置端口
  12. sbit Fan=P2^6;                                               



  13. uchar Timer0_flag=0;
  14. uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)
  15. uchar  da;
  16. uchar gewei;
  17. uchar shiwei;
  18. uchar baiwei;
  19. uchar n;
  20. uchar angel;
  21. int aa[3];
  22. /******標志位設置*****/
  23. uchar KEY1=0;//優先級標志
  24. uchar KEY2=0;//加速標志

  25. uchar INT1_FLAG=0;
  26. uchar COUNTER_high=0;
  27. uchar COUNTER_low=0;
  28. uchar SUM=0;
  29. uint TIMER1_COUNTER=0;
  30. uint INT1_tingzhi=0;                //在要測速時置0

  31. /****面板顯示****/
  32. uchar code lcd_desktop11[]="stop";//停止
  33. uchar code lcd_desktop12[]="ford";//正轉
  34. uchar code lcd_desktop13[]=" fanzhuang";//反轉
  35. uchar code lcd_desktop21[]=" speedup";//加速
  36. uchar code lcd_desktop22[]=" speeddn";//減速
  37. uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉速數字。

  38. //-----lcd液晶屏頭文件-----//
  39. /**延時函數**/
  40. void delayms(uchar xms)   
  41. {
  42.         uchar i,j;
  43.         for(i=xms;i>0;i--)
  44.         for(j=110;j>0;j--);
  45. }

  46. /****LCD寫命令******/
  47. void write_command(uchar com)//com寫入命令
  48. {
  49.         lcdrs=0;
  50.         P0=com;
  51.         delayms(2);
  52.         lcden=1;
  53.         delayms(2);
  54.         lcden=0;
  55. }

  56. /**************LCD寫數據*********/
  57. void write_data(uchar date)//數據為DATA
  58. {
  59.         lcdrs=1;
  60.         P0=date;
  61.         delayms(2);
  62.         lcden=1;
  63.         delayms(2);
  64.         lcden=0;
  65. }

  66. /********LCD初始化****************/
  67. void lcd_init()//顯示模式設置
  68. {
  69.         lcden=0;
  70.         write_command(0x38);
  71.         write_command(0x0c);
  72.         write_command(0x06);
  73.         write_command(0x01);
  74. }

  75. /**電機初始化函數**/
  76. void motor_init(void)
  77. {
  78.         ENA=0;                                //        停止
  79. }

  80. void ZhongDuanKaiQi(void)
  81. {
  82.         EA=1;               
  83.         ET0=1;        //計時器0允許中斷。產生脈沖。
  84.         ET1=1;        //計時器1允許中斷。對低電平進行計時。
  85.         //EX1=1;        //INT0允許中斷。測速。由外部來啟動。
  86.         IT1=1;        //低電平觸發。
  87.         PX1=0;        //低級中斷。
  88.         PT0=1;
  89.         PT1=0;
  90.         TMOD=0x12;//定時器工作方式控制
  91. }
  92. /***定時器T1初始化!!!等待外部脈沖的到來***/
  93. void Timer1_init(void)
  94. {
  95.         TH1=0;
  96.         TL1=0;                //等待外部脈的到來。INT1
  97. }
  98. /*****定時T0初始化*****/
  99. void Timer0_init(void)
  100. {
  101.         TH0=0;
  102.         TL0=0;
  103.         TR0=1;
  104. }
  105. /********測速模塊,顯示速度*******/
  106. /*void speed_test(void)
  107. {
  108. //        TIMER1_COUNTER;
  109.         COUNTER_high=TH1;
  110.         COUNTER_low=TL1;
  111.         SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少us。
  112.         SUM=SUM/1000;                                //化為毫秒。
  113.         SUM=1000/SUM;                                //圈每秒。
  114.         SUM=SUM*60;                                        //圈每分鐘;三位數。
  115.         gewei=SUM%10;
  116.         shiwei=SUM/10%10;
  117.         baiwei=SUM/100;
  118.         write_command(0xc0);
  119.         write_data(baiwei);
  120.         write_command(0xc1);
  121.         write_data(shiwei);
  122.         write_command(0xc2);
  123.         write_data(gewei);
  124.         SUM=0;
  125.         TIMER1_COUNTER=0;               
  126. }


  127. /********外中斷1函數**********/
  128. void INT1_QIDONG() interrupt 2
  129. {
  130.         INT1_tingzhi++;
  131.         if(INT1_tingzhi==5)
  132.         {
  133.                 INT1_tingzhi=5;EX1=0;//關閉中斷。
  134.         }
  135.         if(INT1_tingzhi<=4)
  136.         {
  137.                 INT1_FLAG++;
  138.           if(INT1_FLAG==2)
  139.                         {
  140.                                 INT1_FLAG=0;TR1=0;speed_test();
  141.                         }
  142.                 else
  143.                         {
  144.                                 Timer1_init();
  145.                                 TR1=1;
  146.                         }
  147.         }
  148. }
  149. /******定時器T1計數*******/
  150. void Timer1_QIDONG() interrupt 3
  151. {
  152.         TIMER1_COUNTER++;
  153. }


  154. /**相位測量并輸出!!!!!出現問題???**/
  155. /*void xiangwei_test(void)
  156. {
  157.         uchar i=0,j=0;
  158.         //while((P2^3==0)&&(P2^4==0));
  159.         //if((P2^3==0)&&(P2^4==0))
  160.         {
  161.                 //delayms(5);
  162.                 if(P2^3==1)
  163.                 {
  164.                         write_command(0x01);
  165.                         write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop13[i]);//反轉。
  166.                         j++;//反轉
  167.                 }
  168.                
  169.                 if(P2^4==1)
  170.                 {
  171.                         write_command(0x01);
  172.                         write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop12[i]);//正轉。
  173.                         j++;
  174.                 }
  175.         }
  176. }

  177. /****T0中斷發出信號并進行通道選擇****/
  178. void Timer0() interrupt 1
  179. {       
  180.         Timer0_flag--;
  181.         if((Timer0_BiaoZhi)>=(Timer0_flag))
  182.         {
  183.                 if(KEY2==0)
  184.                 {
  185.                         Zheng=1;Fan=0;
  186.                 }
  187.                 else
  188.                 {
  189.                         Zheng=0;Fan=1;
  190.                 }
  191.         }
  192.         else
  193.         {
  194.                 Zheng=0;Fan=0;                               
  195.         }       
  196.         if(Timer0_flag==0) Timer0_flag=5;
  197. }


  198. void Guan(void)
  199. {
  200.         ET0=0;
  201.         EX1=0;
  202.         ET1=0;       
  203. }

  204. /*********/
  205. void pulsegenerate(){
  206.           int g,N;
  207.           N=angel*40;
  208.           for(g=0;g<N;g++)
  209.             {
  210.                                 ENA=0;
  211.                                 delayms(10);
  212.                                 ENA=1;
  213.                                 delayms(10);
  214.                                 ENA=0;
  215.                                 delayms(10);
  216.        }
  217. }

  218. void keyscan()                         //按鍵掃描函數
  219. {
  220.         uint i=0;
  221.                         KEY1=5;
  222.                         Fan=0;
  223.                         Zheng=0;
  224.                         //ENA=1;
  225.                         KEY2=0;//初始化為正轉。
  226.                   Timer0_BiaoZhi=0;
  227.                         Timer0_flag=4;
  228.                        
  229.                         ZhongDuanKaiQi();//開啟中斷       
  230.                         Timer0_init();//                初始化并開始發出脈場外中斷已經開啟。
  231.                         EX1=1;                                        //外中斷開啟;測速,顯示速度。五次后結束關閉外中斷1。出現問題!!!
  232.                        
  233.                         write_command(0x80);
  234.                         for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉。
  235.                         write_data(lcd_desktop12[i]);
  236.        
  237. }
  238. /******鍵盤0-9輸入模塊*******/

  239. uchar keyin(){      //鍵盤
  240. uchar temp;
  241.         uchar com,com1,com2;
  242.         P1=0xf0;
  243.         if(P1!=0xf0){
  244.                 com1=P1;
  245.                 P1=0x0f;
  246.                 com2=P1;
  247.         }
  248.         P1=0xf0;
  249.         while(P1!=0xf0);
  250.                 temp=com1|com2;
  251.                 if(temp==0xee)com=0x01;
  252.                 if(temp==0xed)com=0x02;
  253.                 if(temp==0xeb)com=0x03;
  254.                 if(temp==0xde)com=0x04;
  255.                 if(temp==0xdd)com=0x05;
  256.                 if(temp==0xdb)com=0x06;
  257.                 if(temp==0xbe)com=0x07;
  258.                 if(temp==0xbd)com=0x08;
  259.                 if(temp==0xbb)com=0x09;
  260.                 if(temp==0x7e)com=0x0a;
  261.                 if(temp==0x7d)com=0x00;
  262.                 if(temp==0x7b)com=0x0b;
  263.                 return com;
  264. }
  265. void xianshi(){
  266.         uchar a;
  267.         uchar d=1;
  268.         uchar da;
  269.         P1=0xf0;
  270.         for(a=0;a<d;a++){
  271.                 int i1=0;
  272.                 while(P1==0xf0);
  273.                 da=keyin();  //調用keyin函數
  274.                
  275.                 if(da>=0x00&&da<=0x09){
  276.                                 aa[i1]=da;
  277.                                 i1++;
  278.                                 if(i1==3){
  279.                                         angel=aa[0]*100+aa[1]*10+aa[2];
  280.                                         i1=0;
  281.                                 }
  282.                         }
  283.                         Timer0_flag = angel;
  284.                 //if(da>=0x00&&da<=0x09){aa[i1]=da;i1++;if(i1==3){angel1=aa[0]*100+aa[1]*10+aa[2];i1=0;}}
  285.                 if(4==d) {
  286.                         while(1){
  287.                                 da=keyin();  //調用keyin函
  288.                                 if(da==0x0a){
  289.                                                 lcd_init();
  290.                                                 //xianshi();
  291.                                 }else if(da==0x0b){
  292.                                                 keyscan();
  293.                                 }
  294.                         }
  295.                 }
  296.                        
  297.                 if(da==0x01){
  298.                                         write_data('1');
  299.                         d++;
  300.                 }else if(da==0x02){
  301.                                         write_data('2');
  302.                         d++;
  303.                 }else if(da==0x03){
  304.                                         write_data('3');
  305.                         d++;
  306.                 }else if(da==0x04){
  307.                                         write_data('4');
  308.                         d++;
  309.                 }else if(da==0x05){
  310.                                         write_data('5');
  311.                         d++;
  312.                 }else if(da==0x06){
  313.                                         write_data('6');
  314.                         d++;
  315.                 }else if(da==0x07){
  316.                                         write_data('7');
  317.                                         d++;
  318.                 }else if(da==0x08){
  319.                                         write_data('8');
  320.                         d++;
  321.                 }else if(da==0x09){
  322.                                         write_data('9');
  323.                         d++;
  324.                 }else if(da==0x00){
  325.                                         write_data('0');
  326.                         d++;
  327.                 }/*else if(da==0x0a){
  328.                         lcd_init();
  329.                         //xianshi();
  330.                 }else if(da==0x0b){
  331.                         pulsegenerate();
  332.                                 break;
  333.                 }*/
  334.        
  335.         }
  336. }       

  337. /***************/


  338. /*****************/

  339.        
  340. /* if((key2==0)&&(KEY1=5)) //按鍵K2按下,(正轉)只改變轉向(標志位改變輸出端口)
  341.         {
  342.                 delayms(10);
  343.                 if(key2==0)
  344.                 {
  345.                         while(!key1);
  346.                         KEY1=5;
  347.                         Fan=0;
  348.                         Zheng=0;
  349.                         ENA=1;
  350.                         KEY2=0;//初始化為正轉。
  351.                   Timer0_BiaoZhi=0;
  352.                         Timer0_flag=4;
  353.                        
  354.                         ZhongDuanKaiQi();//開啟中斷       
  355.                         Timer0_init();//                初始化并開始發出脈場外中斷已經開啟。
  356.                         EX1=1;                                        //外中斷開啟;測速,顯示速度。五次后結束關閉外中斷1。出現問題!!!
  357.                        
  358.                         write_command(0x80);
  359.                         for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉。
  360.                         write_data(lcd_desktop12[i]);
  361.                 }
  362.         }
  363.        
  364.         if((key3==0)&&(KEY1=5)) //按鍵K3按下,(反轉)只改變轉向
  365.         {
  366.                 delayms(10);
  367.                 if(key3==0)
  368.                 {
  369.                         while(!key3);
  370.                         KEY2=~0;                        //反轉標志。
  371.                         //KEY2=(~0);
  372.                         xiangwei_test();
  373.                         KEY1=5;
  374.                         lcd_init();
  375.                          for(n=0;n<10;n++){
  376.                                 write_data(lcd_desktop13[n]);}
  377.                 }
  378.         }
  379.    if((key4==0)&&(KEY1==5))        //按鍵K4按下,(加速)改變裝入的數值?循環次數?執行if里面的語句,通過size++來改變幅值的頻率
  380.          {
  381.                  delayms(10);
  382.                  if(key4==0)
  383.                  {
  384.                          while(!key4);
  385.                          if(Timer0_BiaoZhi<4)
  386.                          {
  387.                                  Timer0_BiaoZhi++;
  388.                          }
  389.                          else
  390.                          {
  391.                                  Timer0_BiaoZhi=4;
  392.                          }
  393.                           EX1=1;
  394.                           KEY1=5;
  395.                          lcd_init();
  396.                          for(n=0;n<8;n++){
  397.                                 write_data(lcd_desktop21[n]);}
  398.                  }
  399.                
  400.          }
  401.          
  402.          if((key5==0)&&(KEY1==5))         //按鍵K5按下,(減速)對其它標志位沒有影響。
  403.          {
  404.                  delayms(5);
  405.                  if(key5==0)
  406.                  {
  407.                          while(!key5);
  408.                          if(Timer0_BiaoZhi==0)
  409.                          {
  410.                                  Timer0_BiaoZhi=0;
  411.                          }
  412.                          else
  413.                          {
  414.                                  Timer0_BiaoZhi--;
  415.                          }
  416.                           EX1=1;
  417.                           KEY1=5;
  418.                          lcd_init();
  419.                          for(n=0;n<8;n++){
  420.                                 write_data(lcd_desktop22[n]);}
  421.                  }
  422.          }
  423.          if((key6==0)&&(KEY1==5))//按鍵K6按下,電機停止轉動使能端和計數啟動關閉,計數器工作否?設立標志位。此按鍵按下后除K1外無法啟動
  424.          {
  425.                  delayms(5);
  426.                  if(key6==0)
  427.                  {
  428.                          while(!key6);
  429.                          //置位,保證后續操作正常。
  430.                          
  431.                          
  432.                          
  433.                          EA=0;                                //總中斷關
  434.                          motor_init();                //電機關
  435.                          lcd_init();
  436.                          Guan();
  437.                                                            
  438.                  }
  439.          }
  440. }

  441. /*主函數*/
  442. void main()
  443. {

  444.         ZhongDuanKaiQi();//初始化
  445.         motor_init();                        //電機停止
  446.         lcd_init();
  447.         while(1)
  448.         {
  449.                 xianshi();
  450.                
  451.         }
  452. }
復制代碼

所有資料51hei提供下載:
lyp22.zip (84.34 KB, 下載次數: 23)


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

使用道具 舉報

沙發
ID:750208 發表于 2020-5-15 12:47 來自觸屏版 | 只看該作者
你的D4連在哪里啊,圖中沒有
回復

使用道具 舉報

板凳
ID:800205 發表于 2020-7-9 10:13 | 只看該作者
你是用51做的啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91丝袜在线熟 | 国产一级电影在线观看 | 国产资源一区二区三区 | 免费一看一级毛片 | 成人免费激情视频 | 亚洲综合婷婷 | 国产无套一区二区三区久久 | 亚洲第一成人av | 国产探花在线精品一区二区 | 天天色综网 | 久久精品一区 | 97人澡人人添人人爽欧美 | 欧美另类视频在线 | 天堂va在线| 欧美精品二区 | av在线一区二区 | 国产精品久久亚洲7777 | 日本精品视频一区二区三区四区 | 欧美激情在线播放 | 中文字幕日韩在线 | 男女视频网站 | 在线观看成年视频 | 日韩欧美在线播放 | 国产一区免费视频 | 成人午夜高清 | 日韩中文在线视频 | 91久久精品 | 国产视频导航 | 神马久久久久久久久久 | 国产欧美在线视频 | 中文字幕精品一区 | 在线中文字幕视频 | 亚洲成人a v| 综合精品久久久 | 欧美日韩精品免费观看 | 精品av久久久久电影 | 欧美激情亚洲 | 午夜电影一区二区 | 99精品一区二区三区 | 日韩欧美一区二区三区免费看 | 久久精品一级 |