基于51单片机模拟汽车灯控

目标
设计并制作一款基于单片机的模拟汽车灯控装置,汽车灯控装置友启动、刹车、直行、左转、右转等功能,其核心控制是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();
   }
 }

在这里插入图片描述
程序思想

  1. 首先,在程序中定义了一些引脚,用于表示各个功能的输入输出。例如,star_stop 表示启动/停止按钮,turn_left 表示左转按钮,turn_right 表示右转按钮,等等。

  2. 初始化阶段,将所有功能的引脚状态设置为初始状态,即禁止运动。通过 stop() 函数实现,将左轮和右轮的前进和后退引脚设置为高电平,将电机引脚设置为高电平。

  3. 进入主循环,不断检测启动/停止按钮的状态,当检测到启动按钮被按下时,进入运动控制循环。

  4. 在运动控制循环中,首先读取按键状态并存储在 keystate 变量中。通过位运算和逻辑运算,根据 keystate 的值选择相应的运动模式:

  • keystate 的值为 1 时,表示向左转。此时将右轮停止,将左轮设置为前进或后退,然后延时一段时间。
  • keystate 的值为 2 时,表示向右转。此时将左轮停止,将右轮设置为前进或后退,然后延时一段时间。
  • keystate 的值为 3 时,表示停止。此时将左轮和右轮全部停止,并延时一段时间。
  1. 在运动控制循环中,如果未检测到启动按钮被按下,则将左轮和右轮的引脚状态设置为停止,并将电机引脚设置为低电平。

  2. 最后,在每次运动控制循环结束后,调用 stop() 函数将所有引脚状态设置为停止,等待下一次循环开始。

总体来说,这段代码通过不断检测按钮状态,并根据按钮状态选择不同的动作,实现了对小车的控制。当启动按钮被按下时,根据左转、右转和停止的按钮状态,控制小车的运动;当启动按钮未被按下时,停止小车的运动。
PCB布局
在这里插入图片描述
3D仿真
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值