想要更多项目私wo!!!
一、电路设计
51 单片机双轴自动追光系统主要由 STC89C52RC + 5516 光敏电阻 + ADC0832 + ULN2803 + 步进电机 + LCD1602 显示屏组成。
1.通过子电路板的上、下、左、右四个光敏电阻来感受四个方向的光强,自
动寻找光强最强的方向。四个光敏电阻的分压电路将测得的光强转换为电信号,
再通过两个 ADC0832 转换为数字量,单片机对数据进行比较处理之后进行显示
并输出控制信号通过 ULN2803 芯片驱动步进电机转动。
2.系统共设置有两个模式,自动模式与手动模式,可通过按键切换。
3.自动模式下分为寻光与避光模式,寻光模式下系统会自动寻找光照最强的
地方,避光模式下系统会避开光照强烈的地方,可通过按键切换。
4.手动模式下可通过上下左右四个按键(只在手动模式有效)来控制电机的
转动。
5.LCD1602 液晶屏实时显示 ADC 芯片转换的光敏数值
二、运行结果
三、部分代码
#include <reg52.h>
#include "Delay.h"
#include "ADC0832.h"
#include "LCD1602.h"
#include "StepMotor.h"
#define uchar unsigned char //ºê¶¨Òå
#define uint unsigned int //ºê¶¨Òå
#define Light_Sensty 3 //¸Ð¹âÁéÃô¶È
sbit Key_Pattern = P3^4; //ģʽÇл»
sbit Key_Blk_or_Lgt = P3^5; //×Ô¶¯Ñ°/±Ü¹â
sbit Key_Up = P3^0; //ÉÏ°´¼ü
sbit Key_Down = P3^1; //Ï°´¼ü
sbit Key_Left = P3^2; //×ó°´¼ü
sbit Key_Right = P3^3; //ÓÒ°´¼ü
uchar Up_data,Down_data,Right_data,Left_data;//X,Y·½ÏòµÄ¹âÕÕÊýÖµ
bit flag_Blk_or_Lgt; //ÓÃÓÚÇл»Ñ°ºÚ¡¢Ñ°¹â
bit flag_Auto_or_Hand; //ÓÃÓÚÇл»×Ô¶¯¡¢ÊÖ¶¯
uchar code *DIS1=" Welcome to use ";
uchar code *DIS2=" Wait a jiff ";
uchar code *DIS3=" ";
uchar code table[]={0,1,2,3,4,5,6,7,8,9};//ÏÔʾÊý×ÖÂë±í
/********************************************************************
* Ãû³Æ : void DataDisplay(void)
* ¹¦ÄÜ : »ñÈ¡¹âÕÕÊýÖµµÄ¸ö¡¢Ê®¡¢°ÙλµÄÊý
* ÊäÈë : ÎÞ
* Êä³ö : ÎÞ
***********************************************************************/
typedef struct LIGHT
{
uchar bai1,shi1,ge1; //ÉÏÏÂ
uchar bai2,shi2,ge2; //×óÓÒ
}LIGHT1;
LIGHT1 AD1,AD2;
void DisplayInit(void)
{
L1602_string(1,1,DIS1);//¿ª»úÏÔʾ
L1602_string(2,1,DIS2);
DelayMs(200);
L1602_char(2,13,'.');
DelayMs(200);
L1602_char(2,14,'.');
DelayMs(200);
L1602_char(2,15,'.');
DelayMs(300);
L1602_string(1,1,"U:000 D:000 Auto"); //¿ª»úÏÔʾ
L1602_string(2,1,"L:000 R:000 Sun ");
}
/********************************************************************
* Ãû³Æ : void DataDisplay(void)
* ¹¦ÄÜ : ¹âÕÕÊýÖµÏÔʾ
* ÊäÈë : ÎÞ
* Êä³ö : ÎÞ
***********************************************************************/
void DataDisplay(void)
{
uchar i;
for(i=0;i<5;i++)
{Up_data = Adc0832_Read_1(0);}Delayus(100); //»ñÈ¡ÉÏ·½µçѹֵ
for(i=0;i<5;i++)
{Down_data = Adc0832_Read_1(1);}Delayus(100); //»ñÈ¡Ï·½µçѹֵ
for(i=0;i<5;i++)
{Right_data = Adc0832_Read_2(0);}Delayus(100); //»ñÈ¡ÓÒ·½µçѹֵ
for(i=0;i<5;i++)
{Left_data = Adc0832_Read_2(1);}Delayus(100); //»ñÈ¡×ó·½µçѹֵ
AD1.bai1 = Up_data/100%10; //·ÖÀë°Ùλ
AD1.shi1 = Up_data/10%10; //·ÖÀëʮλ
AD1.ge1 = Up_data%10; //·ÖÀë¸öλ
AD1.bai2 = Down_data/100%10;
AD1.shi2 = Down_data/10%10;
AD1.ge2 = Down_data%10;
AD2.bai1 = Right_data/100%10;
AD2.shi1 = Right_data/10%10;
AD2.ge1 = Right_data%10;
AD2.bai2 = Left_data/100%10;
AD2.shi2 = Left_data/10%10;
AD2.ge2 = Left_data%10;
L1602_char(1,3,table[AD1.bai1]+0X30); //ÏÔʾ°Ùλ
L1602_char(1,4,table[AD1.shi1]+0X30); //ÏÔʾʮλ
L1602_char(1,5,table[AD1.ge1]+0X30); //ÏÔʾ¸öλ
DelayMs(5); //ÑÓʱ5ºÁÃë
L1602_char(1,9,table[AD1.bai2]+0X30);
L1602_char(1,10,table[AD1.shi2]+0X30);
L1602_char(1,11,table[AD1.ge2]+0X30);
DelayMs(5);
L1602_char(2,3,table[AD2.bai1]+0X30);
L1602_char(2,4,table[AD2.shi1]+0X30);
L1602_char(2,5,table[AD2.ge1]+0X30);
DelayMs(5);
L1602_char(2,9,table[AD2.bai2]+0X30);
L1602_char(2,10,table[AD2.shi2]+0X30);
L1602_char(2,11,table[AD2.ge2]+0X30);
DelayMs(5);
if(flag_Auto_or_Hand) //×Ô¶¯Ä£Ê½Ê±ÏÔʾ
{
L1602_string(1,13,"Auto");
if(flag_Blk_or_Lgt)
{
L1602_string(2,13,"Sun ");
}
else
{
L1602_string(2,13,"Dark");
}
}
else //ÊÖ¶¯Ä£Ê½Ê±ÏÔʾ
{
L1602_string(1,13,"Hand");
L1602_string(2,13," ");
}
}