• 基于51单片机汽车智能灯光控制系统设计


    基于51单片机汽车智能灯光控制系统仿真设计

    (protues仿真+程序+原理图+PCB+设计说明书)

    仿真图proteus 7.8

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:C0049

    硬件构成:
    51单片机
    LCD1602液晶
    光敏电阻
    超声波
    ADC0832
    LED灯

    功能介绍

    1.按键说明:从左边第一个起,减键、加键、设置键。单独一个控制为复位按键。

    2.LCD1602液晶第一行显示超声波的距离,第二行显示光线的强弱。

    3.可以设定超声波和光敏的下限值,并具有掉电保存功能,数据保存在STC单片机的内部。

    4.用光敏传感器测光线亮度,低于设置值时自动开启灯光。

    5.用超声波测距离,低于设置值时自动将远光灯变成近光灯,大于设置值时又会自动变换成远光。

    硬件设计

    根据本次设计的要求,设计出一款基于51单片机的自动切换远近光灯的设计。所以本次设计硬件部分,中央处理器采用了STC89C52RC单片机,另外使用两个灯珠代表远近光灯,感光部分采用了光敏电阻,因为光敏电阻输出的是电压模拟信号,单片机不能直接处理模拟信号,所以经过ADC0832进行转化成数字信号,还有显示部分采用了LCD1602液晶,还增加按键部分电路,可以选择手自动切换远近光灯,最后还是用了超声模块进行检测距离。

    img

    imgimg

    仿真图

    imgimgimg

    原理图

    img

    源程序:

    img

    显示函数

    void display()	//显示函数
     {
       if(state==0)	   //如果是非设置状态
       {
    	   LCD1602_write(0,0x80); //第一行
    	   LCD1602_writebyte("distance:"); //显示距离
    	   if(S>99) LCD1602_write(1,0x30+S/100%10);
    	   else LCD1602_writebyte(" ");
    	   if(S>9) LCD1602_write(1,0x30+S/10%10);
    	   else LCD1602_writebyte(" ");
    	   LCD1602_write(1,0x30+S%10);
    	   LCD1602_writebyte("cm   ");
    	
    	   LCD1602_write(0,0xC0);		//第二行
    	   LCD1602_writebyte("light:");	 //显示光照强度
    	   if(light>99) LCD1602_write(1,0x30+light/100%10);
    	   else LCD1602_writebyte(" ");
    	   if(light>9) LCD1602_write(1,0x30+light/10%10);
    	   else LCD1602_writebyte(" ");
    	   LCD1602_write(1,0x30+light%10);
    	   LCD1602_writebyte("%        ");
       }
       else	  //设置状态
       {
       	   LCD1602_write(0,0x80);  //第一行
    	   LCD1602_writebyte("dis_set:");  //设置距离
    	   if(state==1&&s0)	LCD1602_writebyte("   ");	//闪烁效果
    	   else
    	   {
    		   if(S_set>99) LCD1602_write(1,0x30+S_set/100%10);
    		   else LCD1602_writebyte(" ");
    		   if(S_set>9) LCD1602_write(1,0x30+S_set/10%10);
    		   else LCD1602_writebyte(" ");
    		   LCD1602_write(1,0x30+S_set%10);
    	   }
    	   LCD1602_writebyte("cm   ");
    	
    	   LCD1602_write(0,0xC0);	
    	   LCD1602_writebyte("lig_set:"); //设置光照
    	   if(state==2&&s0)	LCD1602_writebyte("   ");
    	   else
    	   {
    		   if(light_set>99) LCD1602_write(1,0x30+light_set/100%10);
    		   else LCD1602_writebyte(" ");
    		   if(light_set>9) LCD1602_write(1,0x30+light_set/10%10);
    		   else LCD1602_writebyte(" ");
    		   LCD1602_write(1,0x30+light_set%10);
    	   }
    	   LCD1602_writebyte("%        ");
       }
     }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    光照处理

    void AD_dispose()	 //光照处理
    {
    	if(ad_count<10)		//读十次光照数据,取平均值,起到滤波的作用
    	{
    		ad_dat+=A_D(1);
    		ad_count++;
    	}
    	else
    	{
    	   light=ad_dat/10;
    	   light=(light*100)/255; //最大是255,所以这里扩大100倍除以255,可以得到百分比数据
    	   ad_count=0;
    	   ad_dat=0;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    main函数

    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(); //调用AD处理函数
    	   switch(beam)	//根据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;  //远光
    	   }
    	}
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    器件清单:

    img

    设计说明书:

    设计背景

    随着日益成熟的交通网络的发展,汽车成为了人类出行不可缺少的交通工具。交通事故的频繁发生成为了人们日渐担忧的问题,人们更加关心汽车的安全性能。根据报道的数据显示,我国夜间发生的交通事故中,70%左右是由于违章使用氙气灯造成灯光炫目,使驾驶员无法看清前方路况而发生的。照明系统是汽车主动安全的重要组成部分之一,如今汽车前照灯灯光光型单一的传统照明系统已经无法跟上当前汽车安全性能发展的趋势;所以,为了减少交通事故的发生,考虑到汽车的人性化设计。本文采用 STC89C52 单片机设计了一款自动切换远近光的汽车前照灯系统。这种前照灯系统更加智能化,能消除存在的安全隐患。

    目标、研究内容和技术要求

    结合所学课程的基础专业知识和基本技能,熟悉单片机机其他硬件的相关知识,完成以下工作:

    第一步,查阅资料,选择合适的硬件,确定硬件系统框图

    第二步,使用AD画图;

    第三步,画图程序流程图,并使用KEIL完成程序的编写。

    第四步,调试。

    实现功能

    1、检测环境光强。

    2、实现自动切换远近光灯。

    3、增加手动切换远近光。

    4、使用液晶显示实时数据

    img

    设计资料清单

    全部资料

    img

  • 相关阅读:
    docker 常用指令(启动,关闭,查看运行状态)
    python—如何提取word中指定内容
    程序员崩溃瞬间
    Css3使用
    图片base64说明
    【C++】c++引用和小细节
    Windows下libmodbus 支持upd库的编译与Qt里的调用
    redis缓存雪崩、穿透、击穿
    OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)
    Optional用法与争议点
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/126475811