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


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


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


      回复
      来自Android客户端3楼2018-07-15 11:37
        叫向日葵吧,好听一点


        收起回复
        来自Android客户端4楼2018-07-15 13:23
          先找找我们需要的基本资料


          回复
          5楼2018-07-15 13:48


            电路草图,以后没准会改


            回复
            6楼2018-07-15 15:05


              正面布局设计


              回复
              9楼2018-07-15 16:13

                背面设计


                回复
                10楼2018-07-15 16:14
                  焊接完成正面图



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



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


                      回复
                      13楼2018-07-15 17:07
                        /*---------------------------------------------------------------------*/
                        /* --- STC MCU Limited ------------------------------------------------*/
                        /* --- STC15F4K60S4 系列 AD转换查询方式举例----------------------------*/
                        /* --- Mobile: (86)13922805190 ----------------------------------------*/
                        /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
                        /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
                        /* --- Web: http://www.STCMCU.com --------------------------------------------*/
                        /* --- Web: http://www.GXWMCU.com --------------------------------------------*/
                        /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
                        /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */
                        /*---------------------------------------------------------------------*/
                        //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
                        //若无特别说明,工作频率一般为11.0592MHz

                        #include "reg51.h"
                        #include "intrins.h"
                        #define FOSC 11059200L
                        #define BAUD 9600
                        typedef unsigned char BYTE;
                        typedef unsigned int WORD;
                        typedef unsigned int u16; //对数据类型进行声明定义
                        typedef unsigned char u8;
                        u16 adcs,adcx,adcz,adcy;
                        sfr P5 = 0xC8; //xxxx,1111 端口5
                        sbit led1 = P1^4;
                        sbit led2 = P1^5;
                        sbit led3 = P5^4;
                        sbit led4 = P5^5;
                        #define URMD 0 //0:使用定时器2作为波特率发生器
                        //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
                        //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
                        sfr T2H = 0xd6; //定时器2高8位
                        sfr T2L = 0xd7; //定时器2低8位
                        sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
                        sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
                        sfr P0M1 = 0x93;
                        sfr P0M0 = 0x94;
                        sfr P2M1 = 0x95;
                        sfr P2M0 = 0x96;
                        sfr P3M1 = 0xB1;
                        sfr P3M0 = 0xB2;
                        sfr P4M1 = 0xB3;
                        sfr P4M0 = 0xB4;
                        sfr P5M1 = 0xC9;
                        sfr P5M0 = 0xCA;
                        sfr P6M1 = 0xCB;
                        sfr P6M0 = 0xCC;
                        sfr P7M1 = 0xE1;
                        sfr P7M0 = 0xE2;
                        sfr AUXR = 0x8e; //辅助寄存器
                        sfr ADC_CONTR = 0xBC; //ADC控制寄存器
                        sfr ADC_RES = 0xBD; //ADC高8位结果
                        sfr ADC_LOW2 = 0xBE; //ADC低2位结果
                        sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
                        #define ADC_POWER 0x80 //ADC电源控制位
                        #define ADC_FLAG 0x10 //ADC完成标志
                        #define ADC_START 0x08 //ADC起始控制位
                        #define ADC_SPEEDLL 0x00 //540个时钟
                        #define ADC_SPEEDL 0x20 //360个时钟
                        #define ADC_SPEEDH 0x40 //180个时钟
                        #define ADC_SPEEDHH 0x60 //90个时钟
                        void InitUart();
                        void InitADC();
                        void SendData(BYTE dat);
                        BYTE GetADCResult(BYTE ch);
                        void Delay(WORD n);
                        void ShowResult(BYTE ch);
                        void ys();
                        void main()
                        {
                        P0M0 = 0x00;
                        P0M1 = 0x00;
                        P1M0 = 0x00;
                        P1M1 = 0x00;
                        P2M0 = 0x00;
                        P2M1 = 0x00;
                        P3M0 = 0x00;
                        P3M1 = 0x00;
                        P4M0 = 0x00;
                        P4M1 = 0x00;
                        P5M0 = 0x00;
                        P5M1 = 0x00;
                        P6M0 = 0x00;
                        P6M1 = 0x00;
                        P7M0 = 0x00;
                        P7M1 = 0x00;
                        InitUart(); //初始化串口
                        InitADC(); //初始化ADC
                        led1=0;
                        led2=0;
                        led3=0;
                        led4=0;
                        while (1)
                        {
                        ShowResult(0); //显示通道0
                        ShowResult(1); //显示通道1
                        ShowResult(2); //显示通道2
                        ShowResult(3); //显示通道3
                        // ShowResult(4); //显示通道4
                        // ShowResult(5); //显示通道5
                        // ShowResult(6); //显示通道6
                        // ShowResult(7); //显示通道7
                        adcs=GetADCResult(0);
                        adcz=GetADCResult(1);
                        adcx=GetADCResult(2);
                        adcy=GetADCResult(3);
                        ys();
                        Delay(100);

                        }
                        }
                        void ys()
                        { led1=led2=led3=led4=0;
                        if(adcs-adcx>4)
                        if(adcs>adcx)
                        {
                        led1=1;led2=0;
                        }
                        if(adcx-adcs>4)
                        if(adcx>adcs)
                        {
                        led2=1;led1=0;
                        }

                        if(adcz-adcy>4)
                        if(adcz>adcy)
                        {
                        led3=1;led4=0;
                        }
                        if(adcy-adcz>4)
                        if(adcy>adcz)
                        {
                        led4=1;led3=0;
                        }
                        }
                        /*----------------------------
                        发送ADC结果到PC
                        ----------------------------*/
                        void ShowResult(BYTE ch)
                        {
                        SendData(ch); //显示通道号
                        SendData(GetADCResult(ch)); //显示ADC高8位结果
                        //SendData(0xAA);
                        //SendData(0x55);

                        // SendData(ADC_LOW2); //显示低2位结果
                        }
                        /*----------------------------
                        读取ADC结果
                        ----------------------------*/
                        BYTE GetADCResult(BYTE ch)
                        {
                        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
                        _nop_(); //等待4个NOP
                        _nop_();
                        _nop_();
                        _nop_();
                        while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
                        ADC_CONTR &= ~ADC_FLAG; //Close ADC
                        return ADC_RES; //返回ADC结果
                        }
                        /*----------------------------
                        初始化串口
                        ----------------------------*/
                        void InitUart()
                        {
                        SCON = 0x5a; //设置串口为8位可变波特率
                        #if URMD == 0
                        T2L = 0xE0; //设置波特率重装值
                        T2H = 0xFE; //115200 bps(65536-18432000/4/115200) 波特率为9600
                        AUXR = 0x14; //T2为1T模式, 并启动定时器2
                        AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
                        #elif URMD == 1
                        AUXR = 0x40; //定时器1为1T模式
                        TMOD = 0x00; //定时器1为模式0(16位自动重载)
                        TL1 = 0xd8; //设置波特率重装值
                        TH1 = 0xff; //115200 bps(65536-18432000/4/115200)
                        TR1 = 1; //定时器1开始启动
                        #else
                        TMOD = 0x20; //设置定时器1为8位自动重装载模式
                        AUXR = 0x40; //定时器1为1T模式
                        TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200)
                        TR1 = 1;
                        #endif
                        }
                        /*----------------------------
                        初始化ADC
                        ----------------------------*/
                        void InitADC()
                        {
                        P1ASF = 0x0f; //设置P1口为AD口 P1.0-1.3为AD
                        ADC_RES = 0; //清除结果寄存器
                        ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
                        Delay(2); //ADC上电并延时
                        }
                        /*----------------------------
                        发送串口数据
                        ----------------------------*/
                        void SendData(BYTE dat)
                        {
                        while (!TI); //等待前一个数据发送完成
                        TI = 0; //清除发送标志
                        SBUF = dat; //发送当前数据
                        //while (!TI);
                        //TI=0;
                        //SBUF=0x0D;
                        // TI=0;
                        // while (!TI);
                        // SBUF=0x0A;
                        }
                        /*----------------------------
                        软件延时
                        ----------------------------*/
                        void Delay(WORD n)
                        {
                        WORD x;
                        while (n--)
                        {
                        x = 5000;
                        while (x--);
                        }
                        }
                        我改的,舵机程序还没有,好复杂,


                        收起回复
                        14楼2018-07-16 12:16
                          //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;
                          }
                          }


                          回复(1)
                          15楼2018-07-16 19:39
                            好长时间不用单片机了,难免有些生疏,把昨天烧单片机的原因说一下,小伙伴们引以为戒。
                            楼主直接把2S锂电插上了,其他电路板上有7805或1117 所以没有问题,
                            2S锂电7.4到8.4V电压, 单片机电源最高5.5v,所以烧了。
                            为啥要插电池是有原因的,舵机支架不科学,线缠在支架上,
                            舵机转多次后连线有短路,导致编程器总供电不足
                            我以为编程器给舵机供电吃力,所以才换电池试一下。
                            我手还摸着单片机,感觉热就赶紧拔了,还是没
                            阻止烧的后果,而后我又连着换了3块,全军覆没。


                            虽然是烧了,但我试验出一个新结果 STC89C52RC 耐压 能力 强于 STC15W408AS
                            昨天当我烧毁全部STC15之后,还不知道问题所在,只能换STC89C52RC试试,
                            那个板子上又1602,插上电池,1602显示不正常了,不显应显的字符了,而且
                            背光超亮,我就意识到电压高了,就知道问题所在了,再换编程器供电,下载程序
                            STC89C52RC并没有烧。还是老东西禁折磨啊。


                            回复
                            16楼2018-07-16 20:11