找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5527|回复: 5
收起左侧

51单片机双轴追光程序Proteus仿真原理图(太阳能充电)

  [复制链接]
ID:856585 发表于 2021-6-17 18:31 | 显示全部楼层 |阅读模式
本来想整个双轴的,但是整出来太丑了,所以换成单轴了,我把他分为两个。一个双轴的,一个oled屏幕显示光照强度,单轴的
我自己加了一个充放电模块,配了一个太阳能板,和12864电池
同时也有pcb图

制作出来的实物图如下:

实物单轴

实物单轴


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

proteus仿真图

proteus仿真图
51hei.gif
单片机源程序如下:
#include <reg52.h>
#include <stdio.h>
#include "PCF8591.H"

#define uchar unsigned char
#define uint  unsigned int

#define  PCF8591 0x90    //PCF8591 地址

sbit ENTER = P3^3;
sbit UP = P3^4;
sbit DOWN = P3^5;
sbit LEFT = P3^6;
sbit RIGHT = P3^7;

sbit LED1 = P1^2;
sbit LED2 = P1^3;
uchar Motor_Up[4]={0x08,0x04,0x02,0x01};
uchar Motor_Down[4]={0x01,0x02,0x04,0x08};


//uchar Motor_Left[4]={0x10,0x20,0x40,0x80};
//uchar Motor_Right[4]={0x80,0x40,0x20,0x10};

unsigned char AD_CHANNEL;
//延时函数
void Delay_ms(uint jj)
{
    uint ii;
    while(jj--)
        for(ii=0;ii<125;ii++);
}
void UART_Init(void)
{
     TMOD = 0x20;   //定时器模式选择
     PCON = 0x00;
     SCON = 0x50;            
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;        //启动定时器1
       ES = 1;        //开串口中断
       EA = 1;        //开总中断        
}
/********************************************************************
* 名称   : PSend_Hex()
* 功能   : 发送字符串函数,可控制发送长度
* 变量   : 无
* 返回值 : 无
********************************************************************/
void Send_Hex(unsigned char *p,unsigned char num)
{
       while(num--)   //剩余发送的字符数
    {
        SBUF = *p; //将要发送的数据赋给串口缓冲寄存器
            while(!TI);//等待发送结束
            TI = 0;    //软件清零
            p++;       //指针加一
    }   
}
void main()       //函数功能:主函数
{      

    uchar AD_Up,AD_Down,AD_Left,AD_Right;
    uchar i,j,k;
    uchar Table[4];
    Delay_ms(2000);
    UART_Init();   
    while(1)
    {
        if(!ENTER)
        {
            Delay_ms(20);
            while(!ENTER);
            k++;   
        }
        if(k == 5)
        {
        LED1 = 1;
        LED2 = 0;
        for(i=0;i<8;i++)
        {
            switch(AD_CHANNEL)
            {
                case 0: PCF8591_ISendByte(PCF8591,0x41);
                AD_Up=PCF8591_IRcvByte(PCF8591)*2;  //ADC0 模数转换1
                break;  
               
                case 1: PCF8591_ISendByte(PCF8591,0x42);
                AD_Down=PCF8591_IRcvByte(PCF8591)*2;  //ADC1  模数转换2
                break;  
                case 2: PCF8591_ISendByte(PCF8591,0x43);
                AD_Left=PCF8591_IRcvByte(PCF8591)*2;  //ADC2 模数转换3
                break;  
               
                case 3: PCF8591_ISendByte(PCF8591,0x40);
                AD_Right=PCF8591_IRcvByte(PCF8591)*2;  //ADC3  模数转换4
                break;
            }

            Send_Hex(Table,4);
            if(++AD_CHANNEL>3)
            {
             AD_CHANNEL=0;
             Table[0] = AD_Up;
            Table[1] = AD_Down;
            Table[2] = AD_Left;
            Table[3] = AD_Right;
             }
        }
        }
        if(k%2 == 1)
        {
            LED1 = 0;
            LED2 = 1;
            AD_Up = 0;    //上
            AD_Down = 0;//下
            AD_Left = 0;//左
            AD_Right = 0;//右   
        }        
        ///////////////////////////
      
        if(((AD_Up<AD_Down)&&(AD_Down-AD_Up>10))||(!UP))//上转
        {
            for(i=0;i<10;i++)
            {
                for(j=0;j<4;j++)
                {
                    P2=Motor_Up[j];
                    Delay_ms(10);
                }        
            }   
        }
        //////////////////////////////////////
        if(((AD_Up>AD_Down)&&(AD_Up-AD_Down>10))||(!DOWN))//下转
        {
            for(i=0;i<10;i++)
            {
                for(j=0;j<4;j++)
                {
                    P2=Motor_Down[j];
                    Delay_ms(10);
                }        
            }
        }
        /////////////////////////////
//        if(((AD_Left<AD_Right)&&(AD_Right-AD_Left>10))||(!LEFT))//左转
//        {
//            for(i=0;i<10;i++)
//            {
//                for(j=0;j<4;j++)
//                {
//                    P2=Motor_Left[j];
//                    Delay_ms(10);
//                }        
//            }
//        
//        }
//        //////////////////////////////////////
//        if(((AD_Left>AD_Right)&&(AD_Left-AD_Right>10))||(!RIGHT))//右转
//        {
//            for(i=0;i<10;i++)
//            {
//                for(j=0;j<4;j++)
//                {
//                    P2=Motor_Right[j];
//                    Delay_ms(10);
//                }        
//            }
//        }
        ////////////////////////////////////
        Delay_ms(100);//延时,可适当修改
    }
}
全部资料51hei下载地址:
仿真: 04 Protues 仿真工程.rar (199.13 KB, 下载次数: 170)

评分

参与人数 2黑币 +92 收起 理由
ag26259 + 12 赞一个!
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:582255 发表于 2021-10-24 21:51 | 显示全部楼层
请问一下,你这四个光敏电阻能分辨出光电板子的角度吗?是不是用个手电筒模拟照射四个光敏电阻来模拟?
回复

使用道具 举报

ID:91165 发表于 2021-10-25 11:49 | 显示全部楼层
俯仰角一年也不用调整几次吧
回复

使用道具 举报

ID:1019920 发表于 2022-4-20 00:34 | 显示全部楼层
这个对我很有帮助
回复

使用道具 举报

ID:685250 发表于 2023-7-11 16:01 | 显示全部楼层
牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛牛
回复

使用道具 举报

ID:433219 发表于 2024-3-13 14:54 | 显示全部楼层
当 模型 玩,还是好玩的。。。商品化的成本路就很长了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表