欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2416|回復: 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 單片機教程網

快速回復 返回頂部 返回列表