版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、扫一扫,关注公众号 永久使用 无限制使用次数 极速轻巧 超低资源占用,告别卡顿慢 自由编辑 享受wo r d 一样的编辑自由 立即下载购买会员 福昕高级p d f 编辑器 个人版 永久 轻巧 自由 基于 stm32 的温湿度检测 一、 设计概述 1. 设计要求 对 stm32 的 usart1、spi、外设(温湿度传感器、0.96 寸的 oled 显示屏)进 行操作,具体通过 usart1 读取 dht11 的温湿度值 ,在 0.96 寸 oled 屏上显示出 来,同时通过串口发送给 pc 显示。 实验器材有 stm32f103 系列开发板、dht11 温湿度传感器、0.96 寸 oled 显
2、 示屏、杜邦线若干。 2. stm32 的 usart 和 spi 简介 2.1. usart 主要特性 串口作为 mcu 的重要外部接口,同时也是软件开发重要的调试手段, 其重要 性不言而喻。stm32 的串口资源相当丰富的,功能也相当强劲。本次实验的 stm32f103 开发板最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信 和 半 双 工 单 线 通 讯 、 支 持 lin 、 支 持 调 制 解 调 器 操 作 、 智 能 卡 协 议 和 irda sir endec 规范、具有 dma 等。 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,gpio 时钟使
3、能 2) 串口复位 3) gpio 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 nvic(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 2.2 spi 主要特性 spi(serial peripheral interface)是一种串行同步通讯协议,由一个主设备和一 个或多个从设备组成, 主设备启动一个与从设备的同步通讯, 从而完成数据的交换。 spi 接口一般由 4 根线组成,cs 片选信号(有的单片机上也称为 nss) ,sclk 时钟 信号线,miso 数据线(主机输入从机输出) ,mosi 数据线(主机输出从机输入) , cs 决定了唯一的
4、与主设备通信的从设备,如没有 cs 信号,则只能存在一个从设 备,主设备通过产生移位时钟信号来发起通讯。通讯时主机的数据由 miso 输入, 由 mosi 输出,输入的数据在时钟的上升或下降沿被采样,输出数据在紧接着的下 降或上升沿被发出(具体由 spi 的时钟相位和极性的设置而决定) 。 3. dht11 使用说明 dht11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感 器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠 性与卓越的长期稳定性。 传感器包括一个电阻式感湿元件和一个 ntc 测温元件, 并 与一个高性能 8 位单片机相连接。因此该产品具有
5、品质卓越、超快响应、抗干扰能 力强、性价比极高等优点。每个 dht11 传感器都在极为精确的湿度校验室中进行 校准。 校准系数以程序的形式储存在 otp 内存中, 传感器内部在检测信号的处理过 程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体 积、极低的功耗,信号传输距离可达 20 米以上,使其成为各类应用甚至最为苛刻 的应用场合的最佳选则。 产品为 4 针单排引脚封装。 连接方便, 特殊封装形式可根 据用户需求而提供。 引脚接线如下: 本实验中 pa8 接 dht11 的 pin2 脚 data 用于微处理器与 dht11 之间的通讯和同步,采用单总线数据格式,一次
6、通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分 用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为 40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温 度小数数据+8bit 校验和 数据传送正确时校验和数据等于“8bit 湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据”所得结果的末 8 位。 总线空闲状态为高电平,主机把总线拉低等待 dht11 响应,主机把总线拉低必须 大于 18 毫秒,保证 dht11 能检测到起始信号。dht11 接收到主机的开始信号后
7、,等 待主机开始信号结束,然后发送 80us 低电平响应信号.主机发送开始信号结束后,延 时等待 20-40us 后, 读取 dht11 的响应信号,主机发送开始信号后,可以切换到输入 模式,或者输出高电平均可, 总线由上拉电阻拉高。 总线为低电平,说明 dht11 发送响应信号,dht11 发送响应信号后,再把总线拉 高 80us,准备发送数据,每一 bit数据都以 50us 低电平时隙开始,高电平的长短定了数 据位是 0 还是 1.格式见下面图示.如果读取响应信号为高电平,则 dht11 没有响应, 请检查线路是否连接正常.当最后一 bit 数据传送完毕后,dht11 拉低总线 50us,
8、随 后总线由上拉电阻拉高进入空闲状态。 封装说明: 引脚说明: pin 名称 注释 1 vdd 供电 35.5vdc 2 data 串行数据,单总线 3 nc 空脚,请悬空 4 gnd 接地,电源负极 4. oled 使用说明 oled,即有机发光二极管(organic light-emitting diode) ,又称为有机电 激光显示(organic electroluminesence display, oeld) 。因为具备轻薄、省电等 特性,因此从 2003 年开始,这种显示设备在 mp3 播放器上得到了广泛应用,而 对于同属数码类产品的 dc 与手机,此前只是在一些展会上展示过采用
9、 oled 屏 幕的工程样品,还并未走入实际应用的阶段。但 oled 屏幕却具备了许多 lcd 不 可比拟的优势。 目前 oled 显示屏广泛用于手机、mp3、工控显示设备上,具有 亮度高、显示精度高、功耗低等特点。 oled 模块特点: 1、超强兼容性:兼容 3.3v 和 5v 电源供电,不需要任何外围电路,5v 供电的 mcu 系统不需要稳压到 3.3v 给 oled 模块供电,可直接接 5v 电源;3.3v 的 mcu 供电系统 oled 模块也是直接 3.3v。通信口在 3.3v 和 5v 供电的情况下 无需接限流电阻,模块内部已经接上了,大大节约产品开发成本。 2、超小体积:模块尺寸
10、大小约为 2.7cm*2.7cm,没任何多余部分。 3、超窄边框设计:1mm 超窄边框设计,更美观,屏幕贴得更正。 4、采用 4 线 spi 操作:操作简单,刷写速度快,普通 i/o 就可以操作。 oled 模块采用 4 线 spi 操作, 黄蓝双色屏和蓝色屏操作相同。 管脚定义如下图: 管脚从左到右定义为: gnd: 电源地 vcc: 供电电源 3.3v、5v 都可以 d0: clk 时钟 d1: mosi 数据 rst: 复位 dc: 数据/命令 二、 外设引脚接线定义 1. dht11 温湿度传感器: pin1 接 3-5v 电源, pin2 接 pa8 复用引脚, pin3 悬空, p
11、in4 接地 2. oled 显示屏:pb12 接 rst,pb1 接 dc,pb13 接 d0 , pb15 接 d1 三、 软件程序设计 3.1 系统流程图 3.2 主要程序说明 下图为该工程的目录结构: 1. 系统启动程序代码 2. 用户程序代码 3. 标准函数库 4. 描述文件 5. 系统核心文件 本次实验用到了 stm32f103 特有的定时器 systick: systick 就是一个定时器而已,只是它放在了 nvic 中, 主要的目的是为 了给操作系统提供一个硬件上的中断 (号称滴答中断) , 其特点是能产生精确的 定时。我们设置的定时初值是 72,由于晶振是 72mhz 即定时
12、时间为 1 微秒, 由于使用的 dht11 需要进行高低电平的激发为高性能模式,同时 dht11 发数 据的格式也是根据高低电平的时间长短来区别的,这样设计使得程序的设计更 为方便。其中自定义了串口格式化输出函数,使得输出更为方便,同时还自定 义的整形到字符的函数,使得 oled 的显示更为方便。 3.3. 主要程序源码 #define globals /* includes -*/ #include demo.h #include static _io uint32_t timingdelay; void delay(_io uint32_t ntime); void rcc_configu
13、ration(void); void usart1_init(void); void usart_out(usart_typedef* usartx, uint8_t *data,.); char *itoa(int value, char *string, int radix); extern void lcd_p12x24str(unsigned char x, unsigned char y,unsigned char ch); extern void lcd_p12x24str_f(unsigned char x, unsigned char y,unsigned char ch);
14、extern void lcd_p24x40str(unsigned char x, unsigned char y,unsigned char ch); extern void lcd_p24x32ch(unsigned char x, unsigned char y, unsigned char n, const unsigned char * ch); unsigned char rh_h,rh_l,t_h,t_l,sumcheck=0,temp,succ=0,count=0; extern unsigned char wd; extern unsigned char sd; exter
15、n unsigned char du; /* * * 名 称:void delay(_io uint32_t ntime) * 功 能:定时延时程序 1ms 为单位 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 * */ void delay(_io uint32_t ntime) timingdelay = ntime; while(timingdelay != 0); /* * * 名 称:void timingdelay_decrement(void) * 功 能:获取节拍程序 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 * */ void
16、timingdelay_decrement(void) if (timingdelay != 0 x00) timingdelay-; / /spi2 接口配置/ void spi_configuration(void) spi_inittypedef spi_initstructure; gpio_inittypedef gpio_initstructure; rcc_apb1periphclockcmd( rcc_apb1periph_spi2, enable); /* spi2 引脚定义 pb13-spi2_sck pb15-spi2_mosi */ gpio_initstructure
17、.gpio_pin = gpio_pin_13 | gpio_pin_15 ; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpiob, /* pb12-oled rst 引脚定义 */ gpio_initstructure.gpio_pin = gpio_pin_12 ; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_spe
18、ed = gpio_speed_50mhz; gpio_init(gpiob, /* pb1-oled c/d 引脚定义 */ gpio_initstructure.gpio_pin = gpio_pin_1 ; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpiob, /* 配置 spi2 oled 片选 pb0 */ gpio_initstructure.gpio_pin = gpio_pin_0; gpio_init
19、structure.gpio_speed = gpio_speed_50mhz; /输出模式最大速 度 50mhz gpio_initstructure.gpio_mode = gpio_mode_out_pp; /通用推挽输出模 式 gpio_init(gpiob, /* spi2 config -*/ spi_initstructure.spi_direction = spi_direction_1line_tx; /spi_direction_2lines_fullduplex; spi_initstructure.spi_mode = spi_mode_master; spi_init
20、structure.spi_datasize = spi_datasize_8b; spi_initstructure.spi_cpol = spi_cpol_high; spi_initstructure.spi_cpha = spi_cpha_2edge; spi_initstructure.spi_nss = spi_nss_soft; spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_16; spi_initstructure.spi_firstbit = spi_firstbit_msb; spi_init
21、structure.spi_crcpolynomial = 7; spi_init(spi2, /* enable spi2 */ spi_cmd(spi2, enable); /* * * 名 称:void led_config(void) * 功 能:led 控制初始化函数 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 * */ void led_config(void) gpio_inittypedef gpio_initstructure; gpio_initstructure.gpio_pin = gpio_pin_5; /led1 v1 配 置 为通用推挽输出
22、 gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; /口线翻转速度为 50mhz gpio_init(gpiob, gpio_initstructure.gpio_pin = gpio_pin_8; /pa6 配置为通用推 挽输出 gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; /口线翻转速度为 50
23、mhz gpio_init(gpioa, gpio_setbits(gpioa, gpio_pin_8); delay(100000); gpio_resetbits(gpiob, gpio_pin_5); /led1 灭 /* * * 名 称:unsigned char read_dat(void) * 功 能:dht11 读数据 * 入口参数:无 * 出口参数:返回 8 位的数据 * 说 明: * 调用方法:无 * */ unsigned char read_dat(void) unsigned char i=0,temp=0; while(i8) count=0; while(gpio_
24、readinputdatabit(gpioa,gpio_pin_8)=0 /1bit 开始 count=0; temp=temp1; while(gpio_readinputdatabit(gpioa,gpio_pin_8)=1 / 读 取有效的 1bit if(count30) temp=temp /26- 28us 代表读取位为 0 else temp=temp|0 x01; /70us 代表读取位为 1 i+; return(temp); /* * * 名 称:void read_rt(void) * 功 能:读湿度和读温度 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法
25、:无 * */ void read_rt(void) unsigned char tp=0; gpio_inittypedef gpio_initstructure; delay(100); gpio_initstructure.gpio_pin = gpio_pin_8; /pa8 配置为通用推 挽输出 接 dht11 的 pin2 脚 gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; /口线翻转速度 为 50mhz gpio_init(gpio
26、a, gpio_setbits(gpioa, gpio_pin_8); delay(1000000); /延时 1 秒 gpio_resetbits(gpioa, gpio_pin_8); delay(20000); /延时 20ms gpio_setbits(gpioa, gpio_pin_8); delay(25); /延时 25us gpio_initstructure.gpio_pin = gpio_pin_8; /pa8 配置为浮空输 入 gpio_initstructure.gpio_mode = gpio_mode_in_floating; gpio_initstructure.
27、gpio_speed = gpio_speed_50mhz; /口线翻转速度 为 50mhz gpio_init(gpioa, delay(30); if(gpio_readinputdatabit(gpioa,gpio_pin_8)=0) /判断是否出现 低 80us 响应 count=0; while(gpio_readinputdatabit(gpioa,gpio_pin_8)=0 /低 80uc 响应 count=0; while(gpio_readinputdatabit(gpioa,gpio_pin_8)=1 /高 80us 响应 rh_h=read_dat(); /读湿度整 数部
28、分 rh_l=read_dat(); /读湿度小 数部分 t_h=read_dat(); /读温度整 数部分 t_l=read_dat(); /读温度小数部 分 sumcheck=read_dat(); /读校验和 tp=rh_h+rh_l+t_h+t_l; /计算校验 和 if(tp=sumcheck) succ=1; /读取成功 else succ=0; /读取失败 count=0; else succ=0; /读取失败 if(succ=1) gpio_setbits(gpiob, gpio_pin_5); /led1 亮 else gpio_resetbits(gpiob, gpio_p
29、in_5); /led1 灭 /* * * 名 称:int main(void) * 功 能:主函数 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法: * */ int main(void) rcc_configuration(); /设置内部时钟及外设时钟使能 usart1_init(); /串口 1 初始化 spi_configuration(); if (systick_config(72) /时钟节拍中断时 1us 一次 用于定时 /* capture error */ while (1); led_config(); lcd_init(); while(1) read
30、_rt(); if(succ) led_on(); usart_out(usart1,rn 串口1打印 湿度 和温度 - rn); usart_out(usart1,the current value = %d %d rn, rh_h,t_h); itoa(t_h, dis_str1,10); /测的数值转为字符串 /延时 400ms lcd_p24x32ch(0,0,3,wd); lcd_p24x32ch(0,4,3,sd); if(t_h10) lcd_p12x24str(84,1, ); lcd_p12x24str(72,1,dis_str1); lcd_p24x32ch(96,0,1,
31、du); itoa(rh_h, dis_str1,10); /测的数值转为字符串 if(rh_h10) lcd_p12x24str(84,5, %); else lcd_p12x24str(96,5,%); lcd_p12x24str(72,5,dis_str1); else led_off(); /* * * 名 称:void rcc_configuration(void) * 功 能:系统时钟配置为 72mhz(stm32f103 的最高频率), 外设时钟配置 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 * */ void rcc_configuration(voi
32、d) systeminit(); /stm32 系统启动,必须加 /gpioa,gpiob,gpioc 复用使能 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_gpioc , enable); /* * * 名 称:void usart1_init(void) * 功 能:串口 1 初始化函数 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法:无 * */ void usart1_init(void) gpio_inittypedef gpio_initstr
33、ucture; usart_inittypedef usart_initstructure; usart_clockinittypedef usart_clockinitstructure; rcc_apb2periphclockcmd( rcc_apb2periph_usart1 , enable); /使能串口 1 时钟 gpio_initstructure.gpio_pin = gpio_pin_9; /usart1 tx gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gp
34、io_mode_af_pp; /复用推挽输出 gpio_init(gpioa, /a 端口 gpio_initstructure.gpio_pin = gpio_pin_10; /usart1 rx gpio_initstructure.gpio_mode = gpio_mode_in_floating; /复用开漏输入 gpio_init(gpioa, /a 端口 usart_clockinitstructure.usart_clock = usart_clock_disable; usart_clockinitstructure.usart_cpol = usart_cpol_high;
35、usart_clockinitstructure.usart_cpha = usart_cpha_2edge; usart_clockinit(usart1, /usart1 的具体参数设置 usart_initstructure.usart_baudrate = 115200; /速率 115200bps usart_initstructure.usart_wordlength = usart_wordlength_8b; /数据位8位 usart_initstructure.usart_stopbits = usart_stopbits_1; /停止位 1 位 usart_initstru
36、cture.usart_parity = usart_parity_no; /无校验位 usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none; /无硬件流控 usart_initstructure.usart_mode = usart_mode_rx | usart_mode_tx; /收发模式 /* 配置 usart1 */ usart_init(usart1, /配置串口 参数函数 /* 使能 usart1 */ usart_cmd(usart1, enable); /* 整形数据转字符
37、串函数 char *itoa(int value, char *string, int radix) radix=10 标示是 10 进制 非十进制,转换结果为 0; 例:d=-379; 执行 itoa(d, buf, 10); 后 buf=-379 */ char *itoa(int value, char *string, int radix) int i, d; int flag = 0; char *ptr = string; /* this implementation only works for decimal numbers. */ if (radix != 10) *ptr
38、= 0; return string; if (!value) *ptr+ = 0 x30; *ptr = 0; return string; /* if this is a negative value insert the minus sign. */ if (value 0; i /= 10) d = value / i; if (d | flag) *ptr+ = (char)(d + 0 x30); value -= (d * i); flag = 1; /* null terminate the string. */ *ptr = 0; return string; /* ncl_itoa */ /* *
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中联新能源科技开发公司招聘考试真题2024
- 2025年深圳市优才人力资源有限公司公开招聘聘员(派遣至深圳市龙岗区工信局)的备考题库及答案详解一套
- 2025年上饶市广信区人民法院公开招聘劳务派遣工作人员14人备考题库及答案详解1套
- 航天科工微电子系统研究院有限公司2026年校园招聘5人备考题库及答案详解1套
- 2025怀柔实验室新疆研究院职能管理岗位招聘(1人)参考考试题库及答案解析
- 2025广西北海市老干部活动中心(北海市老年大学)招录公益性岗位人员1人备考笔试题库及答案解析
- 2025山东德州临邑县人民医院招聘备案制工作人员15人考试重点题库及答案解析
- 2025年锂电池铜箔技术创新方向报告
- 国家知识产权局专利局专利审查协作北京中心福建分中心2026年度专利审查员公开招聘备考题库及参考答案详解一套
- 2025年中国社会科学院考古研究所石窟寺考古研究室考古技师招聘备考题库及参考答案详解
- 运城十三县考试题及答案
- 【书法练习】中考语文古诗文硬笔字帖(田英章字体)
- DB65-T 4900-2025 新能源发电升压站验收技术规范
- 贵州省市政工程计价定额2025定额说明(重要)
- 车辆日常保养与维护课件
- 农村集体经济发展讲座
- 2025年工会职工大会制度实施细则
- 2025运动户外圈层人群洞察白皮书
- 2025广西公需科目培训考试答案(90分)一区两地一园一通道建设人工智能时代的机遇与挑战
- 酸洗钝化工安全教育培训手册
- 汽车发动机测试题(含答案)
评论
0/150
提交评论