找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1362|回复: 2
收起左侧

单片机控制舵机

[复制链接]
ID:583148 发表于 2019-7-12 19:31 | 显示全部楼层 |阅读模式
舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

如下图可形象地表示脉冲与角度关系

#include <reg52.h>
unsigned char count;                        //0.5ms次数标识
sbit pwm=P1^0;                                //信号输出
sbit jia=P1^1;                                //角度增加按键
sbit jan=P1^2;                                //角度减小按键
char jd;                                        //角度标识
void delay(unsigned int i)
{
        unsigned int j,k;
        for(j=i;j>0;j--)
                for(k=125;k>0;k--);
}
void Time0_init()                        //定时器初始化
{
        TMOD=0x01;
        IE=0x82;
        TH0=0xff;
        TL0=0x19;                                //12晶振,0.25ms
        TR0=1;                                   //定时器开始
}
void Time0_int() interrupt 1                        //中断程序
{
        TH0=0xff;
        TL0=0x19;
        if(count<jd) //输出count个高电平
                pwm=1;
        else
        pwm=0;    //其余输出低电平
        count++;
        count=count%40;  //时钟保持40个count 即20ms
}
void keyscan()                                //按键扫描
{
        if(jia==0)                                //角度增加键是否按下
        {
                delay(50);                        //按下延时,消抖
                if(jia==0)
                {
                        jd++;                        //角度标识加1
                        count=0;                //按键按下,则20ms周期重新开始
                        if(jd==50)
                                jd=9;                         //已经是180°则保持
                                while(jia==0);         //等待按键放开
                }
        }
        if(jan==0)                                         //角度减小键是否按下
        {
                delay(10);
                if(jd==0);
                {
                        jd--;                                 //角度标识减1
                        count=0;
                        if(jd==0)
                                jd=1;
                        while(jan==0);
                }
        }
}

void main()
{
        jd=1;
        count=0;
        Time0_init();
        while(1)
        {
                keyscan();
//                display();
        }
}



回复

使用道具 举报

ID:1 发表于 2019-7-13 05:49 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:421308 发表于 2019-7-13 18:10 | 显示全部楼层
没有原理图看不懂啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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