#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) //如果两侧�
西天取经的熊猫
- 粉丝: 2414
- 资源: 56
最新资源
- 【化工行业】-01-组织架构图.docx
- 【广告行业】-01-组织架构图.docx
- 【环保协会】-01-组织架构图.docx
- 【会展公司】-03-组织架构图.docx
- 【会展公司】-02-组织架构图.docx
- 【建筑工程】-01-项目组织架构图.docx
- 【建筑工程】-02-项目组织架构图.docx
- 【建筑工程】-03-组织架构图.docx
- 【金融行业】-01-组织架构图.docx
- 企业级网络仿真平台(eNSP)的功能特性及应用场景探讨
- 【教育培训】-01-组织架构图.docx
- 【建筑工程】-04-组织架构图.docx
- 【酒店行业】-01-组织架构图.docx
- 【科技行业】-01-组织架构图.docx
- 【科技行业】-02-组织架构图.docx
- 【科技行业】-03-组织架构图.xlsx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈