#include<reg52.h>
#include<stdio.h>
#include"intrins.h"
#include"IIC.h" //包含IIC总线头文件
#define uchar unsigned char
#define uint unsigned int
//液晶控制部分
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P1
//舵机角度标定值
#define D 0.02492
/*定义LCD引脚*/
sbit RS = P2^0; //定义端口
sbit RW = P2^2;
sbit EN = P2^1;
sbit Switch_1 = P2^3 ;
sbit Switch_2 = P2^4 ;
uchar temp[20],flag=1;
/*定义ADC0804端口引脚*/
sbit ADRD=P3^7 ;
sbit ADWR=P3^6 ;
#define ADCOUTPUT P0
uchar range_temp = 0 ;
//光敏电阻电压转换标定值
#define BD 1.964
//4通道光敏电阻电压值
uint v1,v2,v3,v4 ;
uint scnt = 0 ;
bit ast=0,ast1=0;
uchar buff = 0 ;
//舵机驱动部分变量
#define Max_Size = 54 ;
#define PWM_Period (0xB7FE) //舵机驱动周期值
bit error = 0,error1 = 0 ; //故障标志位
sbit BEE_LED = P2^5 ; //声光报警控制端口
unsigned int ON_Period; //舵机1开通周期
unsigned int OFF_Period; //舵机1关闭周期
unsigned int angle = 180; //舵机1角度
sbit SERVO_PIN = P3^4 ; //舵机1控制端口
unsigned int ON_Period1; //舵机2开通周期
unsigned int OFF_Period1; //舵机2关闭周期
unsigned int angle1; //
sbit SERVO_PIN1 = P3^5 ; //舵机2控制端口
//函数声明
void ADC0804Start();
void ADC0804Start();
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
bit LCD_Check_Busy(void) ;
void LCD_Write_Com(unsigned char com) ;
void LCD_Write_Data(unsigned char Data) ;
void LCD_Clear(void) ;
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
void LCD_Init(void) ;
/*******************************************************************************
* 函数名 : timer0_init
* 函数功能 : 定时器初始化函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void timer0_init(void)
{
TMOD = 0x11; //设置定时器模式
TH0 = (PWM_Period>>8); //设置定时器0计数值
TL0 = PWM_Period & 0xFF;
TR0 = 1; //开定时器0
ET0 = 1; //开定时器0中断
TH1 = (PWM_Period>>8); //设置定时器1计数值
TL1 = PWM_Period & 0xFF;
TR1 = 1; //开定时器1
ET1 = 1; //开定时器1中断
EA = 1 ; //开总中断
}
/*******************************************************************************
* 函数名 : timer0_isp()
* 函数功能 : 定时器0中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void timer0_isp() interrupt 1
{
SERVO_PIN = !SERVO_PIN; //舵机控制端口状态取反
if (SERVO_PIN) //根据端口状态修改高低电平时间
{
TH0 = (ON_Period>>8);
TL0 = ON_Period;
}else
{
TH0 = (OFF_Period>>8);
TL0 = OFF_Period;
}
}
/*******************************************************************************
* 函数名 : timer1_isp()
* 函数功能 : 定时器1中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void timer1_isp() interrupt 3
{
SERVO_PIN1 = !SERVO_PIN1; //舵机控制端口状态取反
if (SERVO_PIN1) //根据端口状态修改高低电平时间
{
TH1 = (ON_Period1>>8);
TL1 = ON_Period1;
}else
{
TH1 = (OFF_Period1>>8);
TL1 = OFF_Period1;
}
}
/*******************************************************************************
* 函数名 : Set_DutyCycle_To()
* 函数功能 : 角度转换为占空比函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Set_DutyCycle_To(float duty_cycle)
{
float period = 65535 - PWM_Period;
ON_Period = ((period/100.0) * duty_cycle);
OFF_Period = (period - ON_Period);
ON_Period = 65535 - ON_Period;
OFF_Period = 65535 - OFF_Period;
}
/*******************************************************************************
* 函数名 : Set_DutyCycle_To1()
* 函数功能 : 角度转换为占空比函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Set_DutyCycle_To1(float duty_cycle)
{
float period = 65535 - PWM_Period;
ON_Period1 = ((period/100.0) * duty_cycle);
OFF_Period1 = (period - ON_Period1);
ON_Period1 = 65535 - ON_Period1;
OFF_Period1 = 65535 - OFF_Period1;
}
int main(void)
{
uchar num[15]={0},n,i;
LCD_Init(); //lcd显示初始化
DelayMs(5); //延时5ms
LCD_Clear(); //清空显示
DelayMs(5); //延时5ms
ADCOUTPUT=0xff; //P0口置高电平,准备读数据
Switch_1 = 0 ;
Switch_2 = 0 ; //设置转换通道0
timer0_init(); //定时器初始化
error = 0 ;
error1 = 0 ; //故障变量清0
Init_IIC(); //初始化IIC
angle = read_add(1)<<8|read_add(0); //读取角度1
if(angle<0)
angle= 180;
if(angle>360)
angle=180;
angle1 = read_add(3)<<8|read_add(2); //读取角度2
if(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) //如果两侧�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于51单片机的简易太阳能追踪系统Proteus仿真如图所示。 系统主控核心为AT89C51单片机; 动作执行部分为两个0-360度舵机; 4个电位器模拟光敏电阻检测阵列; 模拟电压采集部分使用74HC4051+ADC0804组成多通道模式转换器; 采用蜂鸣器+LED组成声光报警电路; 采用外部EEPROM存储器实现掉电存储数据的功能; 显示部分采用LCD1602显示实时的角度信息和电压信息。
资源推荐
资源详情
资源评论
收起资源包目录
简易太阳能跟踪系统.zip (25个子文件)
简易太阳能跟踪系统
程序
adc0804.h 201B
main.OBJ 31KB
delay.c 738B
太阳能追踪系统.build_log.htm 1KB
delay.LST 2KB
1602.OBJ 7KB
1602.h 769B
太阳能追踪系统.M51 35KB
main.c 14KB
太阳能追踪系统.lnp 35B
IIC.h 2KB
太阳能追踪系统 28KB
adc0804.c 160B
main.LST 23KB
太阳能跟踪系统.uvgui.Administrator 88KB
太阳能跟踪系统.uvproj 14KB
adc0804.OBJ 1KB
delay.h 654B
adc0804.LST 1KB
1602.c 3KB
delay.OBJ 1KB
1602.LST 6KB
太阳能追踪系统.hex 15KB
太阳能跟踪系统.uvopt 5KB
仿真
简易太阳能跟踪系统.DSN 144KB
共 25 条
- 1
资源评论
- 诗yie2023-06-19#完美解决问题 #运行顺畅 可以正常使用,没白花钱
西天取经的熊猫
- 粉丝: 2104
- 资源: 56
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JAVA基于springBoot智慧停车收费管理系统源码带使用文档数据库 MySQL源码类型 WebForm
- 2018 国赛网络搭建与应用正式赛卷及评分标准.tar.gz
- Python asyncio 的 redis 客户端(支持 redis 服务器、sentinel 和 cluster).zip
- 遥感滑坡检测数据集VOC+YOLO格式3588张1类别.zip
- 正点原子开发板RV1126 rtsp推流demo实现视频和音频同步推流,并且屏幕显示
- 工控机端VS2019下C++基于NCNN部署Yolov5+使用说明.zip
- PHP 中的 Redis 分布式锁.zip
- java1.8+kafka2.13版本汇总
- C#ASP.NET服装研发计划管理系统源码数据库 SQL2008源码类型 WebForm
- nestjs redis 模块.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功