目标
设计并制作一款基于单片机的模拟汽车灯控装置,汽车灯控装置友启动、刹车、直行、左转、右转等功能,其核心控制是AT89C51单片机。直流小电动机模拟汽车发动机。
要求
- 启动时,电机转动,直行是所有灯熄灭,左转时,左方灯闪烁亮;右转时右方灯闪烁亮。
- 刹车时,电动机停,后方两灯亮,前方均不亮。
- 停车时,电动机停,所有灯灭。
原理图
程序设计
#include <reg51.h>
#include <intrins.h>
typedef unsigned char Uchar;
sbit star_stop = P1^0;
sbit turn_left = P2^1;
sbit turn_right = P2^0;
sbit run_strt = P2^2;
sbit left_front = P2^3;
sbit left_back = P2^5;
sbit right_front = P2^4;
sbit right_back = P2^6;
sbit run = P1^7;
sbit motor = P2^7;
void Delay_nms(Uchar nms)
{
Uchar i, j;
do
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
while (--nms);
}
void stop()
{
left_front = 1;
left_back = 1;
right_front = 1;
right_back = 1;
motor = 1;
}
void main()
{
Uchar keystate;
stop();
star_stop = 1;
turn_left = 1;
turn_right = 1;
run_strt = 1;
while (1)
{
star_stop = 1;
_nop_();
while (star_stop == 0)
{
if (run == 1)
{
keystate = (~P2) & 0x07;
switch (keystate)
{
case 1:
{
motor = 1;
left_front = 1;
left_back = 1;
right_front = ~right_front;
right_back = ~right_back;
Delay_nms(500);
break;
}
case 2:
{
motor = 1;
right_front = 1;
right_back = 1;
left_front = ~left_front;
left_back = ~left_back;
Delay_nms(500);
break;
}
case 3:
{
left_front = 1;
left_back = 1;
right_front = 1;
right_back = 1;
motor = 1;
break;
}
}
}
else
{
left_front = 1;
right_front = 1;
left_back = 0;
right_back = 0;
motor = 0;
}
}
stop();
}
}
程序思想
-
首先,在程序中定义了一些引脚,用于表示各个功能的输入输出。例如,
star_stop
表示启动/停止按钮,turn_left
表示左转按钮,turn_right
表示右转按钮,等等。 -
初始化阶段,将所有功能的引脚状态设置为初始状态,即禁止运动。通过
stop()
函数实现,将左轮和右轮的前进和后退引脚设置为高电平,将电机引脚设置为高电平。 -
进入主循环,不断检测启动/停止按钮的状态,当检测到启动按钮被按下时,进入运动控制循环。
-
在运动控制循环中,首先读取按键状态并存储在
keystate
变量中。通过位运算和逻辑运算,根据keystate
的值选择相应的运动模式:
- 当
keystate
的值为 1 时,表示向左转。此时将右轮停止,将左轮设置为前进或后退,然后延时一段时间。 - 当
keystate
的值为 2 时,表示向右转。此时将左轮停止,将右轮设置为前进或后退,然后延时一段时间。 - 当
keystate
的值为 3 时,表示停止。此时将左轮和右轮全部停止,并延时一段时间。
-
在运动控制循环中,如果未检测到启动按钮被按下,则将左轮和右轮的引脚状态设置为停止,并将电机引脚设置为低电平。
-
最后,在每次运动控制循环结束后,调用
stop()
函数将所有引脚状态设置为停止,等待下一次循环开始。
总体来说,这段代码通过不断检测按钮状态,并根据按钮状态选择不同的动作,实现了对小车的控制。当启动按钮被按下时,根据左转、右转和停止的按钮状态,控制小车的运动;当启动按钮未被按下时,停止小车的运动。
PCB布局
3D仿真