“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【下】(分文件编程)

“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【下】(分文件编程)

    • 前言
    • 预备知识
    • 1温湿度检测系统需求
    • 2.分文件编程核心思路
    • 3.分文件编程操作
    • 4利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件
    • 5.将串口的代码,LCD1602代码,DHT11代码,延时代码整合到对应的C文件中
      • 5.1串口的代码
      • 5.2 LCD1602代码
      • 5.3 DHT11代码
      • 5.4延时代码
    • 6.利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件。
      • 6.1 uart.h 文件内容
      • 6.2 lcd1602.h 文件内容
      • 6.3 dht11.h 文件内容
      • 6.4 delay.h 文件内容
      • 6.5 io.h 文件内容
    • 7.在主C文件中调用这些“.h”文件,在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件
      • 7.1主C文件调用“.h”文件
      • 7.2 uart.c调用需要的“.h”文件
      • 7.3 lcd1602.c调用需要的“.h”文件
      • 7.4 dht11.c调用需要的“.h”文件
      • 7.5 delay.c调用需要的“.h”文件
    • 8.在主C文件中保留主函数代码,引入外部变量。
      • 8.1主C文件中保留主函数代码
      • 8.2 引入外部变量
    • 9.完整程序代码截图
      • 9.1主C文件代码截图
      • 9.2 uart.c 代码截图
      • 9.3 lcd1602.c代码截图
      • 9.4 dht11.c代码截图
      • 9.5 delay.c代码截图
      • 9.6 uart.h 代码截图
      • 9.7 lcd1602.h代码截图
      • 9.8 dht11.h代码截图
      • 9.9 delay.h代码截图
      • 9.10 io.h代码截图
    • 结束语

前言

  本篇博文介绍的是用51单片机的非标准写协议项目温湿度检测系统【下】(分文件编程),包含温湿度检测系统需求,分文件编程核心思路,分文件编程操作,利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件,将串口的代码,LCD1602代码,DHT11代码,延时代码整合到对应的C文件中,利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件,在主C文件中调用这些“.h”文件,在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件,在主C文件中保留主函数代码,引入外部变量,完整程序代码截图。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别和接线,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、C头文件
  四、C变量
  五、基本输入输出
  六、流程控制
  七、函数

  八、指针
  九,字符串

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1温湿度检测系统需求

  • 能够实时通过51单片机串口发送温湿度信息
  • 能够实时通过51单片机驱动LCD1602显示温湿度信息
  • 能够实现判断温度到达一定温度让LED亮,也可以通过串口发送指令使LED亮灭
  • 采用分文件编程

2.分文件编程核心思路

  • 分文件编程操作
  • 利用分文件操作建立uart.clcd1602.cdht11.cdelay.c文件
  • 串口的代码LCD1602代码DHT11代码延时代码整合到对应的C文件中。
  • 利用分文件操作建立uart.hlcd1602.hdht11.hdelay.hio.h文件。
  • 在主C文件中调用这些“.h”文件,在uart.clcd1602.cdht11.cdelay.c调用需要的“.h”文件
  • 在主C文件中保留主函数代码,引入外部变量。

  注:此程序是基于温湿度检测系统_1602显示串口发送工程修改而来。

3.分文件编程操作

  • 操作步骤

1.打开温湿度检测系统\_分文件编程工程

在这里插入图片描述

2.在Source Group 1 上右键,在弹出的界面上选择第二项

在这里插入图片描述

3.在弹出的界面中,我们可以添加C文件头文件等,之后的操作都是如此。

在这里插入图片描述

4利用分文件操作建立uart.c、lcd1602.c、dht11.c、delay.c文件

在这里插入图片描述

5.将串口的代码,LCD1602代码,DHT11代码,延时代码整合到对应的C文件中

5.1串口的代码

sfr AUXR = 0x8e;   //声明AUXR寄存器地址
sbit LED2 = P3^6;char LEDStatus[12];void UartInit(void)		//自己配
{//配置串口工作方式为方式1,从只收不发改为能收能发SCON =  0x50;//配置辅助寄存器,减少电磁辐射,稳定晶振频率  AUXR =  0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD &= 0x0F;TMOD |= 0x20;//设置串口波特率为9600,0误差TH1   = 0xFD;TL1   = 0xFD;//打开定时器1TR1   = 1;//打开总中断EA    = 1;//打开串口中断ES    = 1;}void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0;          //一定要软件置零,不然会出现乱序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void UART_handler() interrupt 4
{static char i = 0;//在串口中段函数中可以对发送接收中断标志进行处理if(RI == 1){RI = 0;     //必须软件置零LEDStatus[i] = SBUF;i++;if(strstr(LEDStatus,"开灯")){LED1 = 0;LED2 = 0;Delay1000ms();Delay1000ms();i    = 0;memset(LEDStatus,'\0',12);}if(strstr(LEDStatus,"关灯")){LED1 = 1;LED2 = 1;Delay1000ms();i    = 0;memset(LEDStatus,'\0',12);}}if(TI);}

5.2 LCD1602代码

//数据线定义
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0//控制线定义
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;void checkBusy()
{char tmp   = 0x80;dataBuffer = 0x80;while(tmp & 0x80)    //只要dataBuffer中的第8位为1就为忙,因为BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。{RS = 0;            //根据手册中指令表可知RS=0,RW=1RW = 1;            //RW=1为读的操作,所以需要配置读的时序图EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高EN = 1;            //根据手册中的读时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();tmp = dataBuffer;  //读取dataBuffer中的忙信号EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平}
}void writeCmd(char cmd)
{       checkBusy();       //检测忙信号RS = 0;            //RS等于零,是写指令操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cmd;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}void weiteData(char cData)
{checkBusy();       //检测忙信号RS = 1;            //RS等于1,是写数据操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cData;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}void initLCD1602()
{
//(1) 延时 15msDelay15ms();
//(2) 写指令 38H(不检测忙信号)writeCmd(0x38);
//(3) 延时 5msDelay5ms();
//(4) 以后每次写指令,读/写数据操作均需要检测忙信号
//(5) 写指令 38H:显示模式设置writeCmd(0x38);
//(6) 写指令 08H:显示关闭writeCmd(0x08);
//(7) 写指令 01H:显示清屏writeCmd(0x01);
//(8) 写指令 06H:显示光标移动设置writeCmd(0x06);
//(9) 写指令 0CH:显示开及光标设置writeCmd(0x0C);
}void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //选择哪行显示{case 1:                                        //第一行显示writeCmd(0x80 + column);                   //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数while(*str)                                //判断字符串指针变量不为空执行循环,不用判断字符串结束标志{weiteData(*str);                         //发送字符串单个字符str++;                                   //字符串指针变量偏移}break;case 2:                                        //第二行显示writeCmd(0x80 + 0x40 + column);            //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数,又因为第二行的列从0x40开始while(*str)                                //所以是从0x80 + 0x40 + 列数(特别注意){                     weiteData(*str);str++;}break;}
}

5.3 DHT11代码

sbit Data = P3^3; //把DHT11接在单片机的P3.3口char THdata[5];      //存放温湿度数据变量
char Temperature[9]; //定义温度字符数组
char Humidness[9];   //定义湿度字符数组void startDHT()
{Data = 1;Data = 0;//至少延时18ms,那么延时30msDelay30ms();Data = 1;//检测d点while(Data);//检测e点while(!Data);//检测f点while(Data);
}void readDHTData()
{char i; //轮次char j; //次数char flag;char tmp;//打开DHT11高速模式startDHT();for(i=0; i<5; i++){for(j=0; j<8; j++){//检测G点while(!Data);//根据传送1和0的时间不同,0是26us,1是70us。等待60us后,如果Data = 1,就传1,Data = 0;就传0//Delay60us();   延时60微妙太长了,可能在读0时读到下一个发送序列了,延时40微妙Delay40us();if(Data == 1){flag = 1;while(Data); //传1的时间比较久,所以要等传1结束}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}THdata[i] = tmp;}
}void THDataHandler()
{//湿度数据处理Humidness[0] = 'H';Humidness[1] = ':';Humidness[2] = THdata[0]/10 + 0x30;Humidness[3] = THdata[0]%10 + 0x30;Humidness[4] = '.';Humidness[5] = THdata[1]/10 + 0x30;Humidness[6] = THdata[1]%10 + 0x30;Humidness[7] = '%';Humidness[8] = '\0';//温度处理Temperature[0] = 'T';Temperature[1] = ':';Temperature[2] = THdata[2]/10 + 0x30;Temperature[3] = THdata[2]%10 + 0x30;Temperature[4] = '.';Temperature[5] = THdata[3]/10 + 0x30;Temperature[6] = THdata[3]%10 + 0x30;Temperature[7] = 'C';Temperature[8] = '\0';
}

5.4延时代码

void Delay15ms()		//@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}void Delay5ms()		//@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}void Delay30ms()		//@11.0592MHz
{unsigned char i, j; i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us()		//@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}

6.利用分文件操作建立uart.h、lcd1602.h、dht11.h、delay.h、io.h文件。

6.1 uart.h 文件内容

  • 这个文件的作用主要起到声明函数的作用。
void UartInit(void);		//自己配void sendByte(char data_mas);void sendString(char *str);

6.2 lcd1602.h 文件内容

  • 这个文件的作用主要起到声明函数的作用。
void initLCD1602();void LCD1602ShowARow(char line,char column,char *str);

6.3 dht11.h 文件内容

  • 这个文件的作用主要起到声明函数的作用。
void readDHTData();void THDataHandler();

6.4 delay.h 文件内容

  • 这个文件的作用主要起到声明函数的作用。
void Delay15ms();		//@11.0592MHzvoid Delay5ms();		//@11.0592MHzvoid Delay30ms();		//@11.0592MHzvoid Delay40us();		//@11.0592MHzvoid Delay1000ms();		//@11.0592MHz

6.5 io.h 文件内容

  • 这个文件的作用主要起到声明函数的作用。
sbit LED1 = P3^7; //用尾定义声明LED1

7.在主C文件中调用这些“.h”文件,在uart.c、lcd1602.c、dht11.c、delay.c调用需要的“.h”文件

7.1主C文件调用“.h”文件

#include "reg52.h"
#include "intrins.h"
#include "delay.h"
#include "uart.h"
#include "lcd1602.h"
#include "dht11.h"
#include "io.h"

7.2 uart.c调用需要的“.h”文件

#include "reg52.h"
#include "delay.h"
#include "io.h"
#include "string.h"

7.3 lcd1602.c调用需要的“.h”文件

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

7.4 dht11.c调用需要的“.h”文件

#include "reg52.h"
#include "delay.h"

7.5 delay.c调用需要的“.h”文件

#include "intrins.h"

8.在主C文件中保留主函数代码,引入外部变量。

8.1主C文件中保留主函数代码

LED1 = 1;            //一上电就让灯灭
Delay1000ms();
UartInit();          //初始化串口
initLCD1602();               //初始化LCD1602
Delay1000ms();       //等待DHT模块稳定
Delay1000ms();
while(1)             //防止程序退出主函数,导致LED1微弱闪烁
{Delay1000ms();     //间隔1秒读一次readDHTData();     //读取DHT11温湿度数据THDataHandler();   //将DHT11传回的数据装入温湿度字符数组//通过串口发送温湿度数据sendString(Humidness);sendString("\r\n");sendString(Temperature);sendString("\r\n");sendString("\r\n");LCD1602ShowARow(1,4,Humidness); LCD1602ShowARow(2,4,Temperature);
}

8.2 引入外部变量

  • extern为引入外部变量标志
//引入DHT11.c内的全局变量
extern char THdata[5];      //存放温湿度数据变量 extern为引入外部变量标志
extern char Temperature[9]; //定义温度字符数组
extern char Humidness[9];   //定义湿度字符数组

9.完整程序代码截图

9.1主C文件代码截图

在这里插入图片描述

9.2 uart.c 代码截图

在这里插入图片描述

9.3 lcd1602.c代码截图

请添加图片描述

9.4 dht11.c代码截图

在这里插入图片描述

9.5 delay.c代码截图

在这里插入图片描述

9.6 uart.h 代码截图

在这里插入图片描述

9.7 lcd1602.h代码截图

在这里插入图片描述

9.8 dht11.h代码截图

在这里插入图片描述

9.9 delay.h代码截图

在这里插入图片描述

9.10 io.h代码截图

在这里插入图片描述

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安装sqlite

windows安装sqlite比linux麻烦很多 1.下载 下载链接&#xff1a;链接 下载dll的zip文件 2.解压并放到文件夹 将压缩包内的文件解压&#xff0c;放到C://sqlite下 3.编辑环境变量 添加到系统变量的path中 4.验证 打开命令提示符&#xff0c;输入 sqlite3有结果就行

C++类和对象(7)

目录 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 3. 友元 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以 友元不宜多用。 友元…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

代码随想录算法训练营Day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 300.最长递增子序列 前言 思路 算法实现 674. 最长连续递增序列 前言 思路 算法实现 718. 最长重复子数组 前言 思路 总结 300.最长递增子序列 题目链接 文章链接 前言 在结束代码随想录中的股票问题后&#xff0c;又是一个新的专题&#xff0c;本题是子序列问…

2 月 9 日算法练习- 数据结构 - 除夕快乐♪٩(´ω`)و♪

翻转括号序列 暴力过20%数据 思路&#xff1a;括号合法序列问题可以利用前缀和&#xff0c;将"(“看成 1&#xff0c;”)"看成 0&#xff0c;规律是到某个位置为止的前缀和>0并且到最后前缀和0。 #include<bits/stdc.h> using namespace std; const int N…

Matlab使用点云工具箱进行点云配准ICP\NDT\CPD

一、代码 主代码main.m&#xff0c;三种配准方法任选其一 % 读取点云文件 source_pc pcread(bun_zipper.ply); target_pc pcread(bun_zipper2.ply);% 下采样 ptCloudA point_downsample(source_pc); ptCloudB point_downsample(target_pc);% 配准参数设置 opt param_set…

书生·浦语大模型第三课作业

基础作业&#xff1a; 复现课程知识库助手搭建过程 (截图) 进阶作业&#xff1a; 选择一个垂直领域&#xff0c;收集该领域的专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并在 OpenXLab 上成功部署&#xff08;截图&#xff0c;并提供应用地址&#x…

车载自动化项目:Python

1. 自动化测试用的什么框架&#xff1f; 第一种&#xff1a;PythonSeleniumuittest框架 首先是拿到需求文档&#xff0c;基于这个需求去进行搭建。 用pytestrequestallure 这些第三方库进行编写自动化脚本。 举个例子一般的话整个的一个自动化的搭建是分为6层嘛&#xff1a…

【C语言】深入理解指针

目录 1.字符指针 2.指针数组 3.数组指针 4.数组传参与指针传参 一维数组传参 二维数组传参 一级指针传参 二级指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针&#xff08;了解即可&#xff09; 8.回调函数 回调函数的应用&#xff1a;库函数qsort …

Adb显示第3方应用的包名原理

Android早期版本实现原理请看 Android源码分析-pm命令的实现&#xff0c;列出包名pm list package&#xff0c;列出系统库pm list libraries_pm list packages-CSDN博客 Android12 对adb shell pm 实现原理做了重构&#xff1a;改成了template模式PackageManagerShellCommand …

【C生万物】数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

OJ_浮点数加法(高精度运算)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<map> #include<string> using namespace std;string GetInteger(string a) {return a.substr(0, a.find(.)); }string GetFraction(string a) {return a.substr(a.find(.) 1 ,a.siz…

【webpack】技巧使用

webpack和TypeScript 安装webpack相关内容安装TS相关内容配置初始化数据初始化运行展示和目录展示报错解决&#xff08;缺失文件配置&#xff09; 安装前端必备神奇lodash测试一下entry配置index.html模板配置修改打包出来的index.html的titleinject注入chunks 属性多页面配置 …

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…

springboot174基于springboot的疾病防控综合系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

vscode wsl远程连接 权限问题

问题描述&#xff1a;执行命令时遇到Operation not permitted 和 Permission denied问题&#xff0c;是有关ip地址和创建文件的权限问题&#xff0c;参考网络上更改wsl.conf文件等方法均无法解决&#xff0c;只能加sudo来解决

【MySQL进阶之路】磁盘随机读写和顺序读写对MySQL性能的影响

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

前后端通讯:前端调用后端接口的五种方式,优劣势和场景

Hi&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…

解析十六进制雷达数据格式:解析雷达数据长度。

以Cat62格式雷达数据为例&#xff0c;十六进制雷达数据部分代码&#xff1a; 3e0120bf7da4ffee0085 雷达数据长度使用4个字符&#xff08;2个字节&#xff09;标识&#xff0c;在这里是“0120”&#xff0c;转换为十进制数为288。 雷达数据长度父类&#xff1a; base_length_…

python 基础知识点(蓝桥杯python科目个人复习计划35)

今日复习计划&#xff1a;阶段总结&#xff08;新年贺礼&#xff09; 1.python简介&#xff08;定义&#xff0c;优点&#xff0c;缺点&#xff0c;应用领域&#xff09; python&#xff1a;一种广泛使用的解释型&#xff0c;高级和通用的编程语言 python极简&#xff0c;生…