基于51单片机的方向盘模拟系统
在现代汽车中,方向盘不仅是控制方向的装置,还集成了多种功能,如音响控制、定速巡航等。为了研究和测试这些功能,可以设计一个基于51单片机的方向盘模拟系统。该系统可以模拟方向盘的转动和相关功能的操作。
一、系统功能
方向盘模拟系统主要包括以下功能:
- 模拟方向盘转动:通过电机驱动方向盘转动。
- 检测压力传感器:使用压力传感器模拟驾驶员对方向盘的握持力度。
- 重力加速度模拟:通过滑动变阻器和模数转换器模拟重力加速度传感器。
- 按键控制:通过按键控制LED灯的点亮与熄灭。
- 数据显示:通过LCD1602显示屏显示压力值和加速度值。
- 报警和电机控制:当加速度值在3秒内没有变化,或者两个压力传感器的差值大于50时,蜂鸣器报警,继电器控制的电机停止转动。
二、硬件资源
系统基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,采用滑动变阻器连接数模转换器模拟重力加速度传感器电路。一个按键控制LED灯的点亮与熄灭。两路压力值与加速度值通过LCD1602显示屏显示。
三、程序编程
以下是方向盘模拟系统的C语言代码示例:
#include <REGX52.H>
#include <intrins.h>
#include <stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^5;
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;
sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit CS2 = P1^6;
sbit CLK2 = P1^7;
sbit DIO2 = P2^6;
sbit motor = P2^7;
sbit key = P3^1;
sbit led = P3^0;
sbit key1 = P3^2;
static int timerCount;
typedef unsigned char u8;
typedef unsigned int u16;
static uchar u,U,R,u1,U1,R1,u2,U2,R2,lastResistance;
static int number;
static int resistanceChanged;
static int flag = 0;
void beep_warning();
void Time0_Init()
{
TMOD = 0x01;
TH0 = 0xfa >> 8;
TL0 = 0xfa & 0xFF;
ET0 = 1;
TR0 = 1;
EA = 0;
}
void Time0_Int() interrupt 1
{
static unsigned int timerCount = 0;
TH0 = 0xfa >> 8;
TL0 = 0xfa & 0xFF;
timerCount++;
if (timerCount >= 27)
{
timerCount = 0;
if (R != lastResistance)
{
resistanceChanged = 0;
}
else
{
resistanceChanged = 1;
}
lastResistance = R;
}
}
uchar get_AD_Res()
{
uchar i, data1=0, data2=0;
CS=0;
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
CLK=1;_nop_();
CLK=0;DIO=0;_nop_();
CLK=1;_nop_();
CLK=0;DIO=1;_nop_();
for(i=0; i<8; i++)
{
CLK=1;_nop_();
CLK=0;_nop_();
data1=(data1<<1)|(uchar)DIO;
}
for(i=0; i<8; i++)
{
data2=data2|(uchar)DIO<<i;
CLK=1;_nop_();
CLK=0;_nop_();
}
CS=1;
return(data1 == data2)?data1:0;
}
void beep_warning()
{
number = R1-R2;
if(number<=0)
{
number = ~(number-1);
}
if(flag==0)
{
EA = 0;
if(number>50)
{
beep = 1;
motor = 1;
}
else
{
beep = 0;
motor = 0;
}
}
if(flag==1)
{
if(resistanceChanged==1)
{
beep = 1;
motor = 1;
}
else
{
beep = 0;
motor = 0;
}
}
LCD_ShowNum(2,10,resistanceChanged,3);
}
void main()
{
beep=0;
motor=0;
led = 0;
LCD_Init();
Time0_Init();
LCD_ShowString(1,1,"zuo:");
LCD_ShowString(1,10,"you:");
LCD_ShowString(2,1,"Vt:");
while(1)
{
u=get_AD_Res();
U=(250*u)/128;
R=200*U/250;
u1=get_AD_Res1();
U1=(250*u1)/128;
R1=200*U1/250;
u2=get_AD_Res2();
U2=(250*u2)/128;
R2=200*U2/250;
LCD_ShowNum(1,5,R2,3);
LCD_ShowNum(1,14,R1,3);
LCD_ShowNum(2,4,R,3);
beep_warning();
if(!key)
{
led=~led;
while(!key);
}
if(~key1)
{
EA=1;
flag++;
{
if(flag>1)
{
flag = 0;
}
}
while(~key1);
}
}
}
四、实现现象
通过Proteus仿真和实际硬件测试,系统能够实现以下功能:
- 方向盘转动:电机根据模拟信号转动方向盘。
- 压力显示:LCD1602显示屏显示左右压力传感器的值。
- 重力加速度显示:LCD1602显示屏显示重力加速度值。
- 报警功能:当压力传感器的差值大于50或加速度值3秒内无变化时,蜂鸣器报警,电机停止转动。
- LED控制:按键控制LED灯的点亮与熄灭。
具体动态效果可以参考B站演示视频 。
五、总结
基于51单片机的方向盘模拟系统能够模拟汽车方向盘的各种操作,为汽车电子系统的研究和测试提供了一个实用的平台。通过扩展硬件和软件,该系统还可以增加更多功能,如语音提示、数据记录等。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料