2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 基于51单片机的汽车超声波防撞声光报警系统proteus仿真原理图PCB

基于51单片机的汽车超声波防撞声光报警系统proteus仿真原理图PCB

时间:2020-10-29 04:58:46

相关推荐

基于51单片机的汽车超声波防撞声光报警系统proteus仿真原理图PCB

功能介绍:

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

1.LCD1602液晶实时距离阈值/测试距离

2.低于距离阈值将声光报警

3.按键可更改距离阈值

原理图:

PCB:

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <stdio.h>#include "lcd1602.h"#include "delay.h"#include "math.h"//管脚定义sbit KEY_ADD = P3^4;sbit KEY_SUB = P3^6;sbit ECHO = P2^5; //超声波引脚定义sbit TRIG = P2^4;sbit BUZZER = P2^2;//变量定义unsigned char dis0[16] = "DisLimit:mm"; //显示数组unsigned char dis1[16] = "Distance:mm"; //显示数组float f_distance; //距离float f_distanceLimit = 300; //限制500mmlong g_cnt = 0; //定时器计数bit g_dispFlag = 0;bit g_refreshFlag = 0;unsigned char cnt = 0;//函数声明void DispDis();void KeyScan();void Timer1_Init();void main(void){unsigned char testTime = 0;float f_distanceBuf = 0;TRIG = 0;TMOD |= 0x01; //设T0为方式1,GATE=1;TH0 = 0;TL0 = 0;//ET0=1; //允许T0中断EA = 1; //开启总中断Timer1_Init();LCD_Init(); //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear();while (1) //主循环{if (g_refreshFlag == 1){g_refreshFlag = 0;if (testTime >= 10){testTime = 0;f_distance = f_distanceBuf / 10; //计算10次平均值f_distanceBuf = 0;}else{TR1 = 0;TRIG = 1; //启动一次模块//不可以使用其他终端 容易造成死循环DelayUs10x(1);TRIG = 0;while (!ECHO); //当RX为零时等待TR0 = 1; //开启计数while (ECHO); //当RX为1计数并等待TR0 = 0;TR1 = 1;g_cnt = (long)(TH0 * 256 + TL0);TH0 = 0;TL0 = 0;f_distanceBuf = f_distanceBuf + (float)(g_cnt * 17) / 100.0 * 1.102; //算出来是mm (g_cnt * 340 / 2) / 1000.0 * 1.102;系数testTime++;}}if ((g_cnt > 0) && (f_distance > 0)){if (f_distance > f_distanceLimit) //距离对比{BUZZER = 1;} //不报警 指示灯正常else{BUZZER = 0;} //报警 指示灯异常}if (g_dispFlag == 1) //刷新液晶{TR1 = 0;DispDis();TR1 = 1;g_dispFlag = 0;}KeyScan();}}void DispDis(){dis0[9] = '0' + (int)f_distanceLimit / 10000;dis0[10] = '0' + (int)f_distanceLimit / 1000 % 10;dis0[11] = '0' + (int)f_distanceLimit / 100 % 10;dis0[12] = '0' + (int)f_distanceLimit / 10 % 10;dis0[13] = '0' + (int)f_distanceLimit % 10;DispStr(0, 0, dis0); //显示距离阈值dis1[9] = '0' + (int)f_distance / 10000;dis1[10] = '0' + (int)f_distance / 1000 % 10;dis1[11] = '0' + (int)f_distance / 100 % 10;dis1[12] = '0' + (int)f_distance / 10 % 10;dis1[13] = '0' + (int)f_distance % 10;DispStr(0, 1, dis1); //显示距离}void KeyScan(){if (!KEY_ADD) //加键按下{DelayMs(200);if (!KEY_ADD) //再次确认加键是否按下{f_distanceLimit = f_distanceLimit + 10;if (f_distanceLimit > 3000){f_distanceLimit = 200;}DispDis();}//while (!KEY_ADD);}if (!KEY_SUB)//减键按下{DelayMs(200); if (!KEY_SUB) //再次确认减键是否按下{f_distanceLimit = f_distanceLimit - 10;if (f_distanceLimit < 200){f_distanceLimit = 3000;}DispDis();} //while (!KEY_SUB);}}//定时器1初始化void Timer1_Init(){TMOD &= 0x0F;TMOD |= 0x10; //16位定时器TH1 = (65536 - 18432) / 256; //20ms定时TL1 = (65536 - 18432) % 256; //20ms定时TR1 = 1;ET1 = 1;EA = 1;}//定时器1的中断void Timer1_INT() interrupt 3{TH1 = (65536 - 18432) / 256; //20ms定时TL1 = (65536 - 18432) % 256;if (cnt >= 25){g_dispFlag = 1;cnt = 0;}else{cnt++;}if (cnt % 5 == 0){g_refreshFlag = 1;}}

仿真演示视频:

/video/BV1iY411F7hj/

实物演示视频:

/video/BV1JR4y1w78M/

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