找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机舵机按键控制程序单片机问题

[复制链接]
ID:436850 发表于 2018-12-10 10:43 | 显示全部楼层 |阅读模式

STC89C52RC单片机控制六路舵机的按键程序怎么写?     是这样吗?

  1. #include <reg52.h>      
  2. #include <math.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. uchar flag1;                                                        //舵机按键标志
  6. uchar flag2;                                                        //舵机按键标志
  7. uchar flag3;                                                        //舵机按键标志
  8. uchar flag4;                                                        //舵机按键标志
  9. uchar flag5;                                                        //舵机按键标志
  10. uchar flag6;                                                        //舵机按键标志


  11. uchar order=0;

  12. sbit  KEY1_1=P1^0;                  //第一路按键1
  13. sbit  KEY1_2=P1^1;                  //第一路按键2
  14. sbit PWM_OUT1=P2^1;                  //第一路PWM输出口


  15. sbit  KEY2_1=P1^2;        //第二路按键1
  16. sbit  KEY2_2=P1^3;        //第二路按键2
  17. sbit PWM_OUT2=P2^2;       //第二路PWM输出口


  18. sbit  KEY3_1=P1^4;        //第三路按键1
  19. sbit  KEY3_2=P1^5;        //第三路按键2
  20. sbit PWM_OUT3=P2^3;       //第三路PWM输出口


  21. sbit  KEY4_1=P1^6;        //第四路按键1
  22. sbit  KEY4_2=P1^7;        //第四路按键2
  23. sbit PWM_OUT4=P2^4;       //第四路PWM输出口


  24. sbit  KEY5_1=P3^2;        //第五路按键1
  25. sbit  KEY5_2=P3^3;        //第五路按键2
  26. sbit PWM_OUT5=P2^5;       //第五路PWM输出口


  27. sbit  KEY6_1=P3^4;        //第六路按键1
  28. sbit  KEY6_2=P3^5;        //第六路按键2
  29. sbit PWM_OUT6=P2^6;       //第六路PWM输出口

  30. uint PWM_Value1;                                    //定义pwm值
  31. uint PWM_Value2;
  32. uint PWM_Value3;
  33. uint PWM_Value4;
  34. uint PWM_Value5;
  35. uint PWM_Value6;  


  36.                         


  37. void Delay(unsigned int s)          //延迟子函数

  38. {

  39.   unsigned int i;

  40.   for(i=0; i<s; i++);

  41.   for(i=0; i<s; i++);

  42. }



  43. /*定时器初始化*/
  44. void Init_Timer0()        

  45. {

  46.   TMOD=0x11;

  47.   TH0=(65536-1500)/256;

  48.   TL0=(65536-1500)%256;

  49.   EA = 1;

  50.   ET0 = 1;

  51.   TR0 = 1;

  52.   PT0=1;

  53. }               


  54. /*主函数*/
  55. void main(void)

  56. {

  57.   Delay(6000);

  58.   PWM_Value1 = 1250;                                        //pwm初值为1500
  59.   PWM_Value2 = 1250;
  60.   PWM_Value3 = 1250;
  61.   PWM_Value4 = 1250;
  62.   PWM_Value5 = 1250;
  63.   PWM_Value6 = 1250;




  64.   Init_Timer0();

  65.   while(1)

  66.   {
  67.            /*第一路*/
  68.            if((KEY1_1 ==0 )||(KEY1_2 ==0 ))                                                        //按键1或按键2被按下

  69.               {

  70.                 if(KEY1_1 ==0 )                                                                                                //确认按键1被按下

  71.                    {

  72.                      flag1 = 1;                                                                                                //标志位赋值1

  73.                    }

  74.                 if(KEY1_2 ==0 )                                                                        //确认按键2被按下

  75.                    {

  76.                      flag1 = 2;                                                                                        //标志位赋值2

  77.                    }

  78.               }

  79.           else

  80.               {

  81.                 flag1 = 0;                                                                //否则标志位为0

  82.               }

  83.               Delay(20);                                                                //延时20ms

  84.    
  85.                    /*第二路*/
  86.            if((KEY2_1 ==0 )||(KEY2_2 ==0 ))                                                        //按键1或按键2被按下

  87.               {

  88.                 if(KEY2_1 ==0 )                                                                                                //确认按键1被按下

  89.                    {

  90.                     flag2 = 1;                                                                                                //标志位赋值1

  91.                    }

  92.                if(KEY2_2 ==0 )                                                                        //确认按键2被按下

  93.                    {

  94.                     flag2 = 2;                                                                                        //标志位赋值2

  95.                    }

  96.              }

  97.            else

  98.              {

  99.               flag2 = 0;                                                                //否则标志位为0

  100.              }

  101.               Delay(20);                                                                //延时20ms
  102.                    /*第三路*/
  103.                   if((KEY3_1 ==0 )||(KEY3_2 ==0 ))                                                        //按键1或按键2被按下

  104.              {

  105.                if(KEY3_1 ==0 )                                                                                                //确认按键1被按下

  106.                   {

  107.                    flag3 = 1;                                                                                                //标志位赋值1

  108.                   }

  109.               if(KEY3_2 ==0 )                                                                        //确认按键2被按下

  110.                   {

  111.                    flag3 = 2;                                                                                        //标志位赋值2

  112.                   }

  113.             }

  114.          else

  115.             {

  116.               flag3 = 0;                                                                //否则标志位为0

  117.             }

  118.              Delay(20);                                                                //延时20ms
  119.                   /*第四路*/
  120.                    if((KEY4_1 ==0 )||(KEY4_2 ==0 ))                                                        //按键1或按键2被按下

  121.             {

  122.               if(KEY4_1 ==0 )                                                                                                //确认按键1被按下

  123.                 {

  124.                  flag4 = 1;                                                                                                //标志位赋值1

  125.                 }

  126.              if(KEY4_2 ==0 )                                                                        //确认按键2被按下

  127.                 {

  128.                  flag4 = 2;                                                                                        //标志位赋值2

  129.                 }

  130.             }

  131.           else

  132.             {

  133.              flag4 = 0;                                                                //否则标志位为0

  134.             }

  135.              Delay(20);                                                                //延时20ms
  136.                      /*第五路*/
  137.                       if((KEY5_1 ==0 )||(KEY5_2 ==0 ))                                                        //按键1或按键2被按下

  138.               {

  139.                if(KEY5_1 ==0 )                                                                                                //确认按键1被按下

  140.                   {

  141.                    flag5 = 1;                                                                                                //标志位赋值1

  142.                   }

  143.                if(KEY5_2 ==0 )                                                                        //确认按键2被按下

  144.                   {

  145.                    flag5 = 2;                                                                                        //标志位赋值2

  146.                   }

  147.              }

  148.           else

  149.              {

  150.               flag5 = 0;                                                                //否则标志位为0

  151.              }

  152.               Delay(20);                                                                //延时20ms
  153.                          /*第六路*/
  154.                            if((KEY6_1 ==0 )||(KEY6_2 ==0 ))                                                        //按键1或按键2被按下

  155.                {

  156.                 if(KEY6_1 ==0 )                                                                                                //确认按键1被按下

  157.                    {

  158.                     flag6 = 1;                                                                                                //标志位赋值1

  159.                    }

  160.                if(KEY6_2 ==0 )                                                                        //确认按键2被按下

  161.                   {

  162.                    flag6 = 2;                                                                                        //标志位赋值2

  163.                   }

  164.               }

  165.             else

  166.               {

  167.                flag6 = 0;                                                                //否则标志位为0

  168.               }

  169.                Delay(20);                                                                //延时20ms

  170.   }
  171. }






  172.    


  173. /*****中断程序*******/
  174. void timer0(void) interrupt 1

  175. {      

  176.    if(flag1==1)        PWM_Value1 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  177.    if(flag1==2)        PWM_Value1 -= 10;                                                        //如果标志位为2时,pwm的值减1
  178.    if(PWM_Value1>=2500)                                                                                //如果pwm的值大于2500
  179.    PWM_Value1 = 2500;                                                                                                //则保持在2500
  180.    if(PWM_Value1<=500)                                                                                        //如果pwm的值小于500
  181.    PWM_Value1=500;                                                                                                        //则保持在500


  182.    if(flag2==1)        PWM_Value2 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  183.    if(flag2==2)        PWM_Value2 -= 10;                                                        //如果标志位为2时,pwm的值减1
  184.    if(PWM_Value2>=2500)                                                                                //如果pwm的值大于2500
  185.    PWM_Value2 = 2500;                                                                                                //则保持在2500
  186.    if(PWM_Value2<=500)                                                                                        //如果pwm的值小于500
  187.    PWM_Value2=500;                                                                                                        //则保持在500


  188.    if(flag3==1)        PWM_Value3 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  189.    if(flag3==2)        PWM_Value3 -= 10;                                                        //如果标志位为2时,pwm的值减1
  190.    if(PWM_Value3>=2500)                                                                                //如果pwm的值大于2500
  191.    PWM_Value3 = 2500;                                                                                                //则保持在2500
  192.    if(PWM_Value3<=500)                                                                                        //如果pwm的值小于500
  193.    PWM_Value3=500;                                                                                                        //则保持在500


  194.    if(flag4==1)        PWM_Value4 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  195.    if(flag4==2)        PWM_Value4 -= 10;                                                        //如果标志位为2时,pwm的值减1
  196.    if(PWM_Value4>=2500)                                                                                //如果pwm的值大于2500
  197.    PWM_Value4 = 2500;                                                                                                //则保持在2500
  198.    if(PWM_Value4<=500)                                                                                        //如果pwm的值小于500
  199.    PWM_Value4=500;                                                                                                        //则保持在500


  200.    if(flag5==1)        PWM_Value5 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  201.    if(flag5==2)        PWM_Value5 -= 10;                                                        //如果标志位为2时,pwm的值减1
  202.    if(PWM_Value5>=2500)                                                                                //如果pwm的值大于2500
  203.    PWM_Value5 = 2500;                                                                                                //则保持在2500
  204.    if(PWM_Value5<=500)                                                                                        //如果pwm的值小于500
  205.    PWM_Value5=500;                                                                                                        //则保持在500


  206.    if(flag6==1)        PWM_Value6 += 10;                                                        //如果标志位为1时,pwm的值加1                                                                        
  207.    if(flag6==2)        PWM_Value6 -= 10;                                                        //如果标志位为2时,pwm的值减1
  208.    if(PWM_Value6>=2500)                                                                                //如果pwm的值大于2500
  209.    PWM_Value6 = 2500;                                                                                                //则保持在2500
  210.    if(PWM_Value6<=500)                                                                                        //如果pwm的值小于500
  211.    PWM_Value6=500;                                                                                                        //则保持在500


  212.         switch(order)
  213.          
  214.         {
  215.          
  216.                 case 1:(PWM_OUT1=1);
  217.          
  218.                            TH0=(65536-PWM_Value1)>>8;
  219.          
  220.                            TL0=(uchar)(65536-PWM_Value1);
  221.          
  222.                            break;                          
  223.          
  224.                 case 2:(PWM_OUT1=0);
  225.          
  226.                            TH0=(65536-(5000-PWM_Value1))>>8;   
  227.          
  228.                            TL0=(uchar)(65536-(5000-PWM_Value1));
  229.            
  230.                            break;
  231.                    case 3:
  232.          
  233.                            TH0=60536>>8;   
  234.          
  235.                            TL0=(uchar)60536;
  236.          
  237.                            break;
  238.          
  239.                 case 4:
  240.          
  241.                            TH0=60536>>8;   
  242.          
  243.                            TL0=(uchar)60536;
  244.          
  245.                            order=0;
  246.          
  247.                            break;
  248.                                                      
  249.                  case 5:(PWM_OUT2=1);
  250.          
  251.                            TH0=(65536-PWM_Value2)>>8;
  252.          
  253.                            TL0=(uchar)(65536-PWM_Value2);
  254.          
  255.                            break;                          
  256.          
  257.                 case 6:(PWM_OUT2=0);
  258.          
  259.                            TH0=(65536-(5000-PWM_Value2))>>8;   
  260.          
  261.                            TL0=(uchar)(65536-(5000-PWM_Value2));
  262.          
  263.                            break;
  264.                    case 7:
  265.          
  266.                            TH0=60536>>8;   
  267.          
  268.                            TL0=(uchar)60536;
  269.          
  270.                            break;
  271.          
  272.                 case 8:
  273.          
  274.                            TH0=60536>>8;   
  275.          
  276.                            TL0=(uchar)60536;
  277.          
  278.                            order=0;
  279.          
  280.                            break;
  281.                 case 9:(PWM_OUT3=1);
  282.          
  283.                            TH0=(65536-PWM_Value3)>>8;
  284.          
  285.                            TL0=(uchar)(65536-PWM_Value3);
  286.          
  287.                            break;                          
  288.          
  289.                 case 10:(PWM_OUT3=0);
  290.          
  291.                            TH0=(65536-(5000-PWM_Value3))>>8;   
  292.          
  293.                            TL0=(uchar)(65536-(5000-PWM_Value3));
  294.          
  295.                            break;
  296.                 case 11:
  297.          
  298.                            TH0=60536>>8;   
  299.          
  300.                            TL0=(uchar)60536;
  301.          
  302.                            break;
  303.          
  304.                 case 12:
  305.          
  306.                            TH0=60536>>8;   
  307.          
  308.                            TL0=(uchar)60536;
  309.          
  310.                            order=0;
  311.          
  312.                            break;            
  313.                 case 13:(PWM_OUT4=1);
  314.          
  315.                            TH0=(65536-PWM_Value4)>>8;
  316.          
  317.                            TL0=(uchar)(65536-PWM_Value4);
  318.          
  319.                            break;                          
  320.          
  321.                 case 14:(PWM_OUT4=0);
  322.          
  323.                            TH0=(65536-(5000-PWM_Value4))>>8;   
  324.          
  325.                            TL0=(uchar)(65536-(5000-PWM_Value4));
  326.          
  327.                            break;
  328.                 case 15:
  329.          
  330.                            TH0=60536>>8;   
  331.          
  332.                            TL0=(uchar)60536;
  333.          
  334.                            break;
  335.          
  336.                 case 16:
  337.          
  338.                            TH0=60536>>8;   
  339.          
  340.                            TL0=(uchar)60536;
  341.          
  342.                            order=0;
  343.          
  344.                            break;
  345.            
  346.                 case 17:(PWM_OUT5=1);
  347.          
  348.                            TH0=(65536-PWM_Value5)>>8;
  349.          
  350.                            TL0=(uchar)(65536-PWM_Value5);
  351.          
  352.                            break;                          
  353.          
  354.                 case 18:(PWM_OUT5=0);
  355.          
  356.                            TH0=(65536-(5000-PWM_Value5))>>8;   
  357.          
  358.                            TL0=(uchar)(65536-(5000-PWM_Value5));
  359.          
  360.                            break;
  361.                    case 19:
  362.          
  363.                            TH0=60536>>8;   
  364.          
  365.                            TL0=(uchar)60536;
  366.          
  367.                            break;
  368.          
  369.                 case 20:
  370.          
  371.                            TH0=60536>>8;   
  372.          
  373.                            TL0=(uchar)60536;
  374.          
  375.                            order=0;
  376.          
  377.                            break;
  378.                 case 21:(PWM_OUT6=1);         
  379.                            TH0=(65536-PWM_Value6)>>8;
  380.                            TL0=(uchar)(65536-PWM_Value6);
  381.                            break;                                   
  382.                 case 22:(PWM_OUT6=0);         
  383.                            TH0=(65536-(5000-PWM_Value6))>>8;            
  384.                            TL0=(uchar)(65536-(5000-PWM_Value6));         
  385.                            break;        
  386.                 case 23:         
  387.                            TH0=60536>>8;            
  388.                            TL0=(uchar)60536;         
  389.                            break;         
  390.                 case 24:         
  391.                            TH0=60536>>8;            
  392.                            TL0=(uchar)60536;         
  393.                            order=0;         
  394.                            break;         
  395.         default: order=0;         
  396.                            break;
  397.         }
  398.         order++;

  399. }
复制代码


回复

使用道具 举报

ID:1118046 发表于 2024-5-9 14:36 | 显示全部楼层
可以,没什么问题
回复

使用道具 举报

ID:1119940 发表于 2024-5-9 15:54 | 显示全部楼层
是这样写的
回复

使用道具 举报

ID:883242 发表于 2024-5-11 22:12 | 显示全部楼层
你亲自测试一下不就知道好用不好用了吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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