基于stm32f103的SHT30温湿度显示: X5 a+ p; y# W7 k6 {- i: N" N+ W
本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验# T# r( q: w, U/ M' u5 @* e
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)
2 q4 X V- k. a( d) r x! ~- A; v7 X7 t
一、硬件材料0 W: k M |6 @, D# _
1 m0 u; a/ v3 j! F* _, F, X0 a
& F" I$ o" a: B8 b1.stm32f10c8t6/ v4 a# `1 I9 u1 a
9 }" |3 v/ {0 q0 L, ?: ~$ q8 r7 E
3 U; \1 e7 }9 `2 V K# o+ U# }6 W( z$ Y7 \3 |) m# o& L0 I
2.sht30温湿度传感器
" h1 `; E, _ \( D: `, s
) e1 ?6 ]6 |9 w
4 ]7 N, s; y- ~: p
+ u+ a2 F1 \8 a* v1 @( P* ]0 B7 d' d3.TFT(3.5)寸屏( A. F6 _! S( ] r
9 Q8 _8 _* b3 t! M
; t6 n5 n& ?" G5 e, r# _0 ]5 p
1 r' o) _ j1 X, M1 i0 i/ Q. b
二、SHT30介绍5 h( @! H r, m2 k- a0 M
1 [1 F) M E$ ^3 Vsht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。
/ ^" |+ a; O4 u) u) G7 H* B+ ~, p4 I1 U
sht30.h7 U) \# Y1 Z( L: b
6 R) z. Q2 ~0 ?6 T# v+ C
- #ifndef _SH30_H
2 V# i5 N9 y2 h+ c( m - #define _SH30_H$ g9 P8 L+ t" H8 [9 @9 l" S! w5 t2 |
; t1 L! |1 P G* I- #include "delay.h"
' p3 M o; r8 Q8 M - #include "sys.h"
. v6 R4 e; C5 E! Y - #include "stdio.h"# K- y; T% s0 s2 ?! \3 N1 Z( V
- #include "usart.h") j1 i5 e9 ^# n
- #include "string.h"
8 R( N3 f7 L# Z' ] - ( n }8 I2 _( f T2 h8 T9 V" m
- extern u8 humiture_buff1[20];9 A3 v0 B- N: d
0 c4 p$ z) R9 d. Z. ~) T- void SHT30_Init(void);
; u: }+ U+ \5 y) y) j' ?8 t, j5 q - void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误2 W" h7 n& T% D8 c4 _
- void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成6 j1 W8 L9 W& P/ T% k! u/ Q# H7 j
- u8 IIC_wait_ACK(void);//等待接收确认字符
1 p# N0 S! E+ ]0 W3 i - void IIC_Start(void);//等待IIC传输数据开始: \8 O! i3 p( Z' L
- void IIC_Stop(void);//IIC传输数据停止
! A6 w [6 a" B9 R0 B - void IIC_SendByte(u8 byte);//IIC发送数据
' E- H# c$ n x' h2 h& u# C B; a - u8 IIC_RcvByte(void);//IIC接收数据
- @( w& S/ A4 \6 H+ _% R$ |; o4 X - void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
" v: B1 {% E5 A - #endif
复制代码 0 X' E8 G. X: @ d3 ~1 G* `
sht30.c8 U: N6 v0 @1 f8 p* b1 H% q
8 H4 t( [4 A" Y* u+ v8 i- /*
+ Y, c6 ^6 X4 `5 ` - 设定温度阈值范围:-20℃——125℃
6 B# L# m& f; j$ C5 a+ k' }. j' U - 设定相对湿度范围:0%——100%6 H$ S. P6 B) H! _; G# Q% j8 f! s
- */4 m, I) `; ?: y, {! }% M v
- #include"stm32f10x.h"
( p$ ], |8 Y$ h d S2 y6 i - #include"sh30.h"
2 ~) |8 v* C1 _/ ]3 X0 Y/ Z - #include"stdio.h"
, _" [9 P/ i9 G - % W# e$ F" d1 l1 e, M" ?. O$ y" W
- #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
: S$ z; R! I4 R, x. o/ W1 Y9 |3 I5 A - #define read 1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令3 z3 q" I+ O3 _+ ^& D# f
- 5 S4 T7 u$ s( m' A" M/ M% F
- //IIC总线接口定义1 @* j4 M4 f1 b
- #define SCL PBout(6)//设置时钟端口, V R0 A @5 @2 a
- //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出% w7 e4 s: D2 C- r2 A; a5 b
- #define SDA_OUT PBout(7)//设置输出数据端口
! ~9 @3 b8 y+ x - #define SDA_IN PBin(7)//设置输入数据端口% z' Z6 _, l v% Y, g& [- ]$ i
- //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置17 W9 M* ^0 C" M, `4 _+ r6 }
- #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
5 C! A- ^$ |: W# N5 }. u1 [3 V - #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
% k0 w) R2 Z+ t6 I4 z( `& k! m- @ - //#define IIC_INPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
, K$ F# Y6 f) G# h. X - //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出$ H: @5 o5 p& H, i$ \) K8 N1 Q
- 2 N, i" J& G! Z/ P- f) ^ o4 m' k) w
- //定义温湿度存储变量 x$ K3 f% D+ `$ G
- u8 humiture_buff1[20];8 E6 V3 \- r( V: |7 N) B
- % h. r9 B; k+ C
- float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0/ I2 h- N' d& O( @, I3 q! m7 n
- float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0: u( [/ u7 S* ?0 G$ u
! J+ n% z) i: B+ S/ Y+ Q4 ^( E- void SHT30_Init(void)//初始化SHT30的SCL与SDA接口% ]/ F2 e3 N/ k2 ]' U# ~' p
- {
9 q, h7 _, h: N( N - GPIO_InitTypeDef GPIO_InitStructure;
5 ^( f8 o1 e' X0 g, c" F/ T I: h D9 u - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); & x5 g5 l; }2 S$ T
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
& ^* k4 h: S" D6 n2 e; t - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
' \! q1 O1 n, n, U( L+ `5 [5 ^ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" K! J o7 U9 H0 L" h - GPIO_Init(GPIOB, &GPIO_InitStructure);$ w8 l! C6 p1 E+ u; w8 X+ S
- SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
1 H1 i. v q) J1 }+ n/ N- j$ T% Y - SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
+ I' f* @% G" q( h - }
0 w k. g9 S8 r. s2 I* K6 G4 q - //主机发送确认字符ACK [) u7 s* Z/ ?3 K0 W6 o
- void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误: t! h9 @4 a" l+ c: n$ h
- {
k, f+ ?' C4 F- A& L) u& U8 q - IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式 c; q0 o5 N6 L- E/ N' B) J+ s
- SCL=0;
; x) J$ Y- M. j8 l$ ?' R - delay_us(2); 0 ^/ N/ a& U5 }5 V& Y& V @* o1 E) L
- SDA_OUT=0;) t, M! _, f2 [9 G: b* k) {
- delay_us(2); 9 l5 X5 _- C/ J& s3 z0 C( v- k4 n4 c" t& t
- SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机
& ]2 Z0 H$ |! Q. h! @* I - delay_us(2); ) i8 `0 [5 i! ]! x/ c8 L
- SCL=0;//数据接收完成,主机发送ACK
! E- E' j, {3 d% Z$ x( s/ D - delay_us(1); # k( [& c2 X+ S/ v) }# T# p; l
- }
5 Z# c" J0 H. ^& ?; g3 Y" Y - //主机不发送确认字符ACK
; v. K' r- h% Y- _ - void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
! I4 z$ S! Q9 ~ - {
: W% w0 R, c+ V1 K' j5 S& X7 H1 v - IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式- P: T/ t$ R1 ~- F
- SCL=0;
) \" D! Y7 s9 d' C1 @- E1 j* c0 S - delay_us(2); " V2 h8 P& e! f3 O* q/ N7 a
- SDA_OUT=1;% _) ^8 v: k( g9 _) n
- delay_us(2); 7 |0 p- f/ S3 ]& B6 d+ S
- SCL=1;& O" S# ^& i8 n" `( o2 |
- delay_us(2);
6 Y; T0 e X/ M; t) M - SCL=0; ; I" l1 \; o6 k! n- R7 C$ T
- delay_us(1);
6 A: c7 W5 [ t: }' m5 n6 o - }1 N+ u4 i& y5 C+ j
- //主机等待从机的确认字符ACK
" b, B, B0 ~6 l0 \8 }- Z; i. U - u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成0 {; z7 V0 n0 l! [8 {; _% g
- {
; w; k, h3 j s+ e! G1 L7 v - u8 t = 200;3 [* U3 F, b" j$ X9 Y5 ?1 s; H
- IIC_OUTPUT_MODE_SET();; Z5 U0 Z: r4 Y. h. [$ O7 p
- SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
* [6 X# y1 }3 p7 n& W - delay_us(1);( ]% p! |3 a; K% z% w4 V& r! m i
- SCL=0;
/ I) o3 q/ T( C+ S - delay_us(1); 7 V( }( n) N# P! o9 G
- IIC_INPUT_MODE_SET();; }% ^" L( L7 g7 [& ~
- delay_us(1);
$ r& R6 k: o# M$ R" r0 E, g: | - while(SDA_IN)//等待SHT30应答4 \ H! U- y$ d5 G9 j1 u
- {
& h, `1 \( O, e - t--;
; O0 Z+ o" U+ b7 S/ j - delay_us(1);
5 J5 |1 Q- ]) g - if(t==0)8 ~; l: n& M0 H/ U& ]$ h2 E
- {
2 Q" k) r- G/ y0 `; z7 @- N - SCL=0;( c! l, e% ` b5 A
- return 1;6 n- r0 R: Z' o" D* j8 m
- }
0 I& t8 N! v3 c9 m) Q8 Q - delay_us(1);
4 v3 O! o" ]+ ?! y- {! D - }
; T! |# l" V/ P! K9 i$ N- ` - delay_us(1); 4 U4 e, t1 I. L3 D
- SCL=1;' m% o% y' A- ?& ]% J
- delay_us(1);6 `% N# E& _' u9 U9 c1 |% }
- SCL=0; ! [1 x3 K' z7 W% c2 v! ]
- delay_us(1);
! u9 h, G. p3 [+ g5 D - return 0; - }1 V/ ^* O8 F2 j1 J& `
- }! t1 |; n' x; i3 z3 }6 U- v; K
- //启动IIC总线进行通讯,发送IIC通讯的起始条件3 b6 p* x) c; P9 p0 s0 b/ T
- void IIC_Start(void)//启动IIC通讯. l0 |' h& v. d6 }7 t, G
- {# Z% T5 W* ]4 C! c# j5 G: _
- IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出, N0 s, r3 y i' n$ E* w
- SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平
/ O4 i2 h, A* L - SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平
& i' W, j v% E" r1 o( V7 I - delay_us(4);//延时4us,给硬件一个反应时间! v9 O; Z' q/ F5 \
- SDA_OUT=0;//SDA引脚拉低,开始数据的传输
# ] r/ B. h3 y6 p# t - delay_us(4);
% \7 S0 t# ?) |& } - SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输+ ~" t. Y! f" e3 V- j* n
- }! ]& F3 e/ q. `6 I7 O
- 0 T6 i8 f! [. Z0 ~9 g
- //结束IIC总线通讯,发送IIC通讯的结束条件
4 Y$ M; @4 ?5 w+ }" {! T - void IIC_Stop(void)
* s* z& M8 D# r. ]+ A: P0 ?6 J: j - {
8 Z) \( B1 S: B8 m5 Y; z6 A, D1 o. w - IIC_OUTPUT_MODE_SET();
) K. O4 c: i* v - SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
, \% o; m- S; Q - SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态 , d9 W U: d% }3 Q3 ^( [
- delay_us(4);
; D( m3 T% y2 ~4 n/ B - SCL=1;//将时钟拉高,表示已经结束IIC通讯
+ @2 w8 b" U- G( d - delay_us(4);
% q7 a# J. @# r0 ?$ s# b+ V" V. D - SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输- Y6 B/ D9 f$ c9 c
- delay_us(4);" O3 s+ H* I( }2 n8 G2 T. O* ?
- }
7 a6 W" N6 T; U6 K& e; J - $ R( \4 K4 ]* j/ ?
- //将byte数据发送出去
* z+ d" M: M% ?+ ` - void IIC_SendByte(u8 byte); `. J; f; a& q p+ B- a5 ?2 Y
- {% i+ g- I: c. J5 ^7 j
- u8 Count;
9 c# i1 l! M, ?: Z; l, y; M - IIC_OUTPUT_MODE_SET();* J5 h% d) B* J
- SCL=0;//将时钟拉低,开始数据的传输) F0 m7 V! ^) c5 s
- for(Count=0;Count<8;Count++)//要传送的数据长度为8位4 [+ B* t! k% i Y) M+ I
- {
& x2 _2 ]" h% d2 r - if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据
; b. \- S0 `0 U - else SDA_OUT=0; //判断发送位为0,则开始数据的发送
2 N! u# B/ M! [# B0 _7 x+ `$ ~ - byte<<=1;
! W7 T- s" }8 r) e/ B9 Y" k0 I/ V - delay_us(2); ' {# g- r8 D7 q, Q" m- B/ R/ `; _
- SCL=1;( m% Y/ D2 x7 a
- delay_us(2);. h9 N/ ^& t% p y' N$ {9 Q. W& ~
- SCL=0;2 C/ w- `5 \ @# D# m5 s3 l
- delay_us(2);
) H! ]& I( m' X! S& Q/ c - }- p: r6 Z) c6 o N% x% Y; A: |
- }
) p- I, x/ i9 U5 e, S
2 O- o9 u* B* @: q! y! |2 \ r- // 用来接收从器件传来的数据 + A( X4 v0 N' L* [
- u8 IIC_RcvByte(void)" t9 k$ t8 y6 |1 j( @9 U
- {6 _9 B0 h/ K9 i* ]3 E. a
- u8 retc;, c# e+ Q/ X: _
- u8 Count;) V* N$ f h. P6 O/ w8 R) K& |' Q
- retc=0;
8 z8 d( V; [- Y - IIC_INPUT_MODE_SET();//配置数据线为输入方式
" E2 R9 `: r: \& M( g1 c$ v5 I% J6 S - delay_us(1);
/ Z1 c7 W9 w: F$ K0 s& U; m - for(Count=0;Count<8;Count++)2 v, ^- W( J! y+ A
- { 6 E0 J z* w% e2 G# {5 k/ M
- SCL=0;//配置时钟线为低,准备接收数据位$ }# J+ Z; ]' U1 @
- delay_us(2);
7 J9 ]/ Q! y$ t6 w7 B1 w - SCL=1;//配置时钟线为高使数据线上数据有效 $ }/ K( R) a8 g) f" J. L8 K6 E- G
- retc=retc<<1;
& B5 H1 l# A( Y* B7 y% z - if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
/ O/ Z; I! G4 y. W% F; ^ - delay_us(1);1 a' }& `" l; R, u8 v- M, a
- }
% c! C5 _) s' {: J0 p) i8 l - SCL=0; 3 l" I$ D, {: B6 h1 s3 x; H& L
- return(retc);% N$ Q! d: _+ z9 n7 X" h
- }7 Y. Q2 i( l3 u4 P3 I/ ^
- //用来接收从器件采集并合成温湿度
& k& [! t' V, F" k! |8 A/ i/ c% I - void SHT30_read_result(u8 addr), z# Q/ K% {8 y! l
- {
" J9 x( U0 P. P! D7 K L' M( L - //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
" o8 o: ^6 a9 l* j - u16 tem,hum;//定义存放温湿度计算公式的变量8 {' e9 N3 f& `8 \* }
- u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位
8 ?; X3 k7 F Z) G
# ~# m7 q/ ^9 Q. V( J2 n, o% d0 O- //发送指令为0x2C06(默认)
3 R4 }7 @6 r4 [# _" O& p" F9 ?! z - IIC_Start();- f5 }5 K/ {( w |7 O( ]8 P; [ w6 [
- IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位. Z: R% D3 S+ O1 r8 E0 n
- IIC_wait_ACK();. |, b: w0 ]7 P6 S
- // delay_us(1);
C6 D/ {* q# E" G# _/ w1 \2 Z - IIC_SendByte(0x2C);//前半段发送指令为0x2C a% w# s, }( J' S$ Y8 R
- IIC_wait_ACK();
& O3 s: B) c; Y+ d- y" R2 Q' n - // delay_us(1);+ ?2 m( |: S1 @
- IIC_SendByte(0x06);//后半段发送指令为0x064 y, H1 e- ] d$ [$ B3 ?0 _4 ~
- IIC_wait_ACK();; K! {7 h& r" M. O& W% D$ A
- // delay_us(1);
. `2 U9 b& ^7 d/ _$ T - IIC_Stop();9 ^- m, o. `/ \# t' p' c3 a2 Z9 s
- delay_ms(50);
( ]( w& j& ?- u( k- Y - IIC_Start();
3 c% }0 ] P+ _6 h: m% Y# @ - IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位0 h# ^" {; \/ \, z
- //SHT30返回的数值是6个元素的数组1 A* h/ m/ ^! @ V% a! a
- if(IIC_wait_ACK()==0)* Y) l: N7 d5 [
- {" C( |4 _: c1 V
- // delay_us(1);
+ W Y* O- V& A. B' y - buff[0]=IIC_RcvByte();//返回温度高8位
& P$ Y& @. E. q5 ?* s! ?- w! y, O0 r) x - IIC_ACK();* m+ ?; q& K/ a* I3 Q$ `
- buff[1]=IIC_RcvByte();//返回温度低8位
M3 ^9 [6 g* ~" h - IIC_ACK();" k, b4 R/ P* p' G, T) y
- buff[2]=IIC_RcvByte();//温度crc校验位
6 K8 y- B" b% C4 }+ X, o - IIC_ACK();3 j4 Y. C4 }1 d- j
- buff[3]=IIC_RcvByte();//返回湿度高8位) N3 f/ ?4 n4 P6 \8 J
- IIC_ACK();5 v8 O- a Q0 E: O
- buff[4]=IIC_RcvByte();//返回湿度低8位
$ ~! p+ k% e6 x - IIC_ACK();
/ O q; K V1 K: \ - buff[5]=IIC_RcvByte();//湿度crc校验位
2 F4 T% \, u3 n& o+ \6 \: i! t - IIC_NACK();+ d; Z- o7 L% _1 `
- IIC_Stop(); g* _! s4 w( M$ O' h
- }7 I- |8 l# u. q% s9 E5 g) z) h7 }4 x/ q
- // tem = (buff[0]<<8) + buff[1];9 T/ P4 H* B3 S' G. s% x7 c
- // hum = (buff[3]<<8) + buff[4];
9 W" u2 @- v3 E& |& P& s - tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
7 l* |$ l4 F, A' `/ x n- ? - hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接. p) n6 M/ K0 M* [
- # v8 W ]9 b" |7 E8 z& F4 k
- //查询SHT30数据手册可知,温湿度的计算方法如下 f, S+ Z& m+ E( T$ G
- Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)
" L/ X8 _; ?: g/ [- D - Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)
' n6 a6 i2 P+ J& ^/ F - 7 z Y: P; B1 e6 b
- if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示
6 y- Y7 W8 x1 o$ V8 G - {
/ L6 ~: }3 P2 l- W: `4 {" U - //printf("温度:%6.2f℃\r\n",Temperature);
1 D# d6 @- U% C' `) l - //printf("湿度:%6.2f%%\r\n",Humidity);2 ^6 N% F- u1 Q# W0 ~
- }
+ N- m& j4 A$ }: x }/ _0 r0 Q8 a - else5 C& B, P8 A# m! p
- {
8 E9 e) l/ F, k' o+ w9 j: @ - //printf("温湿度超过给定阈值!\r\n");7 p' u' o( `3 k- \1 `' b2 O
- }
/ s# s7 w0 v, z1 o8 x, Q - hum=0;5 `( k0 U1 q( M4 n% ^$ Y
- tem=0;
' M( J; L/ L4 d' C8 K! ~: g4 `
; k, O( J5 h) @) V- }
复制代码
/ R: Z, f5 ], W& ]1 i+ H# B下面这两句不明白的小伙伴,我另外一篇博文会专门介绍
8 V4 o/ M$ t! G# {, i5 d+ Y2 w
d6 Q0 }1 M( i- #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入9 X% P' K$ z: k7 F9 J1 F: R
- #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码
% m8 ~' Z) @! J S三、主程序. A0 `7 ~0 E4 D. u+ v& L4 x$ H2 a
main.c
9 Z5 m9 b& \- S* y$ f: E9 M4 f
1 f M5 c9 s4 a! x% h5 U
" y# [" u; D( }, b A) E4 h- /*------------------------TFT3.5接线--------------------------5 C0 L! f1 f& A k
1 X, B6 \, |" p! o9 @- // GND 电源地
8 O3 i+ {" H- l; N5 b3 A7 K' F - // VCC 3.3v电源& [! J/ l9 ~4 P1 Q2 I
- // SCL PA0(SCLK)) ~% K. r9 Y% p
- // SDA PA1(MOSI)) c2 W* I' e \) r! E1 s
- // RES PA2# r/ w/ @5 {) V0 k
- // DC PA3
: z% n; {# T: B+ R0 V( L: u - // BLK PA4 控制背光
. X' H# Q0 ~' L' b; n - // MISO PA5
; \1 J0 S; Y, O" y - // CS1 PA6
$ b" f* v1 E$ J( p - // CS2 PA7
& y/ `7 c; S3 w" i; B - ----------------------------------------------------------------*/1 ^8 S2 |7 z0 U; ]
- 6 e) I @; Z! N3 j$ s- e# n
- #include "delay.h"% w j1 O, S: ?
- #include "sys.h"2 B4 R5 Y* c* [! p% \! H
- #include "led.h", `; T+ q) @1 D0 s* e
- #include "lcd_init.h"
% H" ^: z2 U) r+ T - #include "lcd.h"9 u6 v/ D0 Y Y" z- a5 [, X- Z. z
- #include "pic.h"
8 q# ?3 L0 v, U! e1 O - #include "usart.h"& H/ T- h8 L W, n
- #include "SH30.h") d# A7 p4 L) H2 y1 e6 o
/ p) n6 ]* o# Z* A* ]: i- 2 D7 R. t, ?8 }- |# m
- extern float Temperature;$ Z( H$ B( M: l6 N& q. i$ Q: x- ^
- extern float Humidity;- s7 {* n9 x0 [1 ^: Z+ N# H. t# R
" h( c9 L) }! u" n! } {; S- unsigned char buf[2][24] = {0};! \2 l* ~* ~( ?8 g8 s
- 9 G$ e) e2 q! o. I3 Y2 W* ?1 ~
- int main(void)
7 K S4 ?2 {; C* Y - {
5 r' C" D) u0 Z/ d* V1 b - u8 i,j;
( s' O. Z X+ J' Q& N- X1 J - float t=0;
" V/ d6 N k, \; K1 A( p- k - LED_Init();//LED初始化 v/ c# f* @3 Q. k; b1 s
- LCD_Init();//LCD初始化) \: m1 q g0 l/ x
- SHT30_Init();
* ^7 |5 h/ _" b. U - uart_init(115200);
* z, S6 B; ~: |% ?) r* A - printf("SHT30初始化正常,已准备就绪!\r\n");
" R3 Y/ t0 N3 ~4 u, [" V1 f - LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
3 m) O& W l9 j
/ i: R. a+ |" q. L9 _1 w$ y- while(1)7 b2 `( K7 q5 R# C
- { ' K6 U/ `. P4 F4 f% f9 C
- " v6 B) A1 _- x0 N0 }9 J) d
- SHT30_read_result(0x44);( ~5 P+ Y+ @ A. S2 ?+ y' S' y) E
- sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);4 A, I: f' w4 I0 M& k, q
- sprintf((char *)buf[1],"Current Humi:%.2f",Humidity); 9 [9 S( Z: C& X' v! K5 [
- LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);
" Z3 j& h+ t1 {; w+ g4 z - LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);
4 z2 z0 M8 x$ Z8 l4 c/ i8 y - delay_ms(2000);1 j% t: D) c2 b, G4 ]
- }+ `' z1 s/ x' }+ d- m
- }
0 N4 p+ |! z, |: k" K0 L
复制代码
( \) [# w1 F1 e& Y+ }/ x% q四、实验结果7 L" S6 M- H0 Q* b$ k
7 E, Q% u( O0 n/ Q
1 g- h0 T( H4 c) C( I7 X6 y
4 r7 p& ]: t Q0 Z————————————————
3 W9 I! j+ |' ~/ t5 E% ~6 h版权声明:@slow-walker
" \& f" H. N& q( L- @( T) y
3 j& ?& E. U4 x x, P! m" V, k
! ]3 }! |9 H' B, u* H$ V9 M |