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

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

    • 前言
    • 预备知识
    • 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://xiahunao.cn/news/2777916.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《乱弹篇(十二)聊春晚》

龙年大初一&#xff0c;老龄笔者发表《乱弹篇&#xff08;十二&#xff09;》。“十二”的标志&#xff0c;乃好事成双“二”。喜庆有余&#xff0c;自不待言&#xff01; 除夕夜我没有看春晚&#xff0c;是在继续追剧&#xff0c;即以明朝宫廷内斗为背景的电视连续剧《后宫》…

2024年应该关注的十大人工智能创新

人工智能&#xff08;AI&#xff09;不再只是一个流行词&#xff0c;它已成为我们日常生活的重要组成部分。人工智能在去年深入地融入我们社会的各个方面&#xff0c;改变我们的生活方式、工作方式以及与技术互动的方式。 今年是大年初一&#xff0c;我们将探讨2024年可能出现…

Python实战:用Python程序实现春晚刘谦魔术

刘谦春晚魔术是一个让人叹为观止的魔术表演&#xff0c;其中涉及到了数学、编程和创意的结合。看了春晚魔术的朋友们&#xff0c;是不是好奇春晚刘谦的魔术是怎么变的。 在这篇文章中&#xff0c;我们将通过 Python 程序实现春晚刘谦魔术&#xff0c;让读者对这个魔术有更深入…

Talk|香港科技大学苟耘豪:MoCLE - 指令聚类MoE+通用专家解决多模态大模型任务冲突

本期为TechBeat人工智能社区第571期线上Talk。 北京时间2月8日(周四)20:00&#xff0c;香港科技大学博士生—苟耘豪的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “MoCLE - 指令聚类MoE通用专家解决多模态大模型任务冲突”&#xff0c;系统地介绍…

SAP-PS-02-003跨系统/Client请求传输和请求副本的创建

前言 某公司SAP服务器架构如下&#xff08;举例&#xff09;&#xff0c;一般进行SAP项目实施基本会遵循以下的系统和Client准则&#xff0c;那在不同系统和Client要如何进行请求传输呢 服务器 Client 作用 要求 DEV 100 业务顾问进行系统配置 所有配置均在该Client进行…

面向工业 X.0 的工业网络简述

此图片来源于网络 1、背景 工业4.0是在21世纪初提出的&#xff0c;特别是在2013年&#xff0c;德国政府正式推出了“工业4.0”战略&#xff0c;旨在通过利用物联网&#xff08;IoT&#xff09;等先进技术提高工业的竞争力。因此&#xff0c;我们可以认为工业4.0的实现时间大致…

【C++跬步积累】—— 构造函数+析构函数

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;C跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; 每日反刍 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】问题 1【10 分】:问题 2【10 分】:各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不…

Acwing---837. 连通块中点的数量

连通块中点的数量 1.题目2.基本思想3.代码实现 1.题目 给定一个包含 n n n个点&#xff08;编号为 1 ∼ n 1∼n 1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m m m 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 a 和点 b …

python从入门到精通(十):python常见标准库的使用

python数据分析和可视化基础 &#xff08;一&#xff09;Python 中处理日期和时间的模块time导入time模块time获取当前时间戳localtime获取当前时间struct_timeasctime获取格式化的时间ctime获取格式化的时间gmtime获取格式化的时间计时器功能strftime格式化日期strptime格式化…

python巧用定理判断素数

目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的素因子一个大于根号n的自然数&#xff0c;另一个与其对应的因子则必小于根号n。 3、除了2和3以…

fast.ai 机器学习笔记(二)

机器学习 1&#xff1a;第 5 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续更…

企业飞书应用机器人,使用python自动发送文字内容到群消息

文章目录 创建企业应用与开通机器人飞书发送信息的工具函数 创建企业应用与开通机器人 需要先创建应用&#xff0c;然后进入应用后&#xff0c;点击添加应用能力创建机器人&#xff1a; 参考官方文档&#xff0c;获取两个参数&#xff1a;app_id与app_secret 官方说明文档&…

低代码市场的未来展望:趋势、机遇与挑战

根据 Zoho 的一项新研究&#xff0c;低代码市场正处于成为主流的风口浪尖。该报告对全球 800 多名 IT 和业务领导者进行了调查&#xff0c;确定了推动其采用的几个因素。其中最重要的是提高应用程序的开发速度。 这一发现对企业领导者来说应该不足为奇。 客户、合作伙伴和员工…

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

4核8g服务器能访问多少人?2024年测评

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

C++数据类型、变量常量

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家新年快乐&#xff0c;今天我们来学习C的数据类型&#xff0c;变量常量。 文章目录 1.数据类型的概念与思想 1.1基本数据类型 1.2复合数据类型 1.3类型修饰符 1.4类型转换 1.4.1static_cast 1.4.2…

【射影几何15】python双曲几何工具geometry_tools

目录 一、说明二、​环境问题&#xff1a;如何安装三、实现一个简单的例子四、绘制双曲组五、使用有限状态自动机加快速度六、资源和代码 一、说明 Geometry_tools 是一个 Python 包&#xff0c;旨在帮助您处理和可视化双曲空间和射影空间上的群动作。 该包主要构建在 numpy、…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题&#xff1a;Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者&#xff1a;Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【综述】2024 [arXiv] 通用时间序列表示学习

论文标题&#xff1a;Universal Time-Series Representation Learning: A Survey 链接&#xff1a;https://arxiv.org/abs/2401.03717 作者&#xff1a;Patara Trirat, Yooju Shin, Junhyeok Kang, Youngeun Nam, Jihye Na, Minyoung Bae, Joeun Kim, Byunghyun Kim, Jae-Gil…