基于stm32f103的SHT30温湿度显示
* N/ V+ M$ ?( {. i本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验" S" r6 J7 P, P V$ L
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)8 `3 @$ n3 P4 B
1 p! o: Q7 _7 w, o9 v$ E1 p
一、硬件材料
! L9 ]5 w/ W7 q, g# `/ {
' ^, P0 S2 [+ U, x8 D* J
0 D# `) m- \7 `- Y2 f1.stm32f10c8t6: y) T: f8 p1 m4 e1 u
7 A* S9 U, I$ T3 { {+ r
0 ~) l, O; ]& ]3 i9 Q/ }/ u& z
1 r2 d& Z* G( m; g. D, V. G% U0 @2.sht30温湿度传感器; }! a; w/ l! }# X* z" t, a+ z* c7 z
2 R1 b% {4 g. K+ ]1 z
. g$ P3 O+ I9 H' f. m& l& _- y, j2 |: _6 r+ }0 l8 G
3.TFT(3.5)寸屏
$ q# w' u# v+ t% y, ^% J( I
# R+ E. A. }" I" {
" s; p: v" A% [5 R
: M+ E$ g& T! J" I |6 {二、SHT30介绍
7 E/ d7 m; S7 t) [$ n+ B Q/ M6 T$ f$ }* J2 {1 z; X0 D
sht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。& D6 }) F2 e$ K& H, T
; b o" G3 b; B6 @: m: Osht30.h+ \, `7 s1 p( Z/ v
) ?/ O" c: V* g! H$ Q& U ~
- #ifndef _SH30_H; R: \5 d1 L: @8 ]9 S; f8 t& z$ T
- #define _SH30_H
, k3 t' C6 O: j- m3 e/ H+ z, v \ - ( q7 t5 X; a$ p# m, p0 ]
- #include "delay.h"1 j1 |$ `; G/ K P
- #include "sys.h"2 J" ?9 V9 y1 s1 Q' ~
- #include "stdio.h"
. B( Y; _# U& b7 M L - #include "usart.h"
0 `1 j2 R/ |# y8 c - #include "string.h"
+ C" E. B% T$ p# E. x - ' n) ^( e7 b0 t Q9 {: U5 t) I
- extern u8 humiture_buff1[20];
1 P) ?* C2 O5 l5 ^: b - 4 D: |$ Z( I7 N' F+ b
- void SHT30_Init(void);
5 I% z1 a7 B& `; T - void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误
$ b4 c. o9 Z( q/ d) |5 ^" F% b4 ] - void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成; W2 e2 b( G3 j* q
- u8 IIC_wait_ACK(void);//等待接收确认字符3 H* x9 m5 s" N
- void IIC_Start(void);//等待IIC传输数据开始% a, _( v4 `2 j7 k: c {6 [
- void IIC_Stop(void);//IIC传输数据停止
9 L! z& p/ P) A" E - void IIC_SendByte(u8 byte);//IIC发送数据
% m! W- C1 ?! S5 g9 q: s. g - u8 IIC_RcvByte(void);//IIC接收数据
9 x: @( \4 H7 m2 m2 ^( A - void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据. E( B1 d2 a% B2 N% \. F
- #endif
复制代码 % ]4 [; g* A+ z c e4 T) R
sht30.c
) P' z+ k" a, v& _( M6 b0 E( e$ l4 k6 C
- /*' d: r1 r4 h, v' x- c) u% W7 p
- 设定温度阈值范围:-20℃——125℃
9 @/ [) P# j/ @1 V/ z% D - 设定相对湿度范围:0%——100%
" Y2 e% J* ~- \, f2 ? - */
: Q0 z. p* e C' P3 ]' E8 v# x - #include"stm32f10x.h"
9 Y' c" t2 ]* t4 G% Z* E - #include"sh30.h"
! E- [& g$ @8 g0 W" X. D - #include"stdio.h"
- {' {( U. {) p - ) R( Y, ~. Q! c4 P
- #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
! ~' r1 ?4 ^7 _& q+ e6 a! J - #define read 1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令
% t0 o0 P, `" {% ]& O
% f# v' q; d* Z/ x$ e- //IIC总线接口定义, \8 \0 P( J4 e/ z
- #define SCL PBout(6)//设置时钟端口% o1 N; g$ J& c$ q7 d
- //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
0 k! a: F6 x [- v# ?0 x# r& u - #define SDA_OUT PBout(7)//设置输出数据端口& l2 m: a, U! \6 W* N9 q: O& y9 g, O
- #define SDA_IN PBin(7)//设置输入数据端口
1 N2 X3 v, N i2 b - //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置1
: P8 z2 L) J3 R2 I- a$ G - #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
& H0 w4 w0 x4 U X1 x6 N' ? - #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
. I5 a: F9 a( p - //#define IIC_INPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
# {% O) q; K' U" C8 T6 O& t7 F - //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出# y) B6 }' H' x& ^+ g7 W
- 2 @( @) G* j- q: l# `/ J
- //定义温湿度存储变量
+ n1 c, v, C0 U5 e - u8 humiture_buff1[20];1 I# z/ G2 ]8 D
8 y ]- t# k- M7 c0 E/ T- float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
9 O! W5 F/ R/ ^9 V8 p4 K: e2 n6 e- v - float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为08 [9 |8 T' |1 z
( r9 G3 J# U: p1 O- void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
6 r( Z* O9 W/ x+ m/ s. M - {
. n- H r4 h7 f' J6 a" x - GPIO_InitTypeDef GPIO_InitStructure; $ s/ e2 [- c" U4 M+ P
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); % Y# c% K( R2 f% g5 h3 v) C7 H
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
- N8 w8 X! ], _ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
6 {3 X6 v u0 z+ W. X - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;3 ~ c: ^0 K) N' e6 f
- GPIO_Init(GPIOB, &GPIO_InitStructure);
: T2 f; J/ Z) m1 N9 D; @ - SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
. V, p) F1 ~( l - SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
$ {1 y0 y, J2 Z$ q - } ' h+ `0 V1 q J2 [, }/ n5 ?& T
- //主机发送确认字符ACK
5 n0 Y% F9 J& o9 w$ `8 ]0 e - void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
( E) X+ s* J2 t0 X" h - {
" @5 x! v; N3 |; b, t - IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式% k* H1 }- O8 `( d
- SCL=0;
) z4 c' c, g3 w7 v, l$ _# _ - delay_us(2);
! e! s+ g. z8 O, Y - SDA_OUT=0;9 H1 r4 S: D+ H3 J" h
- delay_us(2);
( X$ }) K+ A: k# W$ Y - SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机
. i( w. \: j" W0 H - delay_us(2);
$ b {8 ^9 T7 t1 k2 S5 p6 w - SCL=0;//数据接收完成,主机发送ACK ; g- e6 Y% x& w: a! x4 `
- delay_us(1); " Q+ A' y2 P( R9 `
- }8 h$ @: h1 {4 }7 R( [0 V
- //主机不发送确认字符ACK* J( M+ z, J, N; n3 z# H9 {
- void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK% P i; {$ z0 h0 S5 C
- {% L( v* o. J% _
- IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式* ^8 L6 A% }4 @( g- `
- SCL=0;) ~- W4 X- @8 n7 Q
- delay_us(2); 0 J, S" q- c2 Y$ U; O5 Y
- SDA_OUT=1;
8 _ ]! c6 i" i - delay_us(2);
- j, W) J# A8 U. f c/ q5 m1 Y - SCL=1;
4 b0 w8 c! m) _0 Y5 k. D - delay_us(2); & F( w& u$ ^+ @. h2 {5 f2 b4 H
- SCL=0;
5 n( K, ^ e2 g - delay_us(1); - ~8 @: K0 z. u1 Y, Y! b. t
- }
8 S' d; u% }' b, x1 }; Y - //主机等待从机的确认字符ACK. L5 V/ t3 r+ n9 J
- u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成. T9 {" T4 m) ^8 b/ @
- {
/ X( \; m6 ?* ~* Y. t - u8 t = 200;8 Q' o$ {2 {; p3 o/ i
- IIC_OUTPUT_MODE_SET();
: B+ k! ?- n7 K5 n. \0 T - SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
* f" u5 H, {7 o2 T0 S3 b - delay_us(1);
6 X* \1 B6 a) S# n) M - SCL=0;
- H. u: Y7 Z2 q2 \- _* M! k3 i& I7 c - delay_us(1);
j1 V( v# k5 o$ h; B* `- |5 A3 \ - IIC_INPUT_MODE_SET();
3 r, r) ^6 n9 R( r6 [, K - delay_us(1); 3 P- g! d* h% o( c6 g4 d" e( m
- while(SDA_IN)//等待SHT30应答7 T8 C% z* f5 f& b* q3 k
- {
( K- i4 H% }1 u - t--;) P, T% N$ j N1 I1 r
- delay_us(1); 6 E1 G3 x. K; B2 M0 z
- if(t==0)& R, k" X8 I7 e* c8 L
- {
, f/ w- W+ t9 Y/ P) _ - SCL=0;
6 |* s: h- x& `* f - return 1;
5 m6 ?( q9 }& F. U - }: }1 k+ m9 T7 B, R: W( \
- delay_us(1);
) _& x/ q. G2 E# w/ ?3 v - }; Z! G6 G0 \+ Z8 a0 k
- delay_us(1); + B. \9 A$ N- _9 q% r' l8 l+ L
- SCL=1;
( A7 T+ r0 s. t: d; B2 y3 F" z/ |! Z, C - delay_us(1);
- {9 }$ {0 e5 @, B2 s& @' U- z - SCL=0; : R* l. }& S+ \- B- j+ @1 v' o
- delay_us(1);
6 \* W# Y: q2 ]8 f0 G - return 0;
: c) ~9 }1 q0 y - }) \* ]" q r+ h# B0 M
- //启动IIC总线进行通讯,发送IIC通讯的起始条件8 h, o1 a B8 V7 N' x* s; {) @" e
- void IIC_Start(void)//启动IIC通讯# |) D6 ?2 o+ |, n
- {& o* r4 _8 j' g; p+ T2 l9 _. g
- IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出3 p# R) b! c( n+ ^
- SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平. t2 U1 l' X; U3 v. d
- SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平
. r s( {! [! f& n* w( C) K; z* f - delay_us(4);//延时4us,给硬件一个反应时间$ m+ l" r9 C$ B. K
- SDA_OUT=0;//SDA引脚拉低,开始数据的传输
2 T0 t1 p4 r. }4 s: i - delay_us(4);: P7 |; z6 ~% x& e/ S" w& O0 E
- SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输& W, @9 [5 l4 H3 @4 Q, P
- }% ^# V) W) e0 b
0 Q4 [2 N0 @+ D9 ] d* U4 U4 j) @- //结束IIC总线通讯,发送IIC通讯的结束条件9 v4 p$ L" I& {, g
- void IIC_Stop(void)% V ]9 S: V" V% l- v. q/ z* P# W* H
- {* X. a' S: a) N* c3 s
- IIC_OUTPUT_MODE_SET();" @1 q% o1 W: d, x2 A$ z4 X0 U
- SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
' h2 f' @1 m" ~( N- m2 L - SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态 " ? v( a U" J. A9 `9 u3 T/ ]! W
- delay_us(4); 7 L3 e* G! k/ `. u" E8 j* n) e
- SCL=1;//将时钟拉高,表示已经结束IIC通讯
; N- `4 _/ n7 P3 \$ v) a - delay_us(4);( g4 R) |* V% i5 ~; T
- SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输9 w& a+ W$ q" x8 v: i; q+ P. x5 K
- delay_us(4);8 [. h, y( y/ L5 Y' s' `" Z
- }
9 P2 w# k0 w, y' o6 C* F - ; Y7 K G; Q7 z" e3 P6 B: {
- //将byte数据发送出去
1 N/ `% g' ]" n3 W- F6 M- x - void IIC_SendByte(u8 byte)
5 J K; d$ G+ t2 F, t0 i& y - {: ^& C- J% f0 v0 r
- u8 Count;
( T7 w+ B0 f5 A" U1 p$ q0 @! J - IIC_OUTPUT_MODE_SET();
$ W) E0 L6 ^; ?( K& D - SCL=0;//将时钟拉低,开始数据的传输
* I" c8 K; q9 k. B8 \ - for(Count=0;Count<8;Count++)//要传送的数据长度为8位% _0 W# f* Q9 e' h( K" e
- {( a6 |& Z& K9 J
- if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据: F9 [8 ~% U9 O- a, H) r1 h% R0 Q
- else SDA_OUT=0; //判断发送位为0,则开始数据的发送
) |: o9 }$ \; ~0 r2 | - byte<<=1;
) ^5 F5 D& ]7 h/ Y& k. W) q' g% } - delay_us(2);
' b' e* G- W+ z9 _( T% A0 q2 C - SCL=1;
' a8 }& T2 L. c% g& u - delay_us(2);
: ~' A) G9 r6 s - SCL=0;4 ?# f% k G% [* b0 }# n. @
- delay_us(2);
7 ]3 n+ h8 c' a9 N' l - }/ O/ k' v% U0 p9 b5 M [
- }! O' s& k. o* N: k" L
: I) g: W; \ {- // 用来接收从器件传来的数据 9 u0 }& G+ F( i8 V
- u8 IIC_RcvByte(void)
) n R- y, w' Q+ F; J2 ?. b - {- L" {/ |' r' t0 H! Q9 u6 i
- u8 retc;
. \8 P& B7 Z6 | - u8 Count;! w( K* t( M) B9 a' K
- retc=0;
0 |# n: h: I9 s$ r/ i% Y' z - IIC_INPUT_MODE_SET();//配置数据线为输入方式1 d' R! h7 }( [9 c/ n( T
- delay_us(1);
1 C: H6 N- }. U) v G- M4 u - for(Count=0;Count<8;Count++)( s3 q8 p) l! _$ o c8 v6 y1 `
- {
- O+ Q+ b+ k# _5 ~5 e+ P - SCL=0;//配置时钟线为低,准备接收数据位
& P3 K! M9 j$ X3 }! |3 y: Z$ V' c - delay_us(2);
/ o, a/ x. h6 t) v - SCL=1;//配置时钟线为高使数据线上数据有效 8 [: d7 r ?- D+ p4 O; X
- retc=retc<<1;
2 I* q# y' ~" @8 \) D2 M) k - if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
* T) r6 q( a3 V9 R - delay_us(1);
% a! ~# S/ W0 w& _2 l3 l0 n - }6 }4 B9 V+ T. ^
- SCL=0; % L% m2 ^; [. n! J- r
- return(retc);7 h5 F& B! K6 c0 t* S, y; u6 l
- }0 u+ B9 R0 C: }1 Y0 d0 Y6 e
- //用来接收从器件采集并合成温湿度
9 N0 A& |; q) r+ d5 {% q/ Y! U3 ? - void SHT30_read_result(u8 addr)
# p/ U, ^+ w5 u$ W% @6 `! f - {
, @9 R+ ]9 _$ h' }+ M' j2 U - //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C068 B& a2 d! U1 W9 w( \* ^
- u16 tem,hum;//定义存放温湿度计算公式的变量
/ _9 w. u* a6 @- D$ B7 ` - u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位) c9 W8 {! x: Y6 P. P# ?
6 {* a8 Y1 R: }* L, k% D- //发送指令为0x2C06(默认)- T! ]$ I) [: r( l5 [$ S- I
- IIC_Start(); e8 A# A3 w. `* }( P; J1 T
- IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位4 d7 P$ l; d' J
- IIC_wait_ACK();$ H ]7 r! s/ O- H
- // delay_us(1);
2 n4 y) D Q9 n- ^ - IIC_SendByte(0x2C);//前半段发送指令为0x2C9 j6 `/ Q o4 j- b' G2 v
- IIC_wait_ACK();' }: [' _ `0 u
- // delay_us(1);' r/ Y! [$ z1 f, X
- IIC_SendByte(0x06);//后半段发送指令为0x065 R5 s" c6 d& }4 b- g/ w
- IIC_wait_ACK();& @; c- b% u; m4 n
- // delay_us(1);
3 E2 Z% s5 B" Q7 j& P8 H - IIC_Stop();
7 I5 Y/ b* C. c+ ^7 e( F' i - delay_ms(50);
3 J, S a( p3 \& j8 B; T9 A2 c - IIC_Start();% q1 r$ r3 P9 X, L `: b0 q
- IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位; h' _7 X2 }" `* d2 W2 T7 i
- //SHT30返回的数值是6个元素的数组
5 L5 Y4 r2 Z3 m1 b, ^% C - if(IIC_wait_ACK()==0)0 L0 q: D* \3 V, ~& U; y
- {
9 S! L% w5 `& P J5 |+ F) E( } - // delay_us(1);
9 n9 ^3 a1 i5 s/ i2 o; m! f f - buff[0]=IIC_RcvByte();//返回温度高8位
+ X) W h# ~4 p - IIC_ACK();5 |. ?$ ?0 U2 N+ K
- buff[1]=IIC_RcvByte();//返回温度低8位$ S- I7 b* i7 J4 ~3 @6 Z9 ^9 w! k6 E
- IIC_ACK();' C8 Z+ a% a9 T* A! _7 D9 D
- buff[2]=IIC_RcvByte();//温度crc校验位
2 Q2 g: J& W9 o - IIC_ACK();, e! t. d8 A3 G% @* d* G; _: h4 t& r- U
- buff[3]=IIC_RcvByte();//返回湿度高8位
% ]* D8 ~/ g# H - IIC_ACK();
, D4 Z& T9 l- F9 [4 H; I - buff[4]=IIC_RcvByte();//返回湿度低8位. O, `. v9 T! a4 X/ ^
- IIC_ACK();
: w r0 J6 X U2 Z: k - buff[5]=IIC_RcvByte();//湿度crc校验位. O" p8 e: H) f: g: s
- IIC_NACK();7 S4 C8 z6 d7 A! |: I- p9 l
- IIC_Stop();
p/ y1 E7 r* h6 g2 G( k7 e `' V - }: i& W+ w) U4 y R" p* B
- // tem = (buff[0]<<8) + buff[1];5 j9 U. r* O; \# c+ [) e, v* [
- // hum = (buff[3]<<8) + buff[4];
% d; [& ?8 v1 i" n: Y7 r' f0 `+ z - tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
+ W1 {; @' }" g: P1 g" U/ K. i) @9 y) \ - hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接& b/ i1 ^. p" G, U( M9 K. p
- 2 i2 X6 F2 a7 O. `7 P7 C
- //查询SHT30数据手册可知,温湿度的计算方法如下
0 ^8 X, K s4 g$ r$ x - Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)6 L: Q) g9 K7 G3 r
- Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1); F9 R. }# a/ a, l
- / q5 Z* e" b2 X m1 ?( i. O
- if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示$ k0 p9 I* K* q# ?* w- N% t$ b, u
- {
( s) S- n$ S: P* {8 J% |) i; n - //printf("温度:%6.2f℃\r\n",Temperature);6 Z& Y0 M$ _& }' ^
- //printf("湿度:%6.2f%%\r\n",Humidity);4 N" ^1 U3 f8 ]# d+ R* F. f
- }
7 g0 K# ^( G$ T5 Q: c; R( |0 ] - else% q, C }9 R! i8 X \
- {
1 X' I- I! S. O6 s) _) z- M4 J - //printf("温湿度超过给定阈值!\r\n");( H* t8 t' C z8 D, V5 X1 U2 d
- }8 i# N& k! c1 P: @2 t( g0 k
- hum=0;
! S1 X9 }9 l6 i; D J3 s2 Q - tem=0;
! Q. ?9 d1 i$ h: ?
0 J$ O8 o# k m- }
复制代码 # C: B+ h6 `0 A( U' m
下面这两句不明白的小伙伴,我另外一篇博文会专门介绍
! Y5 B9 E5 g4 | V8 C9 l+ R" x# _; o) {1 G* p2 m. _7 I( n- g# [* y
- #define IIC_INPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
# E4 L7 W/ o/ _* \0 I' b - #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码 " f! A& A# ^* d$ b% Z' P; z2 K8 V& J
三、主程序- F l% w4 ?4 C: r0 I, ]8 o
main.c% u; m; R4 v/ n# N$ H
5 i+ D8 f7 S) w b- % Q/ M- ~# z1 O) r W
- /*------------------------TFT3.5接线--------------------------7 q1 _7 M$ o# P! b) j( \/ p
- {7 f6 C; b( u0 \- // GND 电源地; U& R h+ i% ] z. ~
- // VCC 3.3v电源
2 G: g3 ?: l( P% J* m; y Y0 }: n - // SCL PA0(SCLK)
; d% C/ {' D3 y$ t7 d- q - // SDA PA1(MOSI)+ o) E1 F2 s3 s o
- // RES PA2
- |9 P X# y' R, C$ H3 M( k% U' k - // DC PA3
8 v: [% M4 J( E8 D0 L3 L - // BLK PA4 控制背光
+ k% Z8 H# u9 ]+ z - // MISO PA5
. O) K5 ~" S, v+ u2 } - // CS1 PA6 : l/ B) w3 b! p9 q+ V; M4 m" ?
- // CS2 PA73 c' o/ k: ^/ V# t8 m8 T
- ----------------------------------------------------------------*/
) C' C; \# D- I0 E' Z# Y - 3 L3 F/ ~% o( W2 y5 U) u
- #include "delay.h"
% X9 W+ I7 ], y' M - #include "sys.h"# J" a. i0 S/ i0 v6 \1 @
- #include "led.h"- a$ L9 t I0 y$ a# c
- #include "lcd_init.h"" N4 W1 D% j. Y
- #include "lcd.h"* J- G! q t0 w) x$ `+ g ~
- #include "pic.h"
/ u, g( ~3 E7 O6 l9 w- W - #include "usart.h", z7 ?* r# c- E7 q R
- #include "SH30.h"5 f8 ~6 C' |7 e
- ' O; Q* A5 V! ]; t e! U$ b4 `
- 5 G: J) o# q$ _6 r+ i2 S
- extern float Temperature;
9 w3 Q/ ~" f' F, v2 l - extern float Humidity;% k8 H' k0 C! m' U# ]. Z9 W. N5 k
- 4 k$ A3 v( Q7 }: w% t! F L
- unsigned char buf[2][24] = {0};
# C3 i2 o% t& T6 j - " ^- g# w5 l6 E$ c, {. e5 K
- int main(void)
# f: P* O- i: `( s* i' n; v2 v - {5 c" |, p ]* G: y
- u8 i,j;( I6 b6 k0 V) M& [. }
- float t=0;! _0 y' G b6 v5 ~
- LED_Init();//LED初始化* O/ P& e }' {- Y5 l, `
- LCD_Init();//LCD初始化: O4 r4 E( ]+ N- K- h1 {1 p
- SHT30_Init();: v2 V" P4 @: O+ u) E' ~& m1 b
- uart_init(115200);
" L3 n4 r1 e5 n8 R& A - printf("SHT30初始化正常,已准备就绪!\r\n");
8 E% L& M* P& E; o# n7 z$ q. x - LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
* q/ W- J# n& Q8 S - % L9 C- u! U2 H
- while(1)1 L5 M% }. }6 s6 E6 {3 s
- { 4 S( j( ]$ l4 ?( c% F9 p1 g5 E
- ! M8 |: s! R6 U/ Z: ]* ^, u
- SHT30_read_result(0x44);# S3 n# t* `0 j) V) U! ]
- sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);1 X5 o/ j l. \$ e# o9 i" D6 l
- sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);
6 J5 w* E! u' b* m' o - LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);7 N5 _% G3 @% F" Y1 J1 u
- LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);
0 ]% j( _1 g" D* B - delay_ms(2000);
- |. b3 n8 P! B* q* ^ - }
( v) ?' i- }: G8 [/ {6 {& l - }
) u# T2 N0 M+ v1 ~
复制代码
$ o; X5 s! n4 z0 c, U4 B四、实验结果& X' u9 e3 Z9 t& R, `, `$ c8 ]
7 p0 g1 E- x* f" ~/ N( @5 x" I o) j
9 m, l( I7 v% `2 ^6 L
9 f1 N: z0 t- c8 n: `7 l————————————————! r2 B% \0 b8 d* S9 W) H
版权声明:@slow-walker
6 ` t5 |. n, s
1 C. a: N; j; s$ L
3 U0 Y( M7 {: s# m) E& G* E |