基于51单片机的太阳追光系统设计

news2024/12/25 22:11:09

本实例是基于51单片机的太阳追光系统,主要硬件由51单片机最小系统,四路光敏感应电路,ADC0832转换电路、LED指示灯电路、X轴与Y轴步进电机构成。

设计功能

1.四路光敏感应电路:四路光敏电阻分别感应上、下、左、右四个方向的光强度,并通过AD转换芯片将光强数据传递给单片机。
2.5路按键:分别为手自动切换按键、上、下、左、右按键;按键切换为自动模式,系统便根据四个方向的光强对太阳进行追光;手动模式便可通过按键对四个方向进行任意转动。
3.X、Y轴步进电机:两路步进电机通过ULN2803进行驱动;X轴电机控制系统水平方向转动;Y轴电机控制系统上下方向转动 。
4.LED指示灯:分别为自动、手动状态灯;在相应的控制模式下亮起。5.按键功能:

(1)从左到右:按键1为设置键,按键2为加一键、按键3为减一键、按键4为手动自动切换键,按键5远近光灯切换键,按键6为手动关灯键。
(2)单独一个按键为复位按键。

原理图

在这里插入图片描述
Protues仿真:
在这里插入图片描述

void main()	   //函数功能:主函数
{	  
 
	uchar AD_Up,AD_Down,AD_Left,AD_Right;
	uchar i,j,k;
	uchar Table[4];
	Delay_ms(500);
	UART_Init();	
	
	
	lcd_init(); //lcd相应的初始化
	lcd_show("Welcome to","light tracking!");
	Delay_ms(500);
	
	while(1)
	{
	   
	    if(!ENTER)
		{
			Delay_ms(20);
			while(!ENTER);
			k++;	
		}
		
		if(k%2 == 0)
		{
		Delay_ms(20); //延时去抖动
		if(k%2 == 0) 
		{
		LED1 = 1;
    	LED2 = 0;
		AD_Up = 0;	//上
		AD_Down = 0;//下
		AD_Left = 0;//左
		AD_Right = 0;//右	
		
		lcd_show("Currently in ","manual mode");
		
		//判断手动模式下,哪个按键被按下,并作出相应的旋转
		if(!UP)//上转 
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Up[j];
		            lcd_show("You pressed ","the up button!");
					Delay_ms(5);
				}		
			}
			
			P1=0x00;	
		}
		if(!DOWN)//下转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Down[j];
					lcd_show("You pressed ","the down button!");
					Delay_ms(5);
				}		
			}
			P1=0x00;
		}	
		if(!LEFT)//左转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Left[j];
					lcd_show("You pressed ","the left button!");
					Delay_ms(5);
				}		
			}
			P1=0x00;
		}
		
		if(!RIGHT)//右转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Right[j];
					lcd_show("You pressed ","the right button!");
					Delay_ms(5);
				}		
			}
			P1=0x00;
		}
		}
		}
		if(k%2 == 1)  //处于自动模式下
		{
		Delay_ms(20); //延时去抖动
		if(k%2 == 1)
		{
			LED1 = 0;
			LED2 = 1;
			for(i=0;i<8;i++)
		{
			switch(AD_CHANNEL)
			{
				case 0: PCF8591_ISendByte(PCF8591,0x01);
				AD_Up = PCF8591_IRcvByte(PCF8591);  //ADC0 模数转换1
				break;  				
				case 1: PCF8591_ISendByte(PCF8591,0x02);
				AD_Down = PCF8591_IRcvByte(PCF8591);  //ADC1  模数转换2
				break;  
				
				case 2: PCF8591_ISendByte(PCF8591,0x03);
				AD_Left = PCF8591_IRcvByte(PCF8591);  //ADC2 模数转换3
				break;  
				
				case 3: PCF8591_ISendByte(PCF8591,0x00);
				AD_Right = PCF8591_IRcvByte(PCF8591);  //ADC3  模数转换4
				break; 
			}			
			if(++AD_CHANNEL>3)
			{
					AD_CHANNEL=0;
					Table[0] = AD_Up;
					Table[1] = AD_Down;
					Table[2] = AD_Left;
					Table[3] = AD_Right;
			 }			 
			// Send_Hex(Table,4);
		}
		
		lcd_xy(0,0); 
		lcd_display("1:",AD_Up);
		lcd_display("2:",AD_Down);
		
		lcd_xy(0,1);
		lcd_display("3:",AD_Left);
		lcd_display("4:",AD_Right);
		}			
		if(((AD_Up<AD_Down)&&(AD_Down-AD_Up>10)))//上转 
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Up[j];
					Delay_ms(5);
				}		
			}
			P1=0x00;	
			UP_COUNT++;
		}	
		if(((AD_Up>AD_Down)&&(AD_Up-AD_Down>10)))//下转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Down[j];
					Delay_ms(5);
				}		
			}
			P1=0x00;
			DOWN_COUNT++;
		}
		if(((AD_Left<AD_Right)&&(AD_Right-AD_Left>10)))//左转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Left[j];
					Delay_ms(5);
				}		
			}
			P1=0x00;
			LEFT_COUNT++;
		}
		if(((AD_Left>AD_Right)&&(AD_Left-AD_Right>10)))//右转
		{
			for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Right[j];
					Delay_ms(5);
				}		
			}
			P1=0x00;
			RIGHT_COUNT++;
		}
		if(!UP)    //UP按键充当自动模式下的复位按键
		{
		 Delay_ms(20); //延时去抖动
		 if(!UP)
		 {   
		   while(DOWN_COUNT--)
		   {
		     for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Up[j];
		            lcd_show("Reseting "," ");
					Delay_ms(5);
				}		
			}   
		   }
		   
		   while(UP_COUNT--)
		   {
		     for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Down[j];
		            lcd_show("Reseting "," ");
					Delay_ms(5);
				}		
			}
		    		   
		   }
		   
		    while(LEFT_COUNT--)
		   {
		     for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Right[j];
		            lcd_show("Reseting "," ");
					Delay_ms(5);
				}		
			}
		    		   
		   }
		   
		    while(RIGHT_COUNT--)
		   {
		     for(i=0;i<10;i++)
			{ 
				for(j=0;j<4;j++)
				{
					P1=Motor_Left[j];
		           lcd_show("Reseting "," ");
					Delay_ms(5);
				}		
			}
		    		   
		   }
		   LEFT_COUNT = 0;
		   RIGHT_COUNT = 0;
		   UP_COUNT = 0;
		   DOWN_COUNT = 0;
		 }
		}
		}		
		Delay_ms(100);
		
	}
}

关注公众号-电子应用学习馆,首页回复“太阳能追光”获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两组表单看懂MySQL的多表查询

第一组表单信息 1、查询每个部门的所属员工 mysql> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 d-> LEFT JOIN emp3 e-> ON d.deptno e.dept_id-> GROUP BY d.deptno-> UNION -> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 …

代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

柱状图中最大的矩形 题目链接&#xff1a; 力扣 假设以柱子1&#xff08;指值为1的柱子&#xff09;为基准&#xff0c;柱子1的左侧没有比柱子1矮的元素&#xff0c;所以柱子1可以无限像左边扩展&#xff0c;柱子1的右侧也没有比柱子1矮的元素&#xff0c;所以柱子1可以无限向…

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

如何提升问卷数据的有效性?

问卷调查法是收集数据的宝贵工具&#xff0c;可以为商业、社会科学和医疗保健等众多领域的决策过程提供真实可靠的数据信息。然而&#xff0c;问卷数据的准确性和可靠性是影响最终结论的关键因素&#xff0c;而他们取决于问卷设计和数据收集过程的质量。在本文中&#xff0c;我…

Coggle 30 Days of ML(23年7月)任务三:使用TFIDF提取文本特征

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务三&#xff1a;使用TFIDF提取文本特征 任务三&#xff1a;使用TFIDF提取文本特征 说明&#xff1a;在这个任务中&#xff0c;需要使用Sklearn库中的TFIDF技术来提取文本特征&#xff0c;将文本转化为可供机器学习算法…

数分面试题:赛马问题

问题一&#xff1a; 25匹马&#xff0c;一个赛道&#xff0c;每次可以跑5匹马&#xff0c;在没有计时器的情况下&#xff0c;怎么用最小的比赛次数知道最快的前三名 关键点&#xff1a;通过前面的比赛&#xff0c;排除掉没有悬念的马&#xff08;能确定有3匹马比它快的&#…

Iptables与Firewalld

Iptables防火墙 介绍 iptables和netfilter是一套Linux防火墙工具&#xff0c;共同合作完成系统防护工作。iptables 是一个包过滤防火墙&#xff0c;可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能&#xff0c;iptables是一个…

4.6 x64dbg 内存扫描与查壳实现

LyScript 插件中默认提供了多种内存特征扫描函数&#xff0c;每一种扫描函数用法各不相同&#xff0c;在使用扫描函数时应首先搞清楚不同函数之间的差异&#xff0c;本章内容将分别详细介绍每一种内存扫描函数是如何灵活运用&#xff0c;并实现一种内存查壳脚本&#xff0c;可快…

Linux常用命令——exec命令

在线Linux命令查询工具 exec 调用并执行指定的命令 补充说明 exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中&#xff0c;可以调用其他的命令。如果在当前终端中使用命令&#xff0c;则当指定的命令执行完毕后会立即退出终端。 语法 exec(选项)(参数…

计算机组成原理32位MIPS CPU设计实验(指令译码器电路设计 、时序发生器状态机设计、时序发生器输出函数、硬布线控制器)

实验四 32位MIPS CPU设计实验 这次实验是32位MIPS CPU设计实验&#xff08;单总线CPU-定长指令周期-3级时序)&#xff0c;在头歌当中一共需要我们进行六道题的测试&#xff0c;分别为MIPS指令译码器设计&#xff0c;定长指令周期&#xff08;时序发生FSM设计&#xff0c;时序发…

数据结构05:树与二叉树[C++][哈夫曼树HuffmanTree]

图源&#xff1a;文心一言 考研笔记整理6k字&#xff0c;小白友好、代码可跑&#xff0c;请小伙伴放心食用~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图、画配图~&#x1f9e9;&#x1f9e9; 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》…

一纸文书之MySQL的回忆录

MySQL要点学习&#xff1a;你可以在简历上说熟悉MySQL 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是MySQL&#xff1f;什么是SQL&#xff1f;数据库数据库管理系统&#xff1a;SQL&#xff1a;结构化查询语言三者之间的关系 安装MySQL数据库管理系统MySQL常…

数据增强之裁剪、翻转与旋转

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据增强 Data Augmentation裁剪Croptransforms.CenterCroptransforms.RandomCroptransforms.RandomResizedCroptra…

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块7

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

TortoiseGit 入门指南02:创建和克隆仓库

图标 本节讲解如何使用 TortoiseGit 创建和克隆仓库。但在此之前&#xff0c;我们先来看下 TortoiseGit 软件的一个特色&#xff1a;图标。 TortoiseGit 会给 工作区 中的文件和文件夹叠加图标&#xff08;Icon Overlays&#xff09;&#xff0c;图标反应的是这些文件和文件夹…

跳表很难吗?手把手教你如何跳跃它!

文章目录 Ⅰ. 前言Ⅱ. 跳表&#xff08;skiplist&#xff09;1、什么是跳表2、跳表的发明历程3、跳表的搜索方式 Ⅲ. skiplist的算法性能分析1、理论准备2、性能分析&#xff08;了解即可&#xff0c;主要记结论&#xff09; Ⅳ. skiplist与平衡树、哈希表的比较Ⅴ. skiplist的…

【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解

CZT变换算法的引入 CZT算法的基本原理 注意:这里所要分析的复频谱点数为 M M M,这也是CZT变换之后的点数。

MySQL之DML和DDL

1、显示所有职工的基本信息&#xff1a; 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表。 …

CentOS环境下的MYSQL8安装

MySQL 安装 参考连接&#xff1a;https://www.cnblogs.com/jasonx1an/p/16690866.html 下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 卸载 mariadb 查看 mariadb rpm -qa|grep mariadb卸载 mariadb rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps再…