STM32 F103C8T6学习笔记13:IIC通信—AHT10温湿度传感器模块
今日学习一下这款AHT10 温湿度传感器模块,给我的OLED手环添加上测温湿度的功能。
文章提供源码、测试工程下载、测试效果图。
目录
AHT10温湿度传感器:
特性:
连接方式:
适用场所范围:
程序设计:
设计目标:
程序设计注意点:
AHT10代码:
主函数代码:
测试效果:
完整工程下载:
AHT10温湿度传感器:
下图为AHT温湿度传感器模块,它长这样,这里的介绍不重要,了解就行,快速浏览即可:
AHT10,新一代温湿度传感器在尺寸与智能方面建立了新的标准:
它嵌入了适于回流焊的双列扁平无引脚SMD封装,底面4x5mm,高度1.6mm。
传感器偷出经过标定的数字信号,标准I2C格式。AHT10配有一个全新设计的ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其性能己经大大提升甚至超出了前一代传感器的可靠性水平,一代温湿度传感器,经过改进使其在恶劣环境下的性能更稳定。
特性:
1.模块尺寸: 16*11mm
2.接口类型: I2C
3.工作电压: 1.8-6.0V
4.接口尺寸: 4*2.54mm间距
5.湿度精度: 典型 士 2%
6.湿度分辨率:0.024%
7.温度精度: 典型 土 0.3C
8.温度分辨率:典型0.01C
9.工作温度: -40°C--85C
连接方式:
适用场所范围:
- 暖通空调 、除湿器
- 检测设备
- 自动控制、数据记录器
- 气象站、家电
- 医疗及其他相关湿度检测控制。
程序设计:
设计目标:
1.使用IIC通信初始化和读取AHT10传感器的温湿度信息,并通过OLED打印
2.IIC通信引脚:PB3(SCL) PB4(SDA)
3.使用定时器2,周期性读取AHT10的温湿度信息(300ms为周期)
程序设计注意点:
1.上电启动传感器,启动后需要先等待40ms(设备才开始正常工作),然后发送
0x71
来获取状态字节2.获取到校准使能位后,查看其是否已校准,若已校准则跳过当前步骤;若未校准则发送
0xe1
,进行初始化,然后发送0x08
,0x00
;3.接着开始触发测量,测量先发送
0xac
,然后发送0x33
,0x00
;4.测量命令发送完成后,需要等待80ms,用于温湿度的测量;之后再发送命令
0x71
,以读取状态寄存器是否处于空闲状态(bit7 => idle
);若是空闲状态,可以直接读取之后六个字节的温湿度数值;
5.相对湿度和温度转换公式:
接受的处理是使用char类型的数组 去接受每个读取到的八位数据,然后根据运算公式计算:(1024*1024=2^20 ) ,( int )强制类型转换为int是为了不丢符号:
最后还有俩个函数,一个是检查,一个是复位的:
AHT10代码:
#include "AHT10.h"
/**
brief AHT10初始化函数
param NONE
return NONE
*/
void AHT10Init()
{//IIC_Init();GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOBA GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4); //PA4 输出高delay_ms(50);//延时50ms让传感器稳定I2C_Start();I2C_Send_Byte(AHT10_ADDRESS); //获取状态//初始化校准I2C_Send_Byte(0xe1); I2C_Send_Byte(0x08);I2C_Send_Byte(0x00);I2C_Stop(); delay_ms(50);//延时50ms让传感器稳定
}/**
brief 检查AHT10是否存在
param NONE
return 0存在 1不存在
*/
u8 AHT10Check(void)
{u8 ack=0;I2C_Start();I2C_Send_Byte(AHT10_ADDRESS);ack=I2C_Wait_Ack();I2C_Stop(); return ack;
}/**
brief AHT10软复位
param NONE
return NONE
*/
void AHT10Reset(void)
{I2C_Start();I2C_Send_Byte(AHT10_WRITE);I2C_Wait_Ack();I2C_Send_Byte(0xba);I2C_Wait_Ack();I2C_Stop();
}/**
brief 检查AHT10读温湿度数据
param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C
param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH
return 0 读数据正常 1读数据失败
*/
u8 AHT10ReadData(float *temperature,u8 *humidity)
{u8 ack;u32 SRH=0,ST=0;u8 databuff[6];I2C_Start();I2C_Send_Byte(AHT10_WRITE);I2C_Wait_Ack();I2C_Send_Byte(0xac);I2C_Wait_Ack();I2C_Send_Byte(0x33);I2C_Wait_Ack();I2C_Send_Byte(0x00);I2C_Wait_Ack();I2C_Stop(); delay_ms(80);//延时一会等待数据读出I2C_Start();I2C_Send_Byte(AHT10_READ);I2C_Wait_Ack();ack=I22C_Read_Byte(1);if((ack&0x40)==0){databuff[0]=I22C_Read_Byte(1);databuff[1]=I22C_Read_Byte(1);databuff[2]=I22C_Read_Byte(1);databuff[3]=I22C_Read_Byte(1);databuff[4]=I22C_Read_Byte(0);I2C_Stop();SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4);ST=((databuff[2]&0X0f)<<16)+(databuff[3]<<8)+(databuff[4]);*humidity=(int)(SRH*100.0/1024/1024+0.5);*temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50;return 0;}I2C_Stop(); return 1;
}//初始化IIC
void I22C_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4); //PB6,PB7 输出高
}
//产生IIC起始信号
void I2C_Start(void)
{SDA_OUT(); //sda线输出IIC_SDA=1; IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void I2C_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 I2C_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){I2C_Stop();return 1;}}IIC_SCL=0;//时钟输出0 return 0;
}
//产生ACK应答
void I2C_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//不产生ACK应答
void I2C_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void I2C_Send_Byte(u8 txd)
{ u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){ //IIC_SDA=(txd&0x80)>>7;if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0; delay_us(2);}
} //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 I22C_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++; delay_us(1); } if (!ack)I2C_NAck();//发送nACKelseI2C_Ack(); //发送ACK return receive;
}
#ifndef _AHT10_h_
#define _AHT10_h_#include "headfire.h"
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
//输出寄存器
#define GPIOA_ODR_Addr (GPIOA_BASE+12)//0x4001280C
#define GPIOB_ODR_Addr (GPIOB_BASE+12)//0x40010C0C
//输入寄存器
#define GPIOA_IDR_Addr (GPIOA_BASE+8)//0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8)//0x40010C08
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define PAin(n) BIT_ADDR (GPIOA_IDR_Addr,n)//输入#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)//输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)//输入#define SDA_IN() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=(u32)8<<16;}
#define SDA_OUT() {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=(u32)3<<16;}//IO操作函数
#define IIC_SCL PBout(3) //SCL
#define IIC_SDA PBout(4) //SDA
#define READ_SDA PBin(4) //输入SDA #define AHT10_ADDRESS 0x70
#define AHT10_WRITE 0x70
#define AHT10_READ 0x71/*****************函数声明******************/
extern void AHT10Init(void);
extern u8 AHT10Check(void);
extern void AHT10Reset(void);
extern u8 AHT10ReadData(float *temperature,u8 *humidity);//IIC所有操作函数
void I22C_Init(void); //初始化IIC的IO口
void I2C_Start(void); //发送IIC开始信号
void I2C_Stop(void); //发送IIC停止信号
void I2C_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 I2C_Wait_Ack(void); //IIC等待ACK信号
void I2C_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号void I2C_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 I2C_Read_One_Byte(u8 daddr,u8 addr);
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 I22C_Read_Byte(unsigned char ack);#endif
主函数代码:
#include "main.h"float temp;
u8 hum;
int humm,temper;
uint16_t AHT10_cnt,AHT10_flag;
char buf[30];int main(void)
{ init_ALL(); //初始化所有函数while(1){ if(AHT10_flag==1){AHT10_flag=0;AHT10ReadData(&temp,&hum);temper=temp*10;humm=hum;OLED_ShowCHinese(0,0,0); //打印中文“温”OLED_ShowCHinese(16,0,2); //打印中文“度”sprintf(buf,": %d.%d",temper/10,temper%10); OLED_ShowString(32,0,(u8 *)buf,16); OLED_ShowCHinese(0,2,1); //打印中文“湿”OLED_ShowCHinese(16,2,2); //打印中文“度”sprintf(buf,": %d ",humm); OLED_ShowString(32,2,(u8 *)buf,16); }}
}//初始化所有函数:
void init_ALL(void)
{SysTick_Init(72); //初始化滴答计时器Timer2_Init(); //初始化定时器2i2c_GPIO_Config(); //IIC初始化OLED_Init(); //初始化OLED屏幕OLED_Clear(); //清空屏幕数据AHT10Init(); //初始化温湿度传感器}//定时器2中断服务函数
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ if(++AHT10_cnt==30) //每300ms刷新一次温湿度数据{AHT10_cnt=0;AHT10_flag=1;}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中断寄存器标志位,用于退出中断}
}
测试效果:
完整工程下载:
https://download.csdn.net/download/qq_64257614/88248711?spm=1001.2014.3001.5503
相关文章:
STM32 F103C8T6学习笔记13:IIC通信—AHT10温湿度传感器模块
今日学习一下这款AHT10 温湿度传感器模块,给我的OLED手环添加上测温湿度的功能。 文章提供源码、测试工程下载、测试效果图。 目录 AHT10温湿度传感器: 特性: 连接方式: 适用场所范围: 程序设计: 设…...
QT基础使用:组件和代码关联(信号和槽)
自动关联 ui文件在设计环境下,能看到的组件可以使用鼠标右键选择“转到槽”就是开始组件和动作关联。 在自动关联这个过程中软件自动动作的部分 需要对前面头文件进行保存,才能使得声明的函数能够使用。为了方便,自动关联时先对所有文件…...
TCP最大连接数问题总结
最大TCP连接数量限制有:可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源,如图所示: 1、可用端口号限制 Q:一台主机可以有多少端口号?端口号与TCP连接?是否能修改&#x…...
【Docker】云原生利用Docker确保环境安全、部署的安全性、安全问题的主要表现和新兴技术产生
前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 云原生利用Docker确保环境安全、部署的…...
explain各个字段代表的意思
id:联表查询是每个表的读取顺序,数字越大越先被读取。相同就需要通过table字段判断select_type:查询类型或者是其他操作类型(PRIMARY、UNION、UNION RESULT等)table:正在访问哪个表partitions:匹…...
【已解决】Windows10 pip安装报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x98
环境:win10, Python3.9 在Pycharm安装YoloV5的依赖包时出现报错:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x98 出现 ‘gbk’ codec can’t decode… 的报错一般是因为读取文件出现编码问题导致没法读取文件,因此可以在报错…...
goland 中的调试器 -- Evaluate
今天一个好朋友 找到我,问我关于goland中Evaluate 小计算器的使用方式,说实话,我在此之前也没用过这个东西,然后我就找一些相关文档,但是这类文档少的可怜,所以我就稍微研究一下,找找材料&#…...
你知道公司内部维基到底有哪些功能吗
维基指的是一种协作工作的平台,也就是开源的编辑系统。员工可以在企业维基里面进行存储、共享和协作之类的操作,将企业内部员工的知识共享聚集在一起。今天looklook将会详细讲讲公司内部维基具体到底有哪些功能,供大家参考。 公司内部维基的功…...
netdata监控服务器主机(包括Docker容器)
效果 Docker部署 创建挂载目录 mkdir -p /data/netdata/{netdatacache,netdatalib}docker运行 docker run -d --namenetdata \-p 19999:19999 \-v /data/netdata/netdatalib:/var/lib/netdata \-v /data/netdata/netdatacache:/var/cache/netdata \-v /etc/passwd:/host/etc…...
Mybatis学习|第一个Mybatis程序
1.创建一个数据库以及一个用户表,并插入三条数据用来测试 2.创建一个空的maven项目 在pom.xml中导入本次测试用到的三个依赖,mysql驱动、mybatis依赖、以及单元测试junit依赖 将这个 空的maven项目当成一个父项目,再创建一个空的maven子项目用…...
计算机网络MTU和MSS的区别
在计算机网络中,MTU代表最大传输单元(Maximum Transmission Unit),而MSS代表最大分节大小(Maximum Segment Size)。 1.MTU(最大传输单元): MTU是指在网络通信中&#x…...
redis学习笔记 - 进阶部分
文章目录 redis单线程如何处理并发的客户端,以及为何单线程快?redis的发展历程:redis单线程和多线程的体现:redis3.x单线程时代但性能很快的主要原因:redis4.x开始引入多线程:redis6/redis7引入多线程IO&am…...
SE5 - BM1684 人工智能边缘开发板入门指南 -- 模型转换、交叉编译、yolov5、目标追踪
介绍 我们属于SoC模式,即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译,部署时将编译好的程序拷贝至SoC平台(1684开发板/SE微服务器/SM模组)中执行。 注:以下都是在Ubuntu20.04系统上操…...
基于Java+SpringBoot+vue前后端分离英语知识应用网站设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
vue使用vue-router报错
报错1. app.js:172 Uncaught TypeError: vue_router__WEBPACK_IMPORTED_MODULE_0__.default is not a constructor at eval (index.js:4:1) at ./src/router/index.js (app.js:108:1) at webpack_require (app.js:169:33) at fn (app.js:442:21) at eval (main.js:7:71) at ./…...
编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。
环境: CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下: (1)基于centos基础镜像; (2)指定作者信息; (3)安装nginx服务,将提供的dest目录…...
js 类、原型及class
js 一直允许定义类。ES6新增了相关语法(包括class关键字)让创建类更容易。新语法创建的类和老式的类原理相同。js 的类和基于原型的继承机制与Java等语言中的类和继承机制有着本质区别。 1 类和原型 类意味着一组对象从同一个原型对象继承属性。因此,原型对象是…...
day-30 代码随想录算法训练营 回溯part06
332.重新安排行程 思路:使用unordered_map记录起点机场对应到达机场,内部使用map记录到达机场的次数(因为map会进行排序,可以求出最小路径) class Solution { public:vector<string>res;unordered_map<stri…...
txt、pcd、las、ply 格式点云基本的读写和显示 (附 python c++ 代码)
一、文本(txt) 1.1、存储结构 使用文本格式存储的点云数据文件结构比较简单,每个点是一行记录,点的信息存储格式为 x y z或者 x y z r g b。 1.2、读取 读取文本格式的点云数据时,可以按照一般的文本读取方法,这里记录一下如何使用open3d读取txt格式的点云数据 impo…...
k8s节点pod驱逐、污点标记
一、设置污点,禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后,可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…...
【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手
文章目录 4.17 TCP三次握手4.18滑动窗口4.19TCP四次挥手 4.17 TCP三次握手 TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息ÿ…...
茶叶小笔记
文章目录 茶叶的作用茶叶的主要成分茶多酚氨基酸(蛋白质)生物碱 茶叶的分类乌龙茶铁观音(安溪) 绿茶龙井(西湖)龙井43 绿茶(日照)毛尖(信阳毛尖)太平猴魁六安瓜片 红茶金骏眉大红袍 白茶云南白茶 黄茶黑茶花草茶 茶叶的形状过期茶的利用茶叶蛋大排档泡澡泡脚除湿除臭 茶渣的利用…...
安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计WebPack打包器第三方库JQuery安装使用安全检测
文章内容 环境搭建-NodeJS-解析安装&库安装安全问题-NodeJS-注入&RCE&原型链案例分析-NodeJS-CTF题目&源码审计打包器-WebPack-使用&安全第三方库-JQuery-使用&安全 环境搭建-NodeJS-解析安装&库安装 Node.js是运行在服务端的JavaScript 文档参考…...
Android JNI系列详解之CMake编译工具的使用
一、CMake工具的介绍 如图所示,CMake工具的主要作用是,将C/C编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件:CM…...
springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题
一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 Configuration public class JacksonConfig {public static final String LOCAL_TIME_PATTERN "HH:mm:ss";public static final String LOCAL_DATE…...
LeetCode 面试题 02.03. 删除中间节点
文章目录 一、题目二、C# 题解 一、题目 若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如&#x…...
Redis知识点总结
概述 Redis诞生于2009年,全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联:主要指的是表中没有主外键等概念 Redis是一款内存数据库,主要存储键值对类型的数据 基本用法 注意:该操作是在cli中进行的 键名…...
(四)k8s实战-服务发现
一、Service 1、配置文件 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCPport: 80 # service 自己的…...
AxureRP制作静态站点发布互联网,内网穿透实现公网访问
AxureRP制作静态站点发布互联网,内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网,内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…...
[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)
目录 题目:在数组中找第K大的元素解法1:维护长度为k的最小堆,遍历n-k个元素,逐一和堆顶值对比后,和堆顶交换,最后返回堆顶复杂度:时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…...
邢台集团网站建设报价/如何做营销
题目:编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输入,最多输入三次。三次均错,则提示退出程序 public static void main(String[] args) {Scanner scannern…...
广告设计公司怎么找业务/seo经验
今天准备干什么: 今天准备小组成员在一起讨论第二次冲刺阶段的详细任务 遇到困难没有: 任务分析不清楚,对任务的内容存在疑问。 转载于:https://www.cnblogs.com/ziyixuedie/p/7019761.html...
苏州商城网站制作/手机优化软件哪个好
点击上方蓝色文字关注公众号在前面一章已经介绍了如何创建应用,下面开始讲解如何给硬件应用设置通信方式。目前有两种方式可供选择,分别是蓝牙和MQTT,本章介绍蓝牙对接。1准备工作由于微信小程序官方对蓝牙设备的限制,只能使用低功…...
企业网站建设商城/云南网站seo服务
Go 时间戳 程序的一个通常需求是计算从Unix起始时间开始到某个时刻的秒数,毫秒数,微秒数等。 我们来看看Go里面是怎么做的。package main import "fmt" import "time" func main() { // 使用Unix和UnixNano来分别获取从Unix起始时间…...
苏州网站建设哪个比较牛/爱站网
互斥量和信号量的区别 1. 互斥量用于线程的互斥,信号量用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访…...
宁波有做网站的地方吗/seo优化收费
一、JVM的安装和配置 一、下载JDK1.8的安装包 二、将JDK1.8的安装包复制到/opt/目录下 三、解压JDK1.8的安装包 tar zxvf jdk-8u65-linux-x64.tar.gz四、更改JDK1.8的文件夹名称 mv jdk1.8.0_65 jdk五、删除JDK1.8的安装包 rm -rf jdk-8u65-linux-x64.tar.gz六、配置JDK的…...