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

}

}

}

五、实验现象

演示视频:

相关推荐
人邮异步社区11 分钟前
推荐几本学习计算机语言的书
java·c语言·c++·python·学习·golang
A-code3 小时前
C/C++ 中 void* 深度解析:从概念到实战
c语言·开发语言·c++·经验分享·嵌入式
编程之路,妙趣横生7 小时前
详解C语言操作符
c语言
Fuchsia7 小时前
Linux软件编程笔记五——进程Ⅰ
linux·c语言·笔记·操作系统·进程
林一百二十八7 小时前
在Ubuntu上学习C语言(一)
c语言·学习·ubuntu
郭子涵本人7 小时前
51单片机(markdown格式阅读)
单片机·嵌入式硬件·51单片机
格里姆肖8 小时前
小米铁蛋电机1代驱动开发
单片机·嵌入式硬件
ZIM学编程8 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
hazy1k8 小时前
51单片机基础-LCD1602液晶显示
stm32·单片机·嵌入式硬件·51单片机·1024程序员节
子枫秋月10 小时前
单链表实现全解析
c语言·数据结构·c++