通过电动车防盗系统来学习基本IO口

发布时间 2023-05-08 23:29:47作者: 林奇老师

  在进行小项目学习IO前,先来一个类似于编程语言的hello world,也就是点灯和灯闪烁,来简单来调试一下硬件和软件编程环境。

点灯
#include "reg52.h"

sbit LED1 = P3^7;

int main()
{
    while(1){
        LED1 = 0;
    }
}

led灯闪烁
#include "reg52.h"
#include "intrins.h"
sbit LED1 = P3^7;

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

1.简单分析

  设计一个电动车防盗系统,首先想到的是我们要有一个震动传感器模块,在我们被推车的时候能感知到,其次需要喇叭,但是单片机为喇叭供电会因为功率问题导致不能用单片机为喇叭供电,所以还需要电池,电池不能一直导通,还需要继电器,以及我们遥控用的遥控发送接收433M模块。

2.简单原理图

 

3.震动传感器

产品不震动,输出高电平
产品震动,输出低电平,绿色指示灯灯亮

震动传感器来控制led
#include "reg52.h"
#include "intrins.h"

sbit LED1 = P3^7;
sbit SS = P2^6;

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

int main()
{
    while(1){
        if(SS == 0){
            LED1 = 0;
            Delay1000ms();
            LED1 = 1;
        }else{
            LED1 = 1;
        }
    }
}

4.继电器

4.1实物

 4.2原理图

 4.3控制继电器

#include "reg52.h"
#include "intrins.h"

sbit SS = P2^6;
sbit    RELAY = P0^3;

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

int main()
{
    while(1){
        if(SS == 0){
            RELAY = 0;
            Delay1000ms();
            RELAY = 1;
        }else{
            RELAY = 1;
        }
    }
}

5.遥控发送接收433M

 6.分析整合

  遥控器有ABCD四个按键,只使用A,B来控制警报状态,做出如下分析:

  1.按下A,喇叭长响,进入警戒模式

  2.按下B,喇叭短响,退出警戒模式

  3.在警戒模式中,产生震动,喇叭响一段时间,不产生震动,喇叭不响

  4.不在警戒模式,不做出反应

#include "reg52.h"
#include "intrins.h"

sbit SS = P2^6;
sbit    RELAY = P0^3;
sbit CONTROLA = P1^2;
sbit CONTROLB = P1^3;

void Delay1000ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

int main()
{
    int mark = 0;
    while(1){
        if(CONTROLA == 1){
            RELAY = 0;
            Delay1000ms();
            Delay1000ms();
            RELAY = 1;
            mark = 1;
        }
        
        if(CONTROLB == 1){
            RELAY = 0;
            Delay1000ms();
            RELAY = 1;
            mark = 0;
        }
        
        if(mark == 1){
            if(ss == 0){
                RELAY = 0;
                Delay1000ms();
                Delay1000ms();
                Delay1000ms();
            }else{
                RELAY = 1;
            }
        }
    }
}        

但是有小bug,在产生震动的时候喇叭响,没办法解除警戒,需要引入中断。