功能介绍:
0.本系统采用STC89C52作为单片机
1.系统采用LCD1602实时显示管道压力等信息
2.通过四个功能按键可设置压力等阈值
3.压力传感器采用的型号是松下的D3B
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.一路继电器模拟控制电磁水阀的开关.
6.NB模块采用的是SIM7020C,该模块使用简易且性能稳定。
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#include "main.h"/*******************变量定义*********************/
enum _MODE_DF_ dispMode;
bit modeFlag = AUTO; //模式标记
uchar setIndex = 0;bit flag = 0;int pressureValue; //压力读取值
int pressure_H = 15;//压力上限
int pressure_L = 5;//压力下限bit drawFlag1 = 0; //抽水标志1
bit buzzerFlag1 = 0; //蜂鸣器标志1/********************************************************
函数名称:void mian()
函数作用:主函数
参数说明:
********************************************************/
void main()
{LCD_Init();   //初始化液晶DelayMs(200); //延时有助于稳定LCD_DispStr(4, 0, "Welcome!");Uart_Init(); //初始化串口lte_reset();LTE_Process();Timer0_Init();Timer1_Init(); //初始化定时器0LCD_Clear();  //清屏LCD_DispStr(0, 0," H:      L:     ");LCD_DispStr(0, 1,"  Now:   g/cm2  ");Disp3Num(3, 0, (int)pressure_H);Disp3Num(11, 0, (int)pressure_L);Disp3Num(6, 1, pressureValue);while (1) //死循环{if (flag == 1){flag = 0;if (pressureValue < pressure_L) //达到压力下限{drawFlag1 = 1; //开启抽水buzzerFlag1 = 1;}else if (pressureValue > pressure_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; //重新赋值 10msTL1 = (65536 - 9216) % 256;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; //重新赋值 10msTL1 = (65536 - 9216) % 256;time10ms++;if (time10ms > 100) //1s测一次{unsigned char i;flag = 1;pressureValue = 0;for (i = 0; i < 5; i++){pressureValue = pressureValue + (ReadADC(AIN0_GND) - 12) * 100 / (255 - 12); //读取当前水压}if (pressureValue < 0){pressureValue = 0;}else{pressureValue = pressureValue / 5; //求平均}Disp3Num(6, 1, pressureValue);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){flag = 1;setIndex = 0;LCD_DispOneChar(0, 0, ' ');LCD_DispOneChar(8, 0, ' ');key_cnt = 0;}}if (KEY_ADD == 0) //设置键按下{key_cnt++;if (KEY_ADD == 0 && key_cnt > 15){if (setIndex == 1){pressure_H = pressure_H + 1;if (pressure_H > 100){pressure_H = pressure_L + 1;}Disp3Num(3, 0, (int)pressure_H);}else if (setIndex == 2){pressure_L = pressure_L + 1;if (pressure_L >= pressure_H){pressure_L = 0;}Disp3Num(11, 0, (int)pressure_L);}key_cnt = 0;}}if (KEY_SUB == 0) //设置键按下{key_cnt++;if (KEY_SUB == 0 && key_cnt > 15){if (setIndex == 1){pressure_H = pressure_H  - 1;if (pressure_H <= pressure_L){pressure_H = 100;}Disp3Num(3, 0, (int)pressure_H);}else if (setIndex == 2){pressure_L = pressure_L  - 1;if (pressure_L < 0){pressure_L = pressure_H  - 1;}Disp3Num(11, 0, (int)pressure_L);}key_cnt = 0;}}
}void Disp3Num(unsigned char column, unsigned char row, int num)
{unsigned char bai = 0;unsigned char shi = 0;unsigned char ge = 0;bai  = num / 100;shi  = num % 100 / 10;ge   = num % 10;LCD_DispOneChar(column, row, bai + '0');LCD_DispOneChar(column+1, row, shi + '0');LCD_DispOneChar(column+2, row, ge + '0');
}

实物演示视频:
https://www.bilibili.com/video/BV1de4y1i7tv/

基于51单片机及NB-IoT的消防管道压力检测原理图PCB相关推荐

  1. 51、基于51单片机洗衣机控制系统(带水位)系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+任务书+流程图+元器件清单等)

    摘 要 随着数字技术的快速发展,数字技术被广泛应用于智能控制的领域中.单片机以体积小.功能全.价格低廉.开发方便的优势得到了许多电子系统设计者的青睐.它适合于实时控制,可构成工业控制器.智能仪表.智能 ...

  2. 基于51单片机数控可调恒流源设计(实物图+原理图+PCB+论文)

     资料编号:087 1.采用51单片机 2. LCD1602液晶实时显示当前的电流值,并且可以通过按键进行设置. 3.电流默认的范围为0-1000mA. 4.按键设置电流大小,步进为10mA(0.01 ...

  3. 基于51单片机的时钟电子秤称重系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.采用LCD1602液晶显示当前时间和检测重量 2.按键可更改时间和设置超重报警阈值 3.采用HEX711和称重支架传感器获取物体重量信息,传入 ...

  4. 基于51单片机的电子密码指纹锁无线WiFi通信原理图PCB

    功能介绍: 0.本系统采用STC12C5A60S2-35I作为单片机,因本系统需要使用WiFi模块和指纹模块,两者均是串口串口通信,89C52只有一路串口,因此无法满足需求,STC12C5A60S2- ...

  5. 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示时间/环境光强/工作模式 2.每隔5s向蓝牙串口发送一次信息 3.支持路灯故障检测 4.工作时间18~24时,两个路灯同时点亮,24时 ...

  6. 基于51单片机的水温温度PID算法控制系统proteus仿真原理图PCB

    1.本系统采用STC89C52作为单片机 2.采用液晶LCD1602液晶实时显示相关数据 3.采用矩阵键盘可设置PID相关参数 4.采用L298驱动功率电阻模拟加热过程 5.当温度超过设定值的一定范围 ...

  7. 基于51单片机的智能护眼台灯设计proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/环境光强/工作模式 2.当检测到人体距离灯光太近时,蜂鸣器报警提醒 3.当使用时间超过设定阈值时,蜂鸣器报 ...

  8. 基于51单片机的智能饮水机烧水控制系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和设定温度 2.当温度到达100℃时,蜂鸣器报警提醒水烧开了 3.按键可更改预设温度值,当温度低于设定温度5 ...

  9. 基于51单片机电子秤称重系统10kg量程proteus仿真原理图PCB

    功能: 1.本系统采用STC89C52作为单片机 2.本系统LCD1602液晶实时显示时间和当前重量 3.四个功能按键其中,按'设置'键进入时间设置,按'去皮'键实现去皮功能 4.系统设置有重量阈值, ...

最新文章

  1. topcoder srm 495 div1
  2. 转---SQL与EXCEL交互(导出/导入)
  3. python多线程_python多线程:控制线程数量
  4. Nginx之配置后端服务器组
  5. win7 64位操作系统中Oracle 11g + plsql安装教程详解(图解)
  6. 不同vlan之间如何ping通_如何利用交换机实现不同VLAN、不同网段之间互访?
  7. Xshell5免费版安装使用说明
  8. SMART200 DP01模块通讯问题
  9. windows自带备份驱动
  10. 编码:隐匿在计算机软硬件背后的语言
  11. 视频无法播放,视频打不开怎么办?可用这款视频修复工具快速修复
  12. 做计算机用英语怎么读,计算机英语怎么读
  13. Unity中,区别LookAt与LookRotation
  14. Mvp+OkHttp+XRecyclerView------上拉加载下拉刷新
  15. zabbix-邮件报警配置
  16. 云技术背景下ssl证书可以提供怎样的安全服务呢?
  17. 多路脉冲发生器设计(脉冲个数,脉冲宽度可控)
  18. 数据库-订单发票表(单表)
  19. python话费充值_【图片】话费充值解决方案(附代码)转载【开发吧】_百度贴吧...
  20. 使用Python,OpenCV构建移动文档扫描仪

热门文章

  1. oracle 加密方案
  2. svn基于mysql认证_Svn基于mysql做登陆认证
  3. 瑞芯微RK3188规格说明,ARM构架
  4. 揭秘!2周实现上云上市,阿里云SaaS上云工具包如何打造新云梯?
  5. revit插件加载位置 addin 文件位置
  6. Revit插件教学丨Revit中绘制斜楼板的两种方法?
  7. 赛博空间:涵义、组成和特征
  8. 腾讯大讲堂:认清项目本质【从0开始学产品策划 ①】-20141127早读课
  9. 极路由1S 开启临时ssh 并刷breed成功
  10. 各大CDN的节点IP段