stc单片机吧 关注:1,862贴子:2,527
  • 19回复贴,共1

做个简易舵机控制器,思路来源于大神 我爱萝丽爱萝丽。

只看楼主收藏回复

做个简易舵机控制器,思路来源于大神 我爱萝丽爱萝丽。


IP属地:辽宁来自Android客户端1楼2018-03-18 13:30回复
    先上原理图,加了一个指示灯,我的习惯就是只要有条件就给加一个指示灯,了解单片机运行情况的。


    IP属地:辽宁2楼2018-03-18 13:55
    回复
      2025-07-31 14:20:35
      广告
      不感兴趣
      开通SVIP免广告
      经过将近2小时的奋战,楼主终于焊接完毕。


      IP属地:辽宁来自Android客户端3楼2018-03-18 15:06
      回复
        背面图片


        IP属地:辽宁来自Android客户端4楼2018-03-18 15:32
        回复
          //STC15W408AS 11.0592MHz QQ:1149268555
          #include<reg52.h>
          #include<intrins.h>
          #define U8 unsigned char
          #define U16 unsigned int
          #define U32 unsigned long
          sfr P1M0 = 0x92;
          sfr P1M1 = 0x91;
          sfr P2M0 = 0x96;
          sfr P2M1 = 0x95;
          sfr P3M0 = 0xb2;
          sfr P3M1 = 0xb1;
          sfr P5 = 0xC8;
          sfr ADC_CONTR = 0xBC;
          sfr ADC_RES = 0xBD;
          sfr ADC_LOW2 = 0xBE;
          sfr P1ASF = 0x9D;
          sfr AUXR = 0x8e;
          sfr T2H = 0xD6;
          sfr T2L = 0xD7;
          sbit led = P3^2;
          sbit OUT1 = P1^2;
          sbit OUT2 = P1^3;
          sbit OUT3 = P1^4;
          sbit OUT4 = P1^5;
          bit flagTxd =0;
          U8 cntRxd=0;
          U8 flagRxd=0;
          U8 pdata bufRxd[64];
          U8 GetADC(U8 ch)
          {
          ADC_CONTR=0x80|0x00|ch|0x08;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          while (!(ADC_CONTR&0x10));
          ADC_CONTR&=~0x10;
          return ADC_RES;
          }
          void InitADC()
          {
          P1ASF=0x02;
          ADC_RES=0;
          ADC_CONTR=0x80|0x00;
          }
          main()
          {
          U8 i;
          InitADC();
          TR1=1;
          while(1)
          {
          i=GetADC(1);
          if(i>128)led=0;
          else led=1;
          }
          }


          IP属地:辽宁5楼2018-03-18 17:08
          收起回复
            完成图,但是程序里的数据和我想的理论不一样啊,为啥?


            IP属地:辽宁来自Android客户端6楼2018-03-18 21:20
            回复
              楼主你好,我要做个采摘机器人比赛用,想问问您怎么才能通过机械手判别物体大小啊


              来自Android客户端9楼2018-03-20 20:23
              收起回复
                //STC15W408AS 11.0592MHz QQ:1149268555
                #include<reg52.h>
                #include<intrins.h>
                #define U8 unsigned char
                #define U16 unsigned int
                #define U32 unsigned long
                sfr P1M0 = 0x92;
                sfr P1M1 = 0x91;
                sfr P2M0 = 0x96;
                sfr P2M1 = 0x95;
                sfr P3M0 = 0xb2;
                sfr P3M1 = 0xb1;
                sfr P5 = 0xC8;
                sfr ADC_CONTR = 0xBC;
                sfr ADC_RES = 0xBD;
                sfr ADC_LOW2 = 0xBE;
                sfr P1ASF = 0x9D;
                sfr AUXR = 0x8e;
                sfr T2H = 0xD6;
                sfr T2L = 0xD7;
                sbit led = P3^2;
                sbit OUT1 = P1^2;
                sbit OUT2 = P1^3;
                sbit OUT3 = P1^4;
                sbit OUT4 = P1^5;
                bit flagTxd =0;
                U8 cntRxd=0;
                U8 flagRxd=0;
                U8 pdata bufRxd[64];
                U8 pdata Data[64];
                U8 num;
                U8 ch=2;
                U8 ms;
                void Delay05ms()//@11.0592MHz 0.5
                {
                unsigned char i, j;
                i = 6;
                j = 100;
                do
                {
                while (--j);
                } while (--i);
                }
                void Delay(U16 t)
                {do
                { Delay05ms();
                } while (--t);
                }
                void Delay4us()//@11.0592MHz
                {
                unsigned char i;
                i = 14;
                while (--i);
                }
                void delays(U8 i)
                {
                while(i--)
                Delay4us();
                }
                U8 GetADC(U8 ch)
                {
                ADC_CONTR=0x80|0x00|ch|0x08;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                while (!(ADC_CONTR&0x10));
                ADC_CONTR&=~0x10;
                return ADC_RES;
                }
                void InitADC()
                {
                P1ASF=0x02;
                ADC_RES=0;
                ADC_CONTR=0x80|0x00;
                Delay(100);
                }
                void UartInit(void)
                {
                SCON = 0x50;
                AUXR |= 0x01;
                AUXR |= 0x04;
                T2L = 0xe8;
                T2H = 0xFf;
                AUXR |= 0x10;
                ES = 1;
                EA = 1;
                }
                void Timer0Init(void)//2ms @11.0592MHz
                {
                IP=0x10;
                ET0=1;
                AUXR |= 0x80;
                TMOD &= 0xF0;
                TL0 = 0x66;
                TH0 = 0x7e;
                TF0 = 0;
                TR0 = 1;
                }
                void UartWrite(U8 *buf, U8 len)
                {
                while (len--)
                {
                flagTxd = 0;
                SBUF = *buf++;
                while (!flagTxd);
                }
                Delay(1);
                }
                main()
                {
                InitADC();
                Timer0Init();
                UartInit();
                while(1)
                {
                Data[0]=GetADC(1);
                if(flagRxd==1)
                {
                Delay05ms();
                led=~led;
                Data[1]=bufRxd[1];
                Data[2]=bufRxd[2];
                Data[3]=bufRxd[3];
                UartWrite(Data,1);
                flagRxd=0;
                cntRxd=0;
                }
                }
                }
                void Time0()interrupt 1
                {
                ms++;
                if(ms==12)ms=0;
                switch(ms)
                {
                case 0:OUT1=1,Delay05ms(),delays(255-Data[0]),OUT1=0;break;
                case 1:OUT2=1,Delay05ms(),delays(Data[0]),OUT2=0;break;
                case 2:OUT3=1,Delay05ms(),delays(Data[0]),OUT3=0;break;
                case 3:OUT4=1,Delay05ms(),delays(Data[1]),OUT4=0;break;
                }
                }
                void InterruptUART() interrupt 4
                {
                if (RI)
                {
                RI = 0;
                flagRxd=1;
                if (cntRxd < sizeof(bufRxd))
                {
                bufRxd[cntRxd++] = SBUF;
                }
                }
                if (TI)
                {
                TI = 0;
                flagTxd = 1;
                }
                }


                IP属地:辽宁10楼2018-03-21 22:18
                回复
                  2025-07-31 14:14:35
                  广告
                  不感兴趣
                  开通SVIP免广告
                  你好,哪里能看萝莉大神的帖子啊


                  IP属地:四川来自Android客户端11楼2018-04-13 21:50
                  收起回复
                    求教大佬
                    我就是想让舵机实现一个特别简单的动作。就是通电它就转动90度,然后停止不动。等我断电他就回复原位,就是原路转过去。我是个小白,求教我怎么能实现这个动作啊?舵机不可以用普通开关控制吗?


                    IP属地:辽宁来自iPhone客户端12楼2019-04-16 23:30
                    回复
                      厉害!请问有玩过DMX512调光吗


                      IP属地:广东13楼2019-05-05 17:47
                      回复
                        吧主你怎么不当了吧主呢


                        IP属地:辽宁来自Android客户端14楼2021-03-17 17:44
                        回复