找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1742|回复: 0
收起左侧

单片机模仿舵机测试仪 按键控制 源程序

[复制链接]
ID:210365 发表于 2021-8-19 22:49 | 显示全部楼层 |阅读模式
我想模仿舵机测试仪,但是把旋钮改成按键,用按键控制档位, 空档-1档-2档-3档-空档 循环
现在遇到两个问题,请教高手:
1。按键反应不是很灵敏,有时要按好几次才有用
2。 从空档 - 1档 -2档 -3档 切换正常,但从3档切换到空档时切换不到了,会跳到1档,不知道是什么问题

单片机代码如下:
  1. #include <REG51.H>
  2. #include <intrins.h>  
  3.    
  4. #define uint unsigned int   
  5. #define uchar unsigned char   
  6.    
  7. sbit motor=P3^2;    //接舵机
  8. sbit key=P3^4;   //用按键控制档位, 空档-1档-2档-3档-空档 循环
  9. sbit led=P3^3;  //led闪动几次表明当前档位
  10. uint a;             //转动角度  
  11. uchar num=1;
  12. uchar dangwei=0; //挡位
  13. int i;
  14. sfr AUXR=0x8E;



  15. void delay(unsigned char z)
  16. {
  17.          unsigned char x,y;
  18.          for(x=125;x>0;x--)
  19.                  for(y=z;y>0;y--);
  20. }

  21. //延时1毫秒
  22. void Delay1ms()                //@12.000MHz
  23. {
  24.         unsigned char i, j;

  25.         i = 12;
  26.         j = 169;
  27.         do
  28.         {
  29.                 while (--j);
  30.         } while (--i);
  31. }

  32. //延时n毫秒函数
  33. void DelayMs(unsigned int n)
  34. {
  35.    do
  36.    {
  37.           Delay1ms();
  38.    }while(n--);

  39. }

  40. void delayms1(void)                   //延时函数
  41. {
  42.   unsigned int i;

  43.   i = 1000;
  44.   while(i--);
  45. }

  46. //闪灯函数 根据n确定闪烁间隔毫秒
  47. void Flash(unsigned int n)
  48. {
  49.    
  50.     led=1;
  51.           DelayMs(n);
  52.           led=0;
  53.           DelayMs(n);

  54. }
  55.    
  56. void T0_time() interrupt 1   
  57. {   
  58.     switch(num)   
  59.     {   
  60.         case 0:   
  61.             TH0=(58300-a*120)/256;   
  62.             TL0=(58300-a*120)%256;   
  63.             motor=1;   
  64.             num=1;   
  65.             break;   
  66.         case 1:   
  67.             TH0=(15800+a*121)/256;   
  68.             TL0=(15800+a*121)%256;   
  69.             motor=0;   
  70.             num=2;   
  71.             break;   
  72.         case 2:   
  73.             TH0=0x27;   
  74.             TL0=0xc4;   
  75.             motor=0;   
  76.             num=3;   
  77.             break;   
  78.         case 3:   
  79.             TH0=0x27;   
  80.             TL0=0xc4;   
  81.             motor=0;   
  82.             num=4;   
  83.             break;   
  84.         case 4:   
  85.             TH0=0x27;   
  86.             TL0=0xc4;   
  87.             motor=0;   
  88.             num=0;   
  89.             break;   
  90.            
  91.     }      
  92. }


  93. void T0_init()   
  94. {   
  95.     AUXR=0X80;   
  96.     TMOD|=0x01;   
  97.     TH0=0x27;   
  98.     TL0=0xc4;   
  99.     EA=1;   
  100.     ET0=1;   
  101.     TR0=1;      
  102. }   
  103.    
  104. void main(void)   
  105. {   
  106.     T0_init();
  107.         
  108.          
  109.         
  110.           key=1;

  111.     dangwei=0; //默认档位0,空档
  112.     a=25;             //舵机初始位置
  113.       
  114.     while(1)
  115.                 {


  116.                                 //a=150; //最高转角,对比舵机测试仪得到
  117.         //a=25;  //最低转角,对比舵机测试仪得到

  118.                         
  119.          if (key==0)
  120.          {      
  121.                  DelayMs(3); //按下延时,消抖
  122.                  
  123.                  if (key==0) {
  124.                         
  125.                         led = 1;
  126.                         
  127.                   dangwei = dangwei + 1;  //按键增加档位
  128.                                           
  129.                         
  130.                 }
  131.          }
  132.          
  133.          
  134.       if (dangwei > 3)  //当前档位是最高档时,转空档
  135.                         {
  136.                                 led = 1;
  137.                                 dangwei = 0;  //空档
  138.                                 a = 25;
  139.                         }         
  140.                   

  141.    if (dangwei == 0) {   //空档
  142.                  
  143.                  a=25; led = 1;
  144.                  
  145.          } else if (dangwei ==1) {   //低速
  146.                  
  147.       a = 70; Flash(200); led=1; DelayMs(1000);
  148.                  
  149.          } else if (dangwei == 2) {  //中速
  150.                  
  151.                   a =110; Flash(200);Flash(200);  led=1; DelayMs(1000);
  152.                  
  153.          } else if (dangwei == 3) {  //全速
  154.                  
  155.                  a=150; Flash(200);Flash(200);Flash(200);  led=1; DelayMs(1000);
  156.                  
  157.          }
  158.                         

  159.                
  160.         }           
  161. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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