找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5053|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

[求助]51單片機控制舵機程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:40082 發(fā)表于 2012-5-11 19:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
向各位大俠求助,用51單片機控制舵機旋轉(zhuǎn),90度180度都可以,最好將程序略加注釋,感謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:162106 發(fā)表于 2017-2-12 14:50 | 只看該作者
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit KEY1 = P3^2;        //定義調(diào)速的按鍵
sbit DC = P1^0;                //定義直流電機的控制端口
uchar CYCLE;                  //定義周期
uchar PWM;                    //定義低電平時間
/*********************************
函數(shù):Delay_1ms()
參數(shù):t
返回:無
功能:延時子程序,延時時間為 1ms * del。
          使用晶振是11.0592M。
**********************************/
void Delay_1ms(uint t)
{
        uint i,j;
        for(i=0;i<t;i++)
        {
                for(j=0;j<=100;j++)
                {
                        _nop_();
                }
        }       
}
/*********************************
函數(shù):Time0Init()
參數(shù):無
返回:無
功能:設(shè)置定時器0的工作方式2定時時長為100微秒,
      并打開中斷和啟動定時器。
          該例中使用的單片機晶振為11.0592M。
**********************************/
void Time0Init(void)
{
        TMOD = 0x02;        //設(shè)定定時器0工作在方式2模式
        TH0  = 0xA3;    //定時時長為100微秒的初值自動重載
        TL0  = 0xA3;    //定時時長為100微秒的初值
        ET0 = 1;        //打開定時器0中斷
        EA = 1;                    //打開總中斷
        TR0 = 1;            //啟動定時器
}
/*********************************
函數(shù):Time0Int()
參數(shù):無
返回:無
說明:定時器0中斷函數(shù)。用于處理PWM的信號。
**********************************/
void Time0Int(void) interrupt 1 using 1
{
        static uchar Count;   //當(dāng)前處于周期的什么時刻
        if(Count == PWM)    //判斷低電平時間是否結(jié)束
        {
                DC = 1;                 //直流電機轉(zhuǎn)
        }
        Count++;
        if(Count == CYCLE)  //一個周期結(jié)束
        {
                Count=0;
                if(PWM != 0)   //如果左右時間是0 保持原來狀態(tài)
                {
                        DC = 0;    //直流電機不轉(zhuǎn)
                }
        }
}
/*********************************
函數(shù):Key()
參數(shù):無
返回:無
功能:判斷KEY1是否按下并讓數(shù)碼管顯示和給PWM提供低電平時長。
**********************************/
void Key(void)
{
        static uchar Number = 1;                 //定義檔位,初始化為1檔
        if(KEY1 == 0)   // 判斷是否有按鍵按下
          {
                   Delay_1ms(15);   //延時抗干擾信號
                   if(KEY1 == 0)    //再次判斷是否有按鍵按下
              {
                           Number++;           //按一下P3.2口,就給直流電機換一個檔位
                          if(Number == 6)   //等于6時,給檔位重新賦值1
                        {
                                Number = 1;
               }
                        switch(Number)
                        {
                               case 1:
                                {
                                        P0=0x06;        //數(shù)碼管顯示1       
                                        PWM=175;    //高電平2.5毫秒,舵機旋轉(zhuǎn)到右極限(為+90度)
                                        break;       
                                }
                                   case 2:
                                {
                                        P0=0x5B;        //數(shù)碼管顯示2
                                        PWM=180;    //高電平2毫秒,舵機旋轉(zhuǎn)角度為+45度
                                        break;
                                }
                               case 3:
                                {
                                        P0=0x4F;        //數(shù)碼管顯示3
                                        PWM=185;    //高電平1.5毫秒,舵機旋轉(zhuǎn)角度為0度
                                        break;
                              }
                                case 4:
                                {
                                        P0=0x66;        //數(shù)碼管顯示4
                                        PWM=190;    //高電平1毫秒,舵機旋轉(zhuǎn)角度為-45度
                                        break;
                                }
                                case 5:
                                {
                                        P0=0x6d;        //數(shù)碼管顯示5
                                        PWM=195;    //高電平0.5毫秒,舵機旋轉(zhuǎn)角度為-90度
                                        break;
                               }
                                default:
                                        break;
                           }
                        while(1)    //按鍵釋放
                        {
                                if(KEY1 == 1)   //判斷是否釋放
                                {
                                        break;
                                }
                        }
                  }
        }
}
/*********************************
函數(shù):Main()
參數(shù):無
返回:無
功能:主函數(shù)
**********************************/
void main(void)
{
        Time0Init();    //定時器0初始化
        CYCLE = 200;        //定義PWM周期為20毫秒
        P2 = 0xfe;          //數(shù)碼管最后一位亮
        while(1)
        {
                Key();       
        }
}
回復(fù)

使用道具 舉報

板凳
ID:254537 發(fā)表于 2018-12-18 23:40 | 只看該作者
#include <reg52.h>
unsigned char count;                        //0.5ms次數(shù)標(biāo)識
sbit pwm=P1^0;                                //信號輸出
sbit jia=P1^1;                                //角度增加按鍵
sbit jan=P1^2;                                //角度減小按鍵
char jd;                                        //角度標(biāo)識
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++;                        //角度標(biāo)識加1
                        count=0;                //按鍵按下,則20ms周期重新開始
                        if(jd==50)
                                jd=9;                         //已經(jīng)是180°則保持
                                while(jia==0);         //等待按鍵放開
                }
        }
        if(jan==0)                                         //角度減小鍵是否按下
        {
                delay(10);
                if(jd==0);
                {
                        jd--;                                 //角度標(biāo)識減1
                        count=0;
                        if(jd==0)
                                jd=1;
                        while(jan==0);
                }
        }
}

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

使用道具 舉報

地板
ID:1146561 發(fā)表于 2025-3-28 23:15 | 只看該作者
20151470 發(fā)表于 2017-2-12 14:50
#include
#include
#define uchar unsigned char

請問大佬有這個proteus的仿真連線圖嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表