【51单片机】【protues仿真】基于51单片机汽车智能灯光控制系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、LCD1602液晶显示超声波的距离,光线的强弱
2、按键设定超声波和光敏的下限值,并具有掉电保存功能
3、光敏传感器测光线亮度,低于设置值时自动开启灯光
4、超声波测距离,自动切换远光灯和近光灯
二、使用步骤
基于51单片机的汽车智能灯光控制系统通过光敏检测、超声波测距和模式切换实现自动/手动控制。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、超声波传感器
4、LED灯模块
5、数模传感器模块
6、LCD1602显示模块
四、软件设计
#include <reg52.h>
#include "LCD1602.H"
#include "eeprom52.H"
#include "adc0832.H"
uint time=0;
int S=0; //测量距离
sbit echo=P2^3; //超声波接口定义
sbit trig=P2^4;
bit ir_ok=0; //定时测量标志位
sbit led1=P1^4;
sbit led2=P1^6; //手动自动LED指示灯灯接口定义
sbit LED_1=P2^0;
sbit LED_2=P2^1; //远近光灯接口定义
sbit key1=P3^2; //设置
sbit key2=P3^3; //增加
sbit key3=P3^4; //减小
sbit key4=P3^5; //手动/自动
sbit key5=P3^6; //远光 //近光
sbit key6=P3^7; //手动关灯
bit key1_flag=0;
bit key2_flag=0;
bit key3_flag=0;
bit key4_flag=0;
bit key5_flag=0;
bit key6_flag=0; //按键标志位
uchar sec1=0,sec2=0,ms=0; //sec1、sec2按键长按标志位,ms定时自加变量
uchar light_set=50,S_set=30,state; //光照设置值,距离设置值,设置变量
bit s0; //液晶闪烁效果标志位
bit memory_flag=0; //存储标志位
uchar light=0,ad_count; //光照值,滤波用累加变量
uint ad_dat=0; //ad数据
uchar beam;//0关闭 1近光 2远光
bit A_M=0;//0手动
uchar count; //中断累加变量
long int distance; //测量所得距离
void memory() //存储函数
{
SectorErase(0x2000); //清扇区
byte_write(0x2000,S_set/256);
byte_write(0x2001,S_set%256); //往扇区存设置距离
byte_write(0x2002,light_set); //往扇区存设置光强
}
void read_memory() //读存储函数
{
S_set=byte_read(0x2000)*256+byte_read(0x2001); //将存的数据读出来
light_set=byte_read(0x2002); //
if(S_set>400||light_set>100||S_set==0||light_set==0) //判断数据不正常,重新赋值
{
S_set=30;
light_set=50;
}
}
void trigger() //测量启动函数
{
trig=0;
_nop_(); //空语句,用来占用时间
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=1;
}
void delayt(uint x) //延时函数
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
void init_measuring()
{
trig=1;
echo=1;
count=0;
}
void measuring() //启动测距信号
{
uchar l;
uint h,y;
TR0 = 1;
while(echo==1)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间,单位是微秒
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
S = 3453* distance / 200000;//原始为:(0.34毫米/us)*时间/2//
}
void interrupt_int() //定时器初始化
{
TMOD=0x11; //定时器0,定时器1都用模式1
TH0=0x00;
TL0=0x00; //定时器0赋初值0
ET0=1; //使能定时器0
TR0=0; //先不打开定时器0
TH1=0x3c;
TL1=0xb0; //定时器1赋值50ms
ET1=1;
TR1=1; //打开定时器1
EA=1; //打开总中断
}
void main()
{
interrupt_int(); //调用定时器初始化函数
LCD1602_cls(); //调用1602初始化函数
read_memory(); //调用读存储
init_measuring(); //调用超声波相应端口初始化
while(1)
{
display(); //显示函数
if(ir_ok)
{
ir_ok=0;
trigger(); //触发超声波启动
while(echo==0) //等待回声&&TH0<200
{
;
}
measuring(); //进行距离测量
init_measuring(); //超声波相应端口初始化
}
if(memory_flag) //如果存储标志位是1
{
memory_flag=0; //清0,
memory(); //执行一次存储函数
}
if(A_M) //如果是自动状态
{
led1=0; //自动模式指示灯点亮
led2=1;
police(); //执行自动处理函数
}
else //否则
{
led2=0;
led1=1;
}
AD_dispose();
switch(beam)
{
case 0:LED_1=1;LED_2=1;break; //关闭
case 1:LED_1=1;LED_2=0;break; //近光
case 2:LED_1=0;LED_2=1;break; //远光
}
}
}
五、实验现象
演示视频: