【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; //远光

}

}

}

五、实验现象

演示视频:

相关推荐
全栈游侠9 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_9 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
毕设源码-郭学长9 小时前
【开题答辩全过程】以 个性化汽车推荐系统为例,包含答辩的问题和答案
汽车
历程里程碑9 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
Godspeed Zhao10 小时前
现代智能汽车中的无线技术72——SatCom(0)
汽车
深圳市九鼎创展科技11 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计11 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
智者知已应修善业11 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
小龙报13 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业13 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件