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

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

    • 前言
    • 预备知识
    • 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;
	//打开定时器1
	TR1   = 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=1
		RW = 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) 延时 15ms
	Delay15ms();
//(2) 写指令 38H(不检测忙信号)
	writeCmd(0x38);
//(3) 延时 5ms
	Delay5ms();
//(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,那么延时30ms
	Delay30ms();
	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.0592MHz


void Delay5ms();		//@11.0592MHz


void Delay30ms();		//@11.0592MHz


void Delay40us();		//@11.0592MHz


void 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.mfbz.cn/a/382072.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git版本回退。git reset参数详解,特殊提交情形下的git push操作(CR等常见场景),git reflog和git log的详解。

切换分支可以使用 git checkout <> 或者git switch ... 创建分支可以使用 git checkout -b <. ...> 或 git branch <...> git checkout <...> git reset --hrad HEAD^ -- 今日份chatgpt git reset --hard HEAD^ 的含义如下&#xff1a; git reset …

HiveSQL——sum(if()) 条件累加

注&#xff1a;参考文章&#xff1a; HiveSql面试题10--sum(if)统计问题_hive sum if-CSDN博客文章浏览阅读5.8k次&#xff0c;点赞6次&#xff0c;收藏19次。0 需求分析t_order表结构字段名含义oid订单编号uid用户idotime订单时间&#xff08;yyyy-MM-dd&#xff09;oamount订…

学习Android的第六天

目录 Android TextView 文本框 TextView 基础属性 范例 带阴影的TextView 范例 带边框的TextView 范例 带图片(drawableXxx)的TextView 范例1 范例2 使用autoLink属性识别链接类型 范例 TextView 显示简单的 HTML 范例1 范例2 SpannableString & Spannable…

【数据结构】链表OJ面试题5(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

随机MM引流源码PHP开源版

引流源码最新随机MM开源版PHP源码&#xff0c;非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间

《剑指 Offer》专项突破版 - 面试题 38、39 和 40 : 通过三道面试题详解单调栈(C++ 实现)

目录 面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 方法一、暴力求解 方法二、递归求解 方法三、单调栈法 面试题 40 : 矩阵中的最大矩形 面试题 38 : 每日温度 题目&#xff1a; 输入一个数组&#xff0c;它的每个数字是某天的温度。请计算每天需要等几天才会…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发&#xff0c;在数据库的选择上面&#xff0c;选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5…

tkinter-TinUI-xml实战(10)展示画廊

tkinter-TinUI-xml实战&#xff08;10&#xff09;展示画廊 引言声明文件结构核心代码主界面统一展示控件控件展示界面单一展示已有展示多类展示 最终效果在这里插入图片描述 ![](https://img-blog.csdnimg.cn/direct/286fcaa2fa5648a992a0ac79b4efad82.png) ………… 结语 引言…

大数据Flume--入门

文章目录 FlumeFlume 定义Flume 基础架构AgentSourceSinkChannelEvent Flume 安装部署安装地址安装部署 Flume 入门案例监控端口数据官方案例实时监控单个追加文件实时监控目录下多个新文件实时监控目录下的多个追加文件 Flume Flume 定义 Flume 是 Cloudera 提供的一个高可用…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

视觉开发板—K210自学笔记(三)

本期我们来遵循其他单片机的学习路线开始去做一位点灯大师—点亮一个LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看上一节的文档&#xff0c;看看开发板原理图到底是哪个LED跟哪个IO连在一起。 一、硬件电路 根据之前官方提供的assembly draw…

最简单的基于 FFmpeg 的音频编码器(PCM 编码为 AAC)

最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09; 最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09;正文结果工程文件下载其他参考链接 最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09; 参考雷霄骅…

【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

Java:常用API接上篇 --黑马笔记

一、 StringBuilder类 StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a;StringBuilder比String更合适做字符串的修改操作&#xff0c;效率更高&#xff0c;代码也更…

例36:打开文件读出文件内容

1.建立一个EXE工程&#xff0c;在主窗体上放一个按钮&#xff0c;如图32。 图32 在按钮的单击事件中输入代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)Dim s as StringDim 文件 As CWSTR FF_OpenFileDialog(hWndForm,_"打开…

微信自动预约小程序开发指南:从小白到专家

在数字化时代&#xff0c;预约小程序已成为各类服务行业的必备工具。本文将指导你从零开始&#xff0c;通过第三方小程序制作平台&#xff0c;顺利开发出一款具有预约功能的实用小程序。 第一步&#xff1a;注册登录第三方小程序制作平台 首先&#xff0c;你需要选择一个适合你…

案例:三台主机实现 级联复制

介绍&#xff1a;级联复制架构 级联复制架构 是一种特殊的主从结构&#xff0c;之前聊到的几种主从结构都只有两层&#xff0c;但级联复制架构中会有三层&#xff0c;关系如下&#xff1a; 也就是在级联复制架构中&#xff0c;存在两层从库&#xff0c;这实际上属于一主多从架…

Hive-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点 三、架构图1.UI交互层2.Driver驱动层3.Compiler4.Metastore5.Execution Engine 四、执行流程1.发起请求2.获取执行计划3.获取元数据4.返回元数据5.返回执行计划6.运行执行计划7.运行结果获取 五、数据模型1.DataBase数据库2.T…