基于51单片机的简易太阳能追踪系统
基于51单片机的简易太阳能追踪系统Proteus仿真如图所示。
系统主控核心为AT89C51单片机;
动作执行部分为两个0-360度舵机;
4个电位器模拟光敏电阻检测阵列;
模拟电压采集部分使用74HC4051+ADC0804组成多通道模式转换器;
采用蜂鸣器+LED组成声光报警电路;
采用外部EEPROM存储器实现掉电存储数据的功能;
显示部分采用LCD1602显示实时的角度信息和电压信息。
运行仿真后蜂鸣器会响一声,LCD显示器的第一行上会显示出4个通道采集到的电压值;第二行显示出2个舵机的初始角度。
仿真中利用电位器模拟光敏电阻,设定当光线变弱时光敏电阻的输出电压会降低。当对应光敏电阻输出电压低于4.5V时,系统会控制相应方向的舵机进行角度变换,直到该电位器电压恢复后系统停止舵机的角度变换,从而达到追踪阳光的目的。
每一次成功矫正位置后,系统都会将舵机当前的角度值存储到外部的EEPROM中,下一次重启运行时会从EEPROM中读取出该角度,并将舵机设置为该初始角度。
当系统的光敏电阻输出电压有两组以上小于设定值时,系统会通过蜂鸣器和LED发出报警提示。
部分代码如下:
int main(void)
{uchar num[15]={0},n,i;LCD_Init(); //lcd显示初始化 DelayMs(5); //延时5msLCD_Clear(); //清空显示DelayMs(5); //延时5msADCOUTPUT=0xff; //P0口置高电平,准备读数据Switch_1 = 0 ;Switch_2 = 0 ; //设置转换通道0timer0_init(); //定时器初始化error = 0 ;error1 = 0 ; //故障变量清0Init_IIC(); //初始化IICangle = read_add(1)<<8|read_add(0); //读取角度1if(angle<0)angle= 180;if(angle>360)angle=180;angle1 = read_add(3)<<8|read_add(2); //读取角度2if(angle1<0)angle1=180;if(angle1>360)angle1=180;DelayMs(500); //延时500毫秒scnt = 0 ;ADC0804Start(); //启动ADC,进行数据转换BEE_LED = 0 ;Set_DutyCycle_To((angle*D+1)*5); //控制舵机去指定角度Set_DutyCycle_To1((angle1*D+1)*5); //控制舵机去指定角度while(1){ if(scnt<1000) //采样周期计数值{scnt++;}else{scnt = 0 ;}if(scnt==0) //周期开始{switch(range_temp){case 0 : Switch_1 = 0 ; Switch_2 = 0 ; break ; //切换对应通道case 1 : Switch_1 = 1 ; Switch_2 = 0 ; break ;case 2 : Switch_1 = 0 ; Switch_2 = 1 ; break ;case 3 : Switch_1 = 1 ; Switch_2 = 1 ; break ;} }else if(scnt==200){ADC0804Start(); //启动ADC,进行数据转换}else if(scnt==400){_nop_();_nop_();ADRD=1; //读数据控制端拉高,准备读取数据_nop_();ADRD=0; //读数据控制端拉低,读取数据_nop_();n=ADCOUTPUT; //读取转换数据}else if(scnt==800){switch(range_temp) //读取对应通道转换结果。并计算实际电压{case 0 : v1 = BD*n ; range_temp = 1 ; break ;case 1 : v2 = BD*n ; range_temp = 2 ; break ;case 2 : v3 = BD*n ; range_temp = 3 ; break ;case 3 : v4 = BD*n ; range_temp = 0 ; break ;}}else if(scnt==900) //对电压进行显示{num[0]=v1/100%10; num[1]=v1/10%10;num[2]=v2/100%10; num[3]=v2/10%10; num[4]=v3/100%10; num[5]=v3/10%10; num[6]=v4/100%10; num[7]=v4/10%10; sprintf(temp,"%d.%d %d.%d %d.%d %d.%d",(int)num[0],(int)num[1],(int)num[2],(int)num[3],(int)num[4],(int)num[5],(int)num[6],(int)num[7]);LCD_Write_String(0,0,temp); //刷新显示数据ADRD=1; //读取数据完毕if(buff<10)buff ++ ;}else if(scnt==950&&buff>8) {if(v1<450&&v2>450) //如果1一侧光线弱{if(angle<360) //角度增大{angle = angle+1 ;}Set_DutyCycle_To((angle*D+1)*5); error = 0 ;ast =0 ;}else if(v1>450&&v2<450) //另外一侧弱。{if(angle>0) //角度减小{angle = angle-1 ;}Set_DutyCycle_To((angle*D+1)*5); error = 0 ;ast =0 ;}else if(v1<450&&v2<450) //如果两侧光线都弱,进行报警,另外一路舵机控制原理类似{error = 1 ;}else {if(ast==0){ast =1 ;write_add(0x00,angle); //将报警阈值写入到EEPROM中,其中低位写入到地址0,高位写入到地址1DelayMs(5);write_add(0x01,angle>>8);DelayMs(5);}}if(v3<450&&v4>450){if(angle1<360){angle1 = angle1+1 ;}Set_DutyCycle_To1((angle1*D+1)*5);error1 = 0 ; ast1 =0 ; }else if(v3>450&&v4<450){if(angle1>0){angle1 = angle1-1 ;}Set_DutyCycle_To1((angle1*D+1)*5); error1 = 0 ; ast1 =0 ; }else if(v3<450&&v4<450){error1 = 1 ;}else {if(ast1==0){ast1 =1 ;write_add(0x02,angle1); //将报警阈值写入到EEPROM中,其中低位写入到地址0,高位写入到地址1DelayMs(5);write_add(0x03,angle1>>8);DelayMs(5);}}num[0]=angle/100%10; num[1]=angle/10%10;num[2]=angle%10;num[3]=angle1/100%10; num[4]=angle1/10%10;num[5]=angle1%10;sprintf(temp,"deg1:%d%d%ddeg2:%d%d%d",(int)num[0],(int)num[1],(int)num[2],(int)num[3],(int)num[4],(int)num[5]);LCD_Write_String(0,1,temp); //刷新显示数据}if(error==1||error1==1){BEE_LED = 1 ;}else{BEE_LED = 0 ;}}}
基于51单片机的简易太阳能跟踪系统-单片机文档类资源-CSDN文库https://download.csdn.net/download/xitianqu/86977414
基于51单片机的简易太阳能追踪系统相关推荐
- 基于51单片机的太阳能追光系统 基于51单片机的锂电池太阳能充电器
基于51单片机的太阳能追光系统 基于51单片机的锂电池太阳能充电器 基于51单片机的锂电池追光充电系统 具体功能:根据太阳光照方向改变光板朝向,利用太阳能给锂离子电池充电,实时显示上下左右四个方向不同 ...
- 基于51单片机的简易游戏机
基于51单片机的简易游戏机 目录 基于51单片机的简易游戏机 一.绪论 二.设计方案 三.系统原理框图及模块的作用 四.硬件设计及说明 五.实际的程序流程图,写清楚程序模块的功能 六.系统使用说明 七 ...
- c语言51单片机计算器,新基于51单片机的简易计算器
<新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...
- 基于51单片机的简易抢答器设计
基于51单片机的简易抢答器 具体功能: 1.主持人按下抢答开始按键,抢答者才可以开始抢答,数码管抢答倒计时20S. 2.抢答者按下按键,数码管显示抢答者的编号. 3.可以通过按键修改倒计时时间. 部分 ...
- 基于51单片机的简易电子计算器——有温度显示和万年历等额外功能
基于51单片机的简易电子计算器--有温度显示和万年历等额外功能 设计实际所实现的功能 模式一可显示日期.时钟.温度,模式二可进行计算器的计算,且显示日期温度模式和计算器模式可随意切换,模式三可以滚动显 ...
- 【039】基于51单片机的简易门铃Proteus仿真设计
一.压缩包资料内容 (1).基于51单片机的简易门铃proteus仿真设计一份: (2).基于51单片机的简易门铃proteus仿真设计keli源代码一份: (3).基于51单片机的简易门铃prote ...
- 【006】基于51单片机的简易电子计算器Proteus仿真设计
一.压缩包资料内容(私信获取) (1).基于51单片机的简易电子计算器proteus仿真设计一份: (2).基于51单片机的简易电子计算器proteus仿真设计keli源代码一份: (3).基于51单 ...
- 基于51单片机的自动浇花系统
目录 一.项目需求 二.仿真 三.程序 四.资料清单 资料下载地址:基于51单片机的自动浇花系统 一.项目需求 1.自动检测土壤湿度.温度.光照强度: 2.土壤湿度过低驱动水泵进行浇花: 3.LCD1 ...
- 【C51】基于51单片机的简易频率计(附代码、无需外设、小白简单易上手)
基于51单片机的简易频率计(无需外设.小白简单易上手) 代码较为简单,大概思路是通过定时器单位时间内外部中断上升沿触发的次数来计算实际频率. /基于51单片机的简易频率计#include<r ...
最新文章
- Ubuntu11.10下载android4.0.1源码
- Javaweb中利用kaptcha生成验证码
- EGOImageView 解析
- 未能加载文件或程序集rsy3_abp vnext2.0之核心组件模块加载系统源码解析
- Exchange 2010升级到Exchange 2016汇总
- 2021年泰迪杯数据挖掘赛B题数据——岩石图像的智能分类
- c语言 遍历搜索文件夹(获取文件夹中所有内容)
- 提高网吧上座率,TG-NET网吧光纤万兆方案
- LR之识别图片验证码
- 解决笔记本装linux后触摸板无法用的问题
- Android crackme签名漏洞,CrackMe160之第一个,分析算法并写出注册机!
- 你觉得程序员适合干一辈子吗?
- Hadoop自动化安装脚本
- java中try catch的中断规则
- 互联网医疗泡沫破灭后 或将迎来持久良性发展
- 蓝桥杯之算法模板题 Python版
- android 版edge标签页,Edge Beta 版新功能:同步标签页和历史记录(附.APK)
- 物联卡智能扫描设备可以保障产品安全?
- 关于病毒防疫必须知道的英文
- http://www.cnitblog.com/ffan/archive/2007/07/20/30291.html