基于51单片机及NB-IoT的水箱水位监测系统原理图PCB

功能简介:
1.基于C51单片机作为控制器
2.LCD1602作为系统的显示器
3.NB通信模块采用SIM7020C
4.HC-SR04超声波模块实现水箱水位的检测
5.利用继电器可控制水阀的关断与闭合
6.电源采用dc002直接输入5V供电。

原理图:
在这里插入图片描述
PCB:
在这里插入图片描述
代码:

#include "main.h"

/*******************变量定义*********************/
enum _MODE_DF_ dispMode;
bit modeFlag = AUTO; //模式标记
uchar setIndex = 0;

bit flag = 1;

float distance = 0;//水位距离
xdata int distance_H = 500;//水位上限
xdata int distance_L = 50;//水位下限

bit drawFlag1 = 0; //抽水标志1
bit buzzerFlag1 = 0; //蜂鸣器标志1

/********************************************************
函数名称:void mian()
函数作用:主函数
参数说明:
********************************************************/
void main()
{
    TRIG = 0;
    
    LCD_Init();   //初始化液晶
    DelayMs(200); //延时有助于稳定
    LCD_DispStr(4, 0, "Welcome!");

    Uart_Init(); //初始化串口
    
    lte_reset();
    LTE_Process();

    Timer0_Init();
    Timer1_Init(); //初始化定时器0
    LCD_Clear();  //清屏
    LCD_DispStr(0, 0," H:      L:     ");
    LCD_DispStr(0, 1,"   Now:    mm   ");
    Disp4Num(3, 0, (int)distance_H);
    Disp4Num(11, 0, (int)distance_L);

    while (1) //死循环
    {
        if (flag == 1)
        {
            flag = 0;
            if (distance > (1050 - distance_L)) //达到水位下限,1050是因为要除去超声波的盲区50mm
            {
                drawFlag1 = 1; //开启抽水
                buzzerFlag1 = 1;
            }
            else if (distance < (1050 - distance_H)) //达到水位上限
            {
                drawFlag1 = 0; //停止抽水
                buzzerFlag1 = 0;
            }
            else
            {
                buzzerFlag1 = 0;
            }

            if (buzzerFlag1) //蜂鸣器报警
            {
                BUZZER = ON;
            }
            else
            {
                BUZZER = OFF;
            }

            if (drawFlag1) //抽水
            {
                RELAY_DRAW_WATER = ON;
            }
            else
            {
                RELAY_DRAW_WATER = OFF;
            }
        }
        else
        {
            LTE_Process();
        }
    }   
}

void LTE_Process(void)
{
    if (!(lte_init_flag && lte_net_flag && lte_connect_flag)) // 如果核心板未初始化、未网络配置、未连接则进行初始化
    {
        err_num = lte_init(); // 核心板初始化,并将初始化结果保存在 err_num
        // sprintf(dis, "%1d %1d %1d %5d", (int)lte_init_flag ,(int)lte_net_flag, (int)lte_connect_flag, (int)err_num);
        // LCD_DispStr(0, 1, dis);
    }



    if (!(lte_net_flag && lte_connect_flag) && lte_init_flag) // 初始化完成,未网络配置,未连接
    {
        err_num = lte_net_config(); // 进行核心板网络配置
        // sprintf(dis, "%1d %1d %1d %5d", (int)lte_init_flag ,(int)lte_net_flag, (int)lte_connect_flag, (int)err_num);
        // LCD_DispStr(0, 1, dis);
    }
    

    if (!lte_connect_flag && lte_init_flag && lte_net_flag) // 完成初始化和网络配置,开始连接服务器
    {
        err_num = lte_connect(); // 开始 TCP 连接
        // sprintf(dis, "%1d %1d %1d %5d", (int)lte_init_flag ,(int)lte_net_flag, (int)lte_connect_flag, (int)err_num);
        // LCD_DispStr(0, 1, dis);
    }
    

    if (!err_num && lte_init_flag && lte_connect_flag && lte_net_flag) // 连接成功,数据交互处理
    {
        err_num = lte_send_process();
        DelayS(1);
        lte_receive_process();          // 处理TCP发送过来的数据
//        if (!err_num)                   // 未出错
//        {
//            lte_receive_process(); // 处理TCP发送过来的数据
//            // err_num = lte_send_process();
//            // err_num = heard_beat_process(); // 心跳包处理
//        }
        // sprintf(dis, "%1d %1d %1d %5d", (int)lte_init_flag ,(int)lte_net_flag, (int)lte_connect_flag, (int)err_num);
        // LCD_DispStr(0, 1, dis);
    }
    

    if (!(lte_init_flag || lte_net_flag || lte_connect_flag) && err_num) // AT命令报错
    {
        err_process(err_num); // 出错处理
        // sprintf(dis, "%1d %1d %1d %5d", (int)lte_init_flag ,(int)lte_net_flag, (int)lte_connect_flag, (int)err_num);
        // LCD_DispStr(0, 1, dis);
    }
    
}

/************************* 定时器0初始化 *************************/
void Timer0_Init(void)
{
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    // TH0 = (65536 - 9216) / 256; //重新赋值 10ms
    // TL0 = (65536 - 9216) % 256;
    TH0 = 0;
    TL0 = 0;
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 0; //定时器开关打开
}

/************************* 定时器0中断 *************************/
void Timer0_Interrupt(void) interrupt 1
{
    // static unsigned int time10ms  = 0;
    // TH0 = (65536 - 9216) / 256; //重新赋值 10ms
    // TL0 = (65536 - 9216) % 256;
}


/************************* 定时器1初始化 *************************/
void Timer1_Init(void)
{
    TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TH1 = (65536 - 9216) / 256; //重新赋值 10ms
    TL1 = (65536 - 9216) % 256;
    //PT1 = 1; //高优先级
    EA = 1;  //总中断打开
    ET1 = 1; //定时器中断打开
    TR1 = 1; //定时器开关打开
}

/************************* 定时器1中断 *************************/
void Timer1_Interrupt(void) interrupt 3
{
    static unsigned int time10ms  = 0;
    static unsigned char key_cnt = 0; // 按键计时

    TH1 = (65536 - 9216) / 256; //重新赋值 10ms
    TL1 = (65536 - 9216) % 256;
    time10ms++;

    if (time10ms > 100) //1s测一次
    {
        flag = 1; 
        Measuring(&distance);
        Disp4Num(7, 1, (1050 - distance));
        time10ms = 0;
    }

    if (KEY_SET == 0) //设置键按下
    {
        key_cnt++;
        if (KEY_SET == 0 && key_cnt > 15)
        {
            setIndex++;
            if (setIndex > 2)
            {
                setIndex = 1;
            }
            if (setIndex == 1)
            {
                LCD_DispOneChar(0, 0, '>');
                LCD_DispOneChar(8, 0, ' ');
            }
            else if (setIndex == 2)
            {
                LCD_DispOneChar(0, 0, ' ');
                LCD_DispOneChar(8, 0, '>');
            }
            key_cnt = 0;
        }
    }
    
    if (KEY_ENTER == 0) //设置键按下
    {
        key_cnt++;
        if (KEY_ENTER == 0 && key_cnt > 15)
        {
            setIndex = 0;
            LCD_DispOneChar(0, 0, ' ');
            LCD_DispOneChar(8, 0, ' ');
            key_cnt = 0;
        }
    }

实物演示视频:

https://www.bilibili.com/video/BV1kd4y1q7oN/

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NB-IOT(Narrow Band Internet of Things)技术是一种低功耗、广覆盖、低成本的物联网通信技术,其在环境监测系统中有着广泛的应用。下面是一些关于NB-IOT环境监测系统的文献综述: 1.《基于NB-IOT技术的环境监测系统设计与实现》 该文献介绍了一种基于NB-IOT技术的环境监测系统,该系统利用NB-IOT网络进行数据传输,实现了对温度、湿度、PM2.5等环境参数的监测。该系统具有低功耗、广覆盖、可靠性高等优点,适用于城市环境监测、工业污染源监测等场景。 2.《NB-IOT环境监测系统设计与实现》 该文献介绍了一种基于NB-IOT技术的环境监测系统,该系统采用传感器节点和NB-IOT模块构建,利用NB-IOT网络进行数据传输。该系统实现了对温度、湿度、气压等环境参数的监测,并能够实现数据的远程管理和控制。该系统具有低功耗、广覆盖、传输稳定等优点。 3.《基于NB-IOT技术的城市环境监测系统设计与实现》 该文献介绍了一种基于NB-IOT技术的城市环境监测系统,该系统利用NB-IOT网络进行数据传输,实现了对空气质量、噪声、温度、湿度等环境参数的监测。该系统具有低功耗、广覆盖、实时性强等优点,适用于城市环境监测、交通监测等场景。 4.《基于NB-IOT技术的工业环境监测系统设计与实现》 该文献介绍了一种基于NB-IOT技术的工业环境监测系统,该系统利用NB-IOT网络进行数据传输,实现了对温度、湿度、气压等环境参数的监测。该系统具有低功耗、广覆盖、传输稳定等优点,适用于工业污染源监测等场景。 综上所述,NB-IOT技术在环境监测系统中有着广泛的应用,其低功耗、广覆盖、传输稳定等特点使其成为环境监测系统中的重要通信技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值