基于stm32f103的SHT30温湿度显示- O3 Y( n- ~% t. u; B
本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验$ r+ i' @+ H+ s: [) Y
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)
8 g) Y8 e. p ]8 r
/ w6 W; I a) m" F5 {, D- Q一、硬件材料
- c' N& u) e/ @% J/ q2 @% L, ]
7 D: u; G( G2 T7 n" ^7 {) Y( C! Z4 j+ {
1.stm32f10c8t6
1 u+ U, M2 t7 U5 w) |
+ {( p+ X4 A. g7 j- \+ x
* T- j# h! s' g/ U+ |2 M4 m0 B3 S$ J' V+ s% y# K( ?
2.sht30温湿度传感器" Y% k- H1 S; | `; s3 t. {+ `) c7 H
) f/ ^3 @! a `& M- m3 E& v" v/ I
+ w& V$ Y6 P# V& }
2 p% A# x& u2 s9 s
3.TFT(3.5)寸屏1 l' @ C9 ?( F+ L! I2 M1 Q
( [. n1 x' f# o ]5 v8 l/ g
. J% \* g* Z8 Z r! _5 C% a. l% A T K; h' v+ j8 m
二、SHT30介绍: e+ d* g4 [1 G3 _; W9 U
) \$ f* I P7 vsht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。
' @: L% B& K, W$ g5 c6 |4 x5 T
9 G ` _7 u$ B+ b5 ]4 q0 isht30.h
. N5 ^ F+ L* u# I) h: _* }
& |1 j2 b/ y( A! t9 [2 F- w- #ifndef _SH30_H3 t( K; |( @" I5 U5 E' S
- #define _SH30_H1 `/ T. f# _* o4 ]
$ C0 M3 P2 R6 ~, W* M- #include "delay.h"+ e& @. W& K I- F3 W1 ~3 T8 ^
- #include "sys.h"2 x4 G' y% p1 ?
- #include "stdio.h"
; |- |" d% k8 u - #include "usart.h"$ h( B6 M0 L) w/ Q) d2 b1 |& I
- #include "string.h"
& T2 V' {0 R+ s/ V
# {: k* ]2 |1 `( [- q, x- extern u8 humiture_buff1[20];
# w6 g( m9 x1 ~* y: m* N6 T, R
- @& d C- X0 U* V$ {, }4 k- void SHT30_Init(void);1 C% ?8 l7 u5 L+ N! C0 M: c
- void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误, M2 @" p. ^. D( J
- void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成
) u. n, [1 j; }" f - u8 IIC_wait_ACK(void);//等待接收确认字符
8 K7 S. p. D' R2 ~- `6 w$ N - void IIC_Start(void);//等待IIC传输数据开始
9 G+ U' B l- M0 _7 q' Z+ R - void IIC_Stop(void);//IIC传输数据停止
/ j1 I7 l" M- ~* f6 o8 |- h8 \) Z9 r - void IIC_SendByte(u8 byte);//IIC发送数据
! ]9 V5 f/ o2 n1 J8 Q - u8 IIC_RcvByte(void);//IIC接收数据
8 n `( y6 T+ i. H - void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
: D2 H1 @2 U) W3 a - #endif
复制代码 ! e J' k4 ?) {
sht30.c
/ c3 [( H5 A {& h
2 G5 O# X) s. i; |6 F6 w* U- /*5 M1 f" E9 H2 h4 J
- 设定温度阈值范围:-20℃——125℃3 j4 k& s$ S% [0 f) l; H4 J7 E. P
- 设定相对湿度范围:0%——100%
+ E5 M: w+ {8 m4 V7 A$ C8 ] - */0 I" W3 R5 P1 |7 G9 o
- #include"stm32f10x.h"
# N, k( R- l U8 p. D0 K - #include"sh30.h"+ J- h# _. U* \; k& e: G8 ?% O# _
- #include"stdio.h"3 s% r& q; U2 {4 t; w
2 P/ @: s; L9 j, Y3 x* c$ T2 J- #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
) w% U/ x8 t" X7 q! E$ S - #define read 1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令
* h+ V1 G! u. t$ G" A. c0 @ - * ~* {; U) Z7 ?- O/ h) z( \
- //IIC总线接口定义
! J2 r3 v( p1 i* v% D - #define SCL PBout(6)//设置时钟端口$ e5 u6 F! ~2 Z8 a N8 f, R" Y
- //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
& j+ {5 ~( w* i: l% L1 e3 X6 J) J - #define SDA_OUT PBout(7)//设置输出数据端口
( ]% Y% }6 R2 C5 F, t: n - #define SDA_IN PBin(7)//设置输入数据端口
, U* q: I, k$ C, l - //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置18 E! w1 V8 b; Z# ]8 P$ Q+ ?5 H) O
- #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
- E# R G% I& ^1 u2 r3 n - #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
4 F, L# L$ s% z5 ?6 _ - //#define IIC_INPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
! `" R: p# S2 ~ - //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出
) v/ ~4 G1 f' X
7 n8 [9 q9 c7 }8 E5 n+ T; R- //定义温湿度存储变量 ^! O! ^- {; }4 h. z3 H" D
- u8 humiture_buff1[20];
" \: p. A0 V0 M9 m' v4 n
' i( t4 H2 e2 U- float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
2 I* V0 f9 ^& e# e! ~8 v- P& p - float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0
" r* }6 D) c" \1 S8 s6 s' L - : M% ^# }* W! x8 N
- void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
9 n4 q, V# s+ k7 T4 A5 Z - {
! C4 a/ x9 H3 l3 }# B: f. _3 U! \ - GPIO_InitTypeDef GPIO_InitStructure;
: z& x6 V1 [6 f - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
( U+ j; L8 v8 Y& s1 g- a5 G+ T& e8 L - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
" q' B- ?- q H: {! I% u - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
9 v- N; P: Q% d) c8 r - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& ?3 F |4 t& }$ B - GPIO_Init(GPIOB, &GPIO_InitStructure);. G7 {1 V! h2 Y k2 X
- SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
! q0 Q1 N7 p9 X8 {( z$ A - SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
. R) }/ h( r* z - }
- D. y# L# c5 `: N; Y - //主机发送确认字符ACK5 f8 o5 a5 w+ C* ~! O8 D
- void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
4 V+ s4 o% d& Z3 i* ` - {; h5 g! q7 h9 \
- IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式% f" I: y4 _1 o, W6 w
- SCL=0;
) J6 u: x+ W: Z& f' W1 k# K( C - delay_us(2); ! ^& f# B* b D; F
- SDA_OUT=0;( g6 u, W% a1 w' G2 A. s! U
- delay_us(2);
& o5 w$ Z" o" f) x% t - SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机4 t- H' R6 G- a( ?+ E/ O
- delay_us(2); ; n& ~" K3 S- l2 e0 u. T
- SCL=0;//数据接收完成,主机发送ACK
7 c' R: k7 V# F @, o: L - delay_us(1);
1 v( u0 E& W2 E& h! L - }& K3 W' G5 o1 _0 E: i
- //主机不发送确认字符ACK
. ^3 _/ ^( [; f; \' Z - void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
" k. }7 H# ~) z1 } - {1 w# T, G% Z. ]7 U
- IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式( R+ l3 ^; V# Q/ Z6 f! G Y
- SCL=0;
( N- J* E8 A! A - delay_us(2); ! Z% `8 i2 J3 x2 ^6 \
- SDA_OUT=1;
- f& I# F4 |. G - delay_us(2);
1 R" Z* U: V( V - SCL=1;0 Q2 q. R" a+ |$ D( R
- delay_us(2);
. R1 \& h) h+ @7 L/ p c% _. t1 e$ o0 W - SCL=0; 4 d4 X% P- M* } j3 R4 u' M
- delay_us(1); % X1 z" c; c; b5 M
- }1 W, E4 D v$ ?2 u5 C0 Z0 v
- //主机等待从机的确认字符ACK% T2 z; _1 R9 W+ i4 l* W6 N
- u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成
( |+ ?3 Q( X4 |1 J& R - {7 t% {# y5 f s6 l0 \
- u8 t = 200;
/ g. |. Y' U) n - IIC_OUTPUT_MODE_SET();
/ e. f" ^: p; J- ]. p0 \- F - SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 & R& |# \+ C H$ Q/ D" s; E+ O
- delay_us(1);
* |2 e+ m2 k v& w5 L. E1 i - SCL=0;
$ W) b( c* E. m4 N- q - delay_us(1); . H( t2 C" `" b/ m8 v9 K7 H& E
- IIC_INPUT_MODE_SET();- Z4 ?" P* N k6 b; u$ q% D
- delay_us(1);
& I, e* U, f, i. r/ l - while(SDA_IN)//等待SHT30应答7 y$ u) Z8 Y8 Z" J) {. v: E, P. [
- {- I' [& j8 W$ F: [. m; L3 s
- t--;- x4 Z8 r# @. i. K2 `
- delay_us(1); 6 Y# W: {) a' H* |: W1 E* y- H
- if(t==0)
) `- N: N7 }: |9 s* u - {4 S2 u7 K+ T1 h. `1 R# K, n$ D
- SCL=0;
' d8 l' c1 p1 u5 S - return 1;
/ O4 N8 f7 S- ^ h+ a4 r - }
/ E8 U/ n* q7 w" w - delay_us(1);
2 u5 E# z [/ X, [0 i8 {9 o, s k - }, `% ^8 v0 {# e# s7 i0 q1 z+ ]
- delay_us(1);
O7 y7 r: f8 e/ f - SCL=1;0 A, V, P' x! \* m% j D
- delay_us(1);4 M* x. U9 a2 n$ }3 Q$ E. l
- SCL=0;
1 l# w" B8 {5 Z( c7 p }% `# R* y - delay_us(1);
! u4 e5 K" u1 u! K; y - return 0;
/ `9 A y. R; y; T# _ - }( H" r" G" j2 [
- //启动IIC总线进行通讯,发送IIC通讯的起始条件
6 j* S" v/ u1 q3 O" w2 w - void IIC_Start(void)//启动IIC通讯* ~% @" c3 ~# z6 G2 G
- {
8 g& Y$ X& u$ x1 K6 D; ^8 z - IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出
7 O! H9 X; w; l- W" t - SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平* k3 ` ?6 C3 B8 H8 D. p G
- SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平2 V! x( R H! e/ k, d
- delay_us(4);//延时4us,给硬件一个反应时间4 l M+ \/ e* M1 G" e! u
- SDA_OUT=0;//SDA引脚拉低,开始数据的传输, f: I) {" K& d8 U& A' E. C" C
- delay_us(4);
- K8 x+ i. r/ ^ - SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输
$ D7 L, `) E# [: y - }
6 I, B5 {6 _) ^# ?5 X
$ {/ H9 H% c4 g6 ?+ U" J- //结束IIC总线通讯,发送IIC通讯的结束条件
2 P; m6 X0 Q/ C( ]2 F - void IIC_Stop(void)
( R* q7 Q8 w. B0 T - {
+ R: e- _2 d/ V4 T& e - IIC_OUTPUT_MODE_SET();8 l, V8 p' p4 V) r1 E
- SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
: q. Z1 p" A% @ - SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态
; o, Q0 `* e- r; w - delay_us(4);
/ T# ^) {! q# h- x - SCL=1;//将时钟拉高,表示已经结束IIC通讯
7 {' \ R& V* \5 F; T- V8 _2 L7 T" B - delay_us(4);! a. e: [2 r' j% ~2 M4 ~3 T, p1 X2 M
- SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输
+ E# a D$ q; b3 t+ ?/ O4 J8 _ - delay_us(4);
% |3 E; O% K6 h - }" W; [1 `* x" o2 i% s+ s
* J. w3 ?: S. O; S/ {* z- //将byte数据发送出去0 a1 t% ]: @4 I! L' Z3 Z
- void IIC_SendByte(u8 byte)4 K$ C" C, r2 c( T! H
- {4 ]) a$ z3 I& j0 @ |& }
- u8 Count;
9 l7 C/ T1 e2 w: o. M - IIC_OUTPUT_MODE_SET();, [: K7 {% C( y4 \1 k0 h- r
- SCL=0;//将时钟拉低,开始数据的传输
1 V, u* I L; n Z - for(Count=0;Count<8;Count++)//要传送的数据长度为8位
6 {& }5 A H3 @ - {
" D& b& P( O5 }/ U) ?# k, |: n" B" B, ` - if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据" }, y& b" B1 _4 {* n
- else SDA_OUT=0; //判断发送位为0,则开始数据的发送9 j6 U% N' x3 s; F
- byte<<=1;
0 I2 F1 Y1 q4 p - delay_us(2); 0 b O" S& O3 W
- SCL=1;. R! r- ~6 G- S' u7 K$ j3 a
- delay_us(2);5 }% m, _/ {4 o' z$ w: r* O6 n
- SCL=0;# R* R* t, V# E) h5 H2 x
- delay_us(2);/ l4 o+ t- H' s
- }
/ H, `3 w3 t2 }6 q6 t3 r2 j/ G# c - }
" G( n4 K g; O5 i: ~0 M - . E _8 h6 f/ |1 J9 o, L& ?
- // 用来接收从器件传来的数据 9 v% Y" A5 A. t3 O4 `1 L, M
- u8 IIC_RcvByte(void): i( v3 }4 `3 q' X; B$ z
- {
# X0 o) o$ ]9 F0 y2 Q3 T' O - u8 retc;
- ]+ v0 k, b; F* x4 ? - u8 Count;
& H6 o/ ]8 ^) \6 x' \7 E - retc=0; . r5 n- x; e; J; o o* s7 H
- IIC_INPUT_MODE_SET();//配置数据线为输入方式0 F7 g" b/ Y" I
- delay_us(1);
; k W/ [% ^! C9 d( j) \: A - for(Count=0;Count<8;Count++)
% ]/ A1 k' R9 e - {
- g9 w1 ?3 {. ]9 U" j - SCL=0;//配置时钟线为低,准备接收数据位8 o" O$ I- ?0 R& u1 ^0 x* X6 q
- delay_us(2); 3 y' c1 L A2 v, i" x- e: P1 x6 X
- SCL=1;//配置时钟线为高使数据线上数据有效
7 x& t7 ~# \. M- ]' X0 \, s" C, G0 Q - retc=retc<<1;6 w w6 `7 f, _$ r$ y6 x. C/ b
- if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 4 {4 `, X* w# |1 a6 J
- delay_us(1);
& I4 G5 ]( j% V; K6 d; U9 J' h - }; z1 t4 N! y1 e
- SCL=0;
5 [: ?+ L7 N8 n o6 U! K3 g - return(retc);! o- ~& \' f8 y) Z0 C2 C
- }( H2 _4 T5 {) l; V8 |1 y
- //用来接收从器件采集并合成温湿度
, e1 }3 h% H# _ - void SHT30_read_result(u8 addr)
) G4 n& ?! r7 r" ~ V7 {; m x - {3 ^5 f! a8 j) B" J1 n4 t
- //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
) Q" |1 K4 _2 G3 n - u16 tem,hum;//定义存放温湿度计算公式的变量
. p9 t( D! O$ O - u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位
0 }& t4 H/ a' ?! c$ b) C; \ - ; Q" a+ O. [4 T, C# O; x
- //发送指令为0x2C06(默认)
. J; @ e9 a+ g7 L5 b8 a - IIC_Start();3 y l1 v3 K) E& q% [
- IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位
* `. Z5 s, M3 @8 ]3 Z - IIC_wait_ACK();" W) p4 {& V; g! V; v! ?
- // delay_us(1);
8 p* F. N; v+ D6 f `/ ]) H - IIC_SendByte(0x2C);//前半段发送指令为0x2C: ~: J* V( j! ]$ J
- IIC_wait_ACK();
4 d0 W _) n" M; i/ t( | - // delay_us(1);
4 B. H9 P' @0 J1 @! M3 l - IIC_SendByte(0x06);//后半段发送指令为0x06& l3 Y8 ^; x& x* X2 ^
- IIC_wait_ACK();
7 G; C4 C0 p9 |: v' N3 T, P5 P - // delay_us(1);) w2 M: j a8 a- m8 V
- IIC_Stop();
' M1 _1 W( [5 \9 a7 T* ~ l! p1 u - delay_ms(50);
9 b$ ^$ d8 b- Q" |; o# C J4 q! F3 n - IIC_Start();$ {/ t7 `) j9 m& X+ |5 @8 O
- IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位' F% t3 u( L- k4 u- l' A3 [6 [ P
- //SHT30返回的数值是6个元素的数组
; A9 Z2 E: s8 p+ y - if(IIC_wait_ACK()==0)
2 y9 I1 M K) W: M( @/ J - {
( |; I# b0 c# `/ Q+ P: j6 W, h - // delay_us(1);0 S0 G; }( ]' D- O# _- _" ]
- buff[0]=IIC_RcvByte();//返回温度高8位
7 y: B- G; Y* M' I. e+ S l - IIC_ACK();
$ J$ l6 j8 m% g8 t" l/ w - buff[1]=IIC_RcvByte();//返回温度低8位
" m x$ V6 K5 F: Y4 @; A, W - IIC_ACK();
, `! n8 L- a( M" X% d - buff[2]=IIC_RcvByte();//温度crc校验位
; e$ q/ b6 q9 m; e2 m5 P - IIC_ACK();; T1 G$ |3 h# b) M, C' M
- buff[3]=IIC_RcvByte();//返回湿度高8位
4 B$ I# ?3 O3 m; f W( g% w5 X X- ^ - IIC_ACK(); P8 ?& t( E' i! j- K
- buff[4]=IIC_RcvByte();//返回湿度低8位
% y5 z! j) P3 Z7 v - IIC_ACK();
& w: e$ y( F9 U2 o - buff[5]=IIC_RcvByte();//湿度crc校验位( ?7 J9 E, F8 u: N
- IIC_NACK();: _. H! l: g, B/ b+ D4 o
- IIC_Stop();5 j, ]; Q* q) g/ x1 y
- }' J' C( P ?2 Q- Q
- // tem = (buff[0]<<8) + buff[1];) O/ R& `' s, x4 T$ r7 \3 W
- // hum = (buff[3]<<8) + buff[4];
# S. b; B# e( t1 I6 e - tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接3 I. v0 Y# A" h6 C0 {- Q, N; u) ]
- hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接. f% ]# s7 b2 l+ X
- 5 @) e A$ ^: F9 F! d! o( j, F
- //查询SHT30数据手册可知,温湿度的计算方法如下 ' R* S/ A2 y, y- ?
- Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1) W# X/ {. ^) M: c& @& D
- Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)1 ~6 x% l! q0 t7 h$ d
- / C5 ^8 f Y7 L' [. e: m
- if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示) m8 G d& T+ p+ _ U9 n
- {
N3 t; E- J6 Z - //printf("温度:%6.2f℃\r\n",Temperature);& q, _3 w+ I0 V9 O5 R9 x
- //printf("湿度:%6.2f%%\r\n",Humidity);: Y4 A3 a; @' ~& |
- }
H9 n7 C: ~( d. s4 M/ t1 S; [, | - else
+ [- i4 a% r8 C6 f - {7 C. n4 }9 ?4 M7 `" _
- //printf("温湿度超过给定阈值!\r\n");
" n; R: T/ C: x8 k, I& y1 `; h o - }% ?+ w% [7 ^8 U4 Q6 y( P z/ t6 g
- hum=0;
B, P, l' r0 o# S9 _9 d - tem=0; ' n' H- t7 A* t7 B
- 1 c* {$ _; P" E. Y
- }
复制代码 , \6 T4 g- |6 o0 C' B- ^* g
下面这两句不明白的小伙伴,我另外一篇博文会专门介绍2 ~$ F/ U8 \; C5 O0 u8 e
& d, e$ ]9 Z) }4 P3 G& O) W- #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
y$ o! H: G4 W - #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码
2 h, D* |9 O w9 \# P三、主程序! W$ Z# {; i( O6 u
main.c
( q V4 \2 Y6 R9 K3 A! c7 ^: _$ s7 q$ g8 d, [" d. N% c% D$ n- E$ O
, U/ L& H+ t4 G0 |- /*------------------------TFT3.5接线--------------------------2 S1 P$ q: I/ |/ E* }# j
- 3 v* `. t' j$ x! x; W
- // GND 电源地% B" u: L/ F8 H8 p$ }- V
- // VCC 3.3v电源8 i6 ]( t8 k0 z% t1 D
- // SCL PA0(SCLK)
0 a* n7 ^3 ^- V9 d- ]& q; i - // SDA PA1(MOSI)
% _ C& @3 y( y" W Z" ^ - // RES PA27 m6 l% b! \6 c e
- // DC PA3
) z2 a& G( @1 i: ~+ b, p# I - // BLK PA4 控制背光
+ _/ m2 @* x: R5 L! i& M - // MISO PA5
1 r# p2 g, w( ], e - // CS1 PA6 1 m9 K+ G7 Z' t
- // CS2 PA7
8 V) l9 z( `0 n - ----------------------------------------------------------------*/% m; e- u+ E. r5 \9 {
& t0 |8 M. m! }- h/ M$ } x: X- #include "delay.h"
0 g7 G( s. U# s/ h - #include "sys.h"
, J# O* v: t& g, M. O; S* Y$ k - #include "led.h"
& ~) w, G* _, Z$ M; i - #include "lcd_init.h"& P; p) e* |; w! b
- #include "lcd.h"
; Y& t8 V, h( h4 k- I4 n - #include "pic.h"( M! r {% ^" K1 f: t2 w
- #include "usart.h"5 O8 v) D3 H1 T6 p
- #include "SH30.h"" W+ t. j* @+ C- q4 A- F
/ w9 }! w2 y$ H+ E( |' @
& [7 M5 G& r2 f- W3 G4 J- p- extern float Temperature;
8 `* ~0 i% u+ P5 d - extern float Humidity;# M$ ~. m/ n8 d" U1 A& j6 W
- + |8 F" s5 y4 z0 }! U# @$ w: W
- unsigned char buf[2][24] = {0};$ z$ B1 J7 V2 j, j: ~+ f, ~6 J# A
- 5 v2 e/ O" J9 J! c5 x7 y
- int main(void)
; U3 s7 S/ y7 e0 Z( ~ - {
9 U; p/ a4 x; {$ N" V B - u8 i,j;: u2 s" h& V2 B, j& A
- float t=0;2 g' X: u& t! ~ j8 G6 C
- LED_Init();//LED初始化& ~( Y6 h) `2 f2 `9 L+ L- ~
- LCD_Init();//LCD初始化
9 \8 h" Q3 |5 V$ h! f' u6 z - SHT30_Init();: b# P$ S# t& D# \
- uart_init(115200);
3 N) U' b5 M* Y - printf("SHT30初始化正常,已准备就绪!\r\n");
8 N4 x" O( d$ ~1 Y0 ~( Q/ [ - LCD_Fill(0,0,LCD_W,LCD_H,GREEN);% U5 D$ e. x- l( n" N* ?4 l9 j
. ~2 @1 @$ q' t- while(1)
! M3 c( T: V1 N! p0 Y - {
# O+ D# P5 ~" l% c6 R+ V - ; R) v* F9 H. a7 I7 x5 c' P
- SHT30_read_result(0x44);$ b# R7 ]/ T% w4 d9 G; N
- sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);4 X4 d" X6 \! y! d1 J$ U4 H/ u
- sprintf((char *)buf[1],"Current Humi:%.2f",Humidity); ' ~, y! B7 K0 G
- LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);
$ [2 L% `" L6 D" t N5 X d - LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);3 E; }: P; R' ~
- delay_ms(2000);
$ N% ?& z& a9 f# R( U7 M. q - }
& z; M% F" s* Z# N& B4 ~ - }; ~3 b3 E# l$ f2 l% H, @) ]( }0 m
复制代码 3 ~0 G; x" s: N% f' A: L# k) G
四、实验结果
/ z k' i0 E4 w4 Z( n2 d$ w* |: {9 B- Y9 F
( N F. U' V ?; E
7 ?5 S C i* M% i2 C
———————————————— g; L/ d8 D& _2 r- N2 v! [9 W
版权声明:@slow-walker
$ h9 g9 v, ^: q3 O! s7 i7 j8 q( f( `- R
& z* U/ R1 r; w |