1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于51单片机的车辆远近光灯刹车灯防撞控制系统proteus仿真原理图PCB

基于51单片机的车辆远近光灯刹车灯防撞控制系统proteus仿真原理图PCB

时间:2024-02-28 08:28:16

相关推荐

基于51单片机的车辆远近光灯刹车灯防撞控制系统proteus仿真原理图PCB

功能介绍:

0.本系统采用STC89C52作为单片机

1.当环境光不足时,自动打开前照灯,同时根据前方3m以内是否有车辆,判定开启远光灯还是近光灯

2.系统具有防撞报警功能,当前方4m有障碍物,车速超过30km/h时,蜂鸣器报警(经测试,Proteus中HCSR04最大检测距离4.31m)

3.刹车时,刹车灯亮。转向时,转向灯闪烁,回正后,转向灯停止

4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#include "main.h"#define DIAMETER 500 //直径,单位mmbit refreshFlag = 1;bit leftFlag = 0; //左转标志bit rightFlag = 0; //右转标志unsigned char adValue = 0;unsigned char lightValue = 0;float distance = 0; //实际测试距离float speed = 0;unsigned long pulseCnt = 0;void Timer0_Init(void); //定时器0初始化void Timer1_Init(void); //定时器1初始化void EXT0_Init(void); //外部中断0初始化void main(void){TRIG = 0;Timer0_Init();Timer1_Init();EXT0_Init();while (1) //主循环{if (refreshFlag == 1) //1s获取数据{EX0 = 0; //关闭外部中断0refreshFlag = 0;speed = 3.6 * DIAMETER * 2 * 3.14 * (float)pulseCnt / 1000; //单位km/hpulseCnt = 0;EX0 = 1;/************************* 测量距离 *************************/TR0 = 0;TRIG = 1; //启动一次模块DelayUs10x(1);TRIG = 0;while (!ECHO); //当RX为零时等待TR1 = 1; //开启计数while (ECHO); //当RX为1计数并等待TR1 = 0;distance = 1.12 * ((float)TH1 * 256 + TL1) * 17 / 100; //算出来是mm,1.12为系数TH1 = 0;TL1 = 0;TR0 = 1;/************************* 前照灯控制 *************************/adValue = ReadADC(AIN0_GND);lightValue = 100 - ReadADC(AIN1_GND) * 100 / 255; //检测环境光/************************* 转向灯控制 *************************/if (adValue < 55) //右转{leftFlag = 0;rightFlag = 1;}else if (adValue > 200) //左转{leftFlag = 1;rightFlag = 0;}else //转正{leftFlag = 0;rightFlag = 0;}if (lightValue < 30) //环境光弱{if (distance < 3000) //小于3m{LOW_BEAM = ON; //近光灯开HIGH_BEAM = OFF; //远光灯关}else{LOW_BEAM = OFF; //近光灯关HIGH_BEAM = ON; //远光灯开}}else //光照强{LOW_BEAM = OFF; //近光灯关HIGH_BEAM = OFF; //远光灯关}/************************* 防撞报警 *************************/if (distance < 4000 && speed > 30) //前方4m内有障碍物且速度大于30km/h,蜂鸣器报警{BUZZER = ON;}else{BUZZER = OFF;}}KeyProcess();}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Timer0_Init(void){TMOD &= 0xF0; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TL0 = 0x00;//设置定时初值TH0 = 0x4C;//设置定时初值 50msEA = 1; //总中断打开ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开}void Timer1_Init(void){TMOD &= 0x0F;TMOD |= 0x10;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH1 = 0; TL1 = 0;EA = 1; //总中断打开ET1 = 1; //定时器中断打开TR1 = 0; //定时器开关关闭}void EXT0_Init(void){IT0 = 1; //下降沿触发EX0 = 1; //使能外部中断0EA = 1; //打开总中断}void EXT0_Interrupt(void) interrupt 0{pulseCnt++;}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_Interrupt(void) interrupt 1{static unsigned int time50ms = 0;TL0 = 0x00;//设置定时初值TH0 = 0x4C;//设置定时初值 50mstime50ms++;if (time50ms >= 20) // 1s{time50ms = 0;refreshFlag = 1;if (leftFlag == 1) //左转{LED_LEFT = ~LED_LEFT;LED_RIGHT = OFF;} else if (rightFlag == 1) //右转{LED_RIGHT = ~LED_RIGHT;LED_LEFT = OFF;}else{LED_LEFT = OFF;LED_RIGHT = OFF;}}}

仿真演示视频:

/video/BV1HU4y127cp/

实物演示视频:

/video/BV1jT411K7bu/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。