找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1944|回复: 2
打印 上一主题 下一主题
收起左侧

单片机控制舵机 追日程序

[复制链接]
跳转到指定楼层
楼主
ID:510648 发表于 2019-5-7 12:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "STC15F2K60S2.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**************函数声明****************/
void Adjust(void);
void Timer0_Init(void);
void delay(unsigned int ms);
void direction();
/***************定义使用的I/O管脚*****************/
//模块信号输入端口
sbit IN_1=P0^0;
sbit IN_2=P0^1;
sbit IN_3=P0^2;
sbit IN_4=P0^3;
sbit east= P0^4;
sbit south= P0^5;
sbit western= P0^6;
sbit north= P0^7;
//PWM输出
sbit PWM=P4^1;
sbit PWM2=P4^2;
//选择信号
uchar pwm_flag=0;
//定时器初值
uint code low_ms=461;            //0.5ms 舵机0度对应占空比  11.0592Mhz
uint code high_ms=9216;          //10ms
uint pwm[]={1382,1382};           //1.5ms,舵机1和舵机2处于90度位郑50%占空比
void main()
{
        //设定舵机输出端口为强推挽输出模式
        P4M0=0X06;
        P4M1=0X00;
        //PO端口设为双向I/O口
        P0M0=0X00;
        P0M1=0X00;
        Timer0_Init();
        while(1)
        {
                Adjust();
                direction();
        }
}
/************舵机控制**************/
void Adjust(void)
{
        //判断3,4口引脚输入状态
                if(IN_2==1&&IN_1==0)                                                               
        {
                pwm[1]=pwm[1]+5;               //  舵机向北转0.5度
                        if(pwm[1]>1602)              //1602us向北转20度
                        pwm[1]=1602;                 //不大于20度
        }
        else if(IN_2==1&&IN_1==1)
        {
                pwm[1]=pwm[1];
        }
        else if(IN_2==0&&IN_1==1)      
        {
                pwm[1]=pwm[1]-5;              //舵机向南转0.5度
                if(pwm[1]<1102)               //1102 向南转20度
                        pwm[1]=1102;                //不大于20度
        }
                //判断1,2口引脚输入状态
        if(IN_4==1&&IN_3==0)
        {
                pwm[0]=pwm[0]+5;             //舵机向西转0.5度
                        if(pwm[0]>2304)            //不大于180度
                        pwm[0]=2304;
        }
        else if(IN_4==1&&IN_3==1)
        {
                pwm[0]=pwm[0];
        }
        else if(IN_4==0&&IN_3==1)
        {
                pwm[0]=pwm[0]-5;             //舵机向东转0.5度
                if(pwm[0]<461)               //到0度时不继续往下
                        pwm[0]=461;
        }
       
        delay(30);
}

void direction()
{
                        if(pwm[0]>1402)             //西面时,西方向灯点亮
                {
                        east=1;
                        western=0;
                }
                else if(pwm[0]<1362)          //东面时,西方向灯点亮
                {
                        east=0;
                        western=1;
                }
                else
                {
                        east=1;
                        western=1;
                }
                if(pwm[1]>1402)                //南面时,南方向灯点亮
                {
                        south=0;
                        north=1;
                }
                else if(pwm[1]<1362)          //北面时,北方向灯点亮
                {
                        south=1;
                        north=0;       
                }
                else
                {
                        south=1;
                        north=1;
                }
}

void Timer0_Init(void)
{
        TMOD |=0x01;
        TH0=-high_ms>>8;      
        TL0=-high_ms;
        TR0 = 1;                //定时器0开始计时
        EA = 1;
        ET0 = 1;
       
}

void timer() interrupt 1

{

    switch(pwm_flag)

    {


        case 1:  PWM=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;                       // 高电平持续时间pwm[0]

        case 2:  PWM=0; TH0=-(high_ms-pwm[0])>>8; TL0=-(high_ms-pwm[0]); break;   //低电平时间10-pwm[0] ms

                                case 3:  PWM2=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;                      // 高电平持续时间pwm[1]
                       
        case 4:  PWM2=0; TH0=-(high_ms-pwm[1])>>8; TL0=-(high_ms-pwm[1]); break; //低电平时间10-pwm[1] ms
                       
                                default: TH0=0xff; TL0=0x80; pwm_flag=0;

  }

    pwm_flag++;

}


//毫秒延时
void delay(unsigned int ms)
{
     unsigned int i;
         do{
              i = 11059200 / 13000;
                  while(--i);
     }while(--ms);
}

评分

参与人数 1黑币 +3 收起 理由
kljie1000 + 3

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-5-7 16:00 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:699526 发表于 2020-3-9 14:36 | 只看该作者
有启发,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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