stc单片机吧 关注:1,843贴子:2,461
  • 11回复贴,共1
楼主最近在练吉他,单片机荒废了,今天继续以前的项目,完善自动寻光。


IP属地:辽宁来自Android客户端1楼2018-07-15 11:30回复
    主要硬件有舵机2只,舵机2轴支架,自制寻光探头,stc408as


    IP属地:辽宁来自Android客户端2楼2018-07-15 11:35
    回复
      想要实现的功能:自动寻找光源


      IP属地:辽宁来自Android客户端3楼2018-07-15 11:37
      回复
        先找找我们需要的基本资料


        IP属地:辽宁5楼2018-07-15 13:48
        回复

          电路草图,以后没准会改


          IP属地:辽宁6楼2018-07-15 15:05
          回复

            正面布局设计


            IP属地:辽宁9楼2018-07-15 16:13
            回复

              背面设计


              IP属地:辽宁10楼2018-07-15 16:14
              回复
                焊接完成正面图


                IP属地:辽宁来自Android客户端11楼2018-07-15 16:44
                回复
                  焊接完成背面图


                  IP属地:辽宁来自Android客户端12楼2018-07-15 16:45
                  回复
                    程序涉及到哪些功能呢?
                    1、串口通讯 监控系统参数用
                    2、AD 模数转换
                    3、舵机控制
                    4、串口通讯,AD转换与舵机控制结合
                    按照以上步骤一步一步完善程序


                    IP属地:辽宁13楼2018-07-15 17:07
                    回复
                      //STC15F2K60S2 @11.0592MHz QQ:1149268555
                      #include<reg52.h>
                      #include<intrins.h>
                      #define U8 unsigned char
                      #define U16 unsigned int
                      sfr P4 = 0xC0;
                      sfr P5 = 0xC8;
                      sfr AUXR = 0x8E;
                      sfr ADC_CONTR = 0xBC;
                      sfr ADC_RES = 0xBD;
                      sfr ADC_LOW2 = 0xBE;
                      sfr P1ASF = 0x9D;
                      sfr T2H = 0xD6;
                      sfr T2L = 0xD7;
                      sbit M0 = P3^6; //9110
                      sbit M1 = P3^7;
                      sbit dj1 = P3^2;
                      sbit dj2 = P3^3;
                      sbit LED = P5^4;
                      int adc1,adc2,adc3,adc4;
                      U8 ch = 0; //ADC回路数
                      bit dc,zuo,you;
                      U8 ms,NRF_error=0,ReadData[32];
                      U8 code ABC[][6];
                      int mss,msss1,msss2;
                      bit flagTxd =0;
                      U8 cntRxd=0;
                      U8 flagRxd=0;
                      U8 pdata bufRxd[64];
                      //====================TIME==============================
                      void Delay4us()//@11.0592MHz
                      {
                      unsigned char i;
                      i = 14;
                      while (--i);
                      }
                      void delays(U8 i)
                      {
                      while(i--)
                      Delay4us();
                      }
                      void Delay05ms()//@11.0592MHz 0.5
                      {
                      unsigned char i, j;
                      i = 6;
                      j = 100;
                      do
                      {
                      while (--j);
                      } while (--i);
                      }
                      void Delay1ms()//@11.0592MHz
                      {
                      U8 i=11, j=190;
                      do
                      {
                      while (--j);
                      } while (--i);
                      }
                      void Delay(U16 t)//@11.0592MHz
                      {
                      while (--t)
                      Delay1ms();
                      }
                      void Timer0Init(void)//2ms @11.0592MHz
                      {
                      IP=0x10;
                      ET0=1;
                      AUXR |= 0x80;
                      TMOD &= 0xF0;
                      TL0 = 0x66;
                      TH0 = 0x7e;
                      TF0 = 0;
                      TR0 = 1;
                      }
                      //=====================ADC==================================
                      U8 GetADC(U8 ch)
                      {
                      ADC_CONTR=0x80|0x00|ch|0x08;
                      while (!(ADC_CONTR&0x10));
                      ADC_CONTR&=~0x10;
                      return ADC_RES;
                      }
                      void InitADC()
                      {
                      P1ASF=0x3c;
                      ADC_RES=0;
                      ADC_CONTR=0x80|0x00;
                      }
                      void UartInit(void)
                      {
                      SCON = 0x50;
                      AUXR |= 0x01;
                      AUXR |= 0x04;
                      T2L = 0xE0;
                      T2H = 0xFe;
                      AUXR |= 0x10;
                      ES = 1;
                      EA = 1;
                      }
                      void UartWrite(U8 *buf, U8 len)
                      {
                      while (len--)
                      {
                      flagTxd = 0;
                      SBUF = *buf++;
                      while (!flagTxd);
                      }
                      Delay(1);
                      }
                      void main()
                      {
                      U8 pdata Data[64];
                      InitADC();
                      UartInit();
                      TR1=1;
                      Timer0Init();
                      msss1=128;
                      msss2=128;
                      while(1)
                      {
                      Data[0]=GetADC(2);
                      Data[1]=GetADC(3);
                      Data[2]=GetADC(4);
                      Data[3]=GetADC(5);
                      Data[4]=msss1;
                      Data[5]=msss2;
                      adc1=Data[0];
                      adc2=Data[1];
                      adc3=Data[2];
                      adc4=Data[3];
                      if (mss>=10)
                      {
                      UartWrite(Data,3);
                      mss=0;
                      LED=~LED;
                      if((adc4-adc1>4)&&(msss1<240)) msss1++;
                      if((adc1-adc4>4)&&(msss1>10)) msss1--;
                      if((adc2-adc1>4)&&(msss2<240)) msss2++;
                      if((adc1-adc2>4)&&(msss2>10)) msss2--;
                      }
                      }
                      }
                      void Time0()interrupt 1
                      {
                      ms++;
                      mss++;
                      if(ms==6)ms=0;
                      switch(ms)
                      {
                      case 0:dj1=1,Delay05ms(),delays(msss1),dj1=0;break;
                      case 1:dj2=1,Delay05ms(),delays(msss2),dj2=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属地:辽宁15楼2018-07-16 19:39
                      回复(1)
                        好长时间不用单片机了,难免有些生疏,把昨天烧单片机的原因说一下,小伙伴们引以为戒。
                        楼主直接把2S锂电插上了,其他电路板上有7805或1117 所以没有问题,
                        2S锂电7.4到8.4V电压, 单片机电源最高5.5v,所以烧了。
                        为啥要插电池是有原因的,舵机支架不科学,线缠在支架上,
                        舵机转多次后连线有短路,导致编程器总供电不足
                        我以为编程器给舵机供电吃力,所以才换电池试一下。
                        我手还摸着单片机,感觉热就赶紧拔了,还是没
                        阻止烧的后果,而后我又连着换了3块,全军覆没。
                        虽然是烧了,但我试验出一个新结果 STC89C52RC 耐压 能力 强于 STC15W408AS
                        昨天当我烧毁全部STC15之后,还不知道问题所在,只能换STC89C52RC试试,
                        那个板子上又1602,插上电池,1602显示不正常了,不显应显的字符了,而且
                        背光超亮,我就意识到电压高了,就知道问题所在了,再换编程器供电,下载程序
                        STC89C52RC并没有烧。还是老东西禁折磨啊。


                        IP属地:辽宁16楼2018-07-16 20:11
                        回复