bolt_Master423 2024-09-22 19:41 采纳率: 40%
浏览 6
已结题

(标签-51单片机|关键词-#include)

51单片机按键控制舵机转动,但是舵机只能转到底,按按键没反应
舵机电路没问题,按键也没问题。用其他程序都是跑得动的,不知道为什么不行

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
sbit PWM=P2^1;
// _nop_()延时一个机器周期
typedef unsigned int u16;
typedef unsigned char u8;
u8 count = 0;
u8 timer1;
u8 angle;
u16 n;
sbit k1=P3^0;//角度增加
sbit k2=P3^1;//角度减小
/*
对于180°舵机
t = 0.5ms——————-舵机会转动 0 ° 
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180
*/

/*延时程序*/
 void delay(u16 n)//一个n约延时1ms
{
    u16 x,y;
    for(x=0;x<114;x++)
    for(y=0;y<n;y++);
}
void delay1s(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}

/*按键扫描程序*/
void keyscan()
{    
    if(k1==0)
    {    
        if(k1==0)
            delay(100);
        {
            angle+=5;
        }
        while(!k1);    
    }
    if(k2==0)
    {    
        if(k2==0)
            delay(100);
        {
            angle-=5;
        }
        while(!k2);    
    }
}



/*定时器T0初始化*/
void Timer0_Init()           
{
    TMOD &= 0x00;
    TMOD |= 0x01; //定时器T0设置成方式1
 
    TH0 = 0xff;   //定时常数 0.1ms 晶振为11.0592MHz
    TL0 = 0xb2;
 
    ET0 = 1;      
    TR0 = 1; 
        EA=1; 
}
    
/*T0中断初始化*/
void Time0_Init() interrupt 1 
{
    TR0 = 0; 
    TH0 = 0xff; // 0.1ms
    TL0 = 0xb2;
    
    if(count <= timer1) //5==0° 15==90°
    { 
        PWM = 1; 
    }
    else 
    { 
        PWM = 0; 
    }
    count++;
    if (count >= 200) //T = 20ms清零
    { 
        count = 0; 
    }
    TR0 = 1; //开启T0
}
void main()
{
    Timer0_Init();
    timer1=5;
    n=500;
    while(1)
    {
        keyscan();
        if(angle>25)
            angle=25;
        if(angle<5)
            angle=5;
        timer1=angle;
        count=0;
        delay1s();
        timer1=5;
        count=0;
        delay1s();
    }
}


  • 写回答

11条回答 默认 最新

  • GISer Liu 2024-09-22 22:11
    关注

    该回答引用自GPT-4o, 由博主 GISer Liu 编写:

    问题分析

    用户在使用51单片机控制舵机转动时,发现舵机只能转到底,按按键没有反应。用户已经确认舵机电路和按键电路没有问题,并且使用其他程序时舵机可以正常工作。

    关键点

    1. 舵机只能转到底:说明舵机的PWM信号可能没有正确生成,或者PWM信号的占空比没有正确调整。
    2. 按键没有反应:说明按键扫描程序可能存在问题,导致按键按下时没有正确改变舵机的角度。

    解决方案

    1. 检查PWM信号生成

    首先,检查PWM信号的生成是否正确。PWM信号的占空比决定了舵机的角度,因此需要确保占空比能够正确调整。

    2. 检查按键扫描程序

    按键扫描程序需要确保在按键按下时能够正确改变舵机的角度,并且能够正确地退出按键扫描循环。

    代码修改

    1. 修改PWM信号生成部分

    Time0_Init()中断服务程序中,确保PWM信号的占空比能够正确调整。

    void Time0_Init() interrupt 1 
    {
        TR0 = 0; 
        TH0 = 0xff; // 0.1ms
        TL0 = 0xb2;
        
        if(count <= timer1) //5==0° 15==90°
        { 
            PWM = 1; 
        }
        else 
        { 
            PWM = 0; 
        }
        count++;
        if (count >= 200) //T = 20ms清零
        { 
            count = 0; 
        }
        TR0 = 1; //开启T0
    }
    

    2. 修改按键扫描程序

    按键扫描程序需要确保在按键按下时能够正确改变舵机的角度,并且能够正确地退出按键扫描循环。

    void keyscan()
    {    
        if(k1 == 0)
        {    
            delay(100); // 去抖动
            if(k1 == 0)
            {
                angle += 5;
                if(angle > 25) angle = 25; // 限制最大角度
                timer1 = angle; // 更新舵机角度
                count = 0; // 重置计数器
                while(!k1); // 等待按键释放
            }
        }
        if(k2 == 0)
        {    
            delay(100); // 去抖动
            if(k2 == 0)
            {
                angle -= 5;
                if(angle < 5) angle = 5; // 限制最小角度
                timer1 = angle; // 更新舵机角度
                count = 0; // 重置计数器
                while(!k2); // 等待按键释放
            }
        }
    }
    

    3. 主程序调整

    在主程序中,确保按键扫描程序能够正确执行,并且舵机的角度能够正确更新。

    void main()
    {
        Timer0_Init();
        timer1 = 5;
        angle = 5; // 初始角度
        while(1)
        {
            keyscan();
            delay1s(); // 延时1秒
        }
    }
    

    总结

    通过以上修改,确保了PWM信号的占空比能够正确调整,并且按键扫描程序能够正确改变舵机的角度。这样,舵机在按下按键时应该能够正确转动到相应的角度。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 今天
  • 已采纳回答 9月22日
  • 修改了问题 9月22日
  • 创建了问题 9月22日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?