STM32入门学习笔记之温湿度采集实验4

11.5 ds18b20例程功能实现:读取ds18b20的温度显示在tftlcd上。
(1)创建ds18b20.h文件,并输入以下代码。
#ifndef _ds18b20_h_#define _ds18b20_h_#include sys.h/********************************************************************************************************* 端 口 分 配*********************************************************************************************************/#define ds18b20_dq_out pgout( 11 ) //数据端口#define ds18b20_dq_in pgin( 11 )/********************************************************************************************************* 函 数 列 表*********************************************************************************************************/void ds18b20_init( void ) ; //初始化ds18b20short ds18b20_get_temp( void ) ; //获取温度#endif(2)创建ds18b20.c文件,并输入以下代码。
#include ds18b20.h#include delay.h/***************************************************name :ds18b20_write_bytefunction :发送1个字节paramater : byte:发送的字节return :none***************************************************/void ds18b20_write_byte( u8 byte ){ u8 i ; gpiog->crh &= 0xffff0fff ; gpiog->crh |= 0x00003000 ; for( i=0; i>= 1 ; }}/***************************************************name :ds18b20_read_bytefunction :读取1个字节paramater :nonereturn :读取的字节***************************************************/u8 ds18b20_read_byte(){ u8 i, byte=0 ; for( i=0; i>= 1 ; gpiog->crh &= 0xffff0fff ; gpiog->crh |= 0x00003000 ; ds18b20_dq_out = 0 ; delay_us( 2 ) ; ds18b20_dq_out = 1 ; gpiog->crh &= 0xffff0fff ; gpiog->crh |= 0x00008000 ; delay_us( 12 ) ; if( ds18b20_dq_in ) byte |= 0x80 ; delay_us( 50 ) ; } return byte ;}/***************************************************name :ds18b20_checkfunction :等待ds18b20的回应paramater :nonereturn :none***************************************************/void ds18b20_check() { gpiog->crh &= 0xffff0fff ; gpiog->crh |= 0x00003000 ; ds18b20_dq_out = 0 ; //拉低dq delay_us( 750 ); //拉低750us ds18b20_dq_out = 1 ; //dq=1 delay_us( 15 ) ; //15us gpiog->crh &= 0xffff0fff ; gpiog->crh |= 0x00008000 ; while( ds18b20_dq_in ) ; //等待应答 while( ds18b20_dq_in==0 ); //等待应答结束}/***************************************************name :ds18b20_initfunction :初始化ds18b20paramater :nonereturn :none***************************************************/void ds18b20_init(){ rcc->apb2enr |= 1crh |= 0x00003000 ; gpiog->odr |= 1<7 ) { th = ~th ; tl = ~tl ; } temp = th ; //获得高八位 temp <7 ) return temp ; //返回温度值 else return -temp ;}(3)创建1.c文件,并输入以下代码。
#include sys.h#include delay.h#include usart1.h#include lcd.h#include ds18b20.hint main(){ short temp ; u8 str[] = temperature:+000.00 'c ; stm32_clock_init( 9 ) ; //stm32时钟初始化 systick_init( 72 ) ; //systick初始化 usart1_init( 72, 115200 ) ; //初始化串口1波特率115200 lcd_init() ; //lcd初始化 ds18b20_init() ; //ds18b20初始化 while( 1 ) { temp = ds18b20_get_temp(); //读取温度 if( tempcrh &= 0xffff0fff ; //pg11推挽输出 gpiog->crh |= 0x00003000 ; dht11_dq_out = 0 ; //拉低dq delay_ms( 20 ) ; //拉低至少18ms dht11_dq_out = 1 ; //dq=1 delay_us( 30 ); //主机拉高20~40us gpiog->crh &= 0xffff0fff; //pg11上拉输入 gpiog->crh |= 0x00008000; //dht11会拉低40~80us retry = 0 ; while( ( dht11_dq_in==1 )&&( retry=100 ) return 1 ; else retry = 0 ; //dht11拉低后会再次拉高40~80us while( ( dht11_dq_in==0 )&&( retry=100 ) return 1 ; return 0 ;}/***************************************************name :dht11_read_bytefunction :读取1个字节paramater :nonereturn :读取的字节***************************************************/u8 dht11_read_byte(){ u8 i, byte=0; for (i=0;i<8;i++) { byte <<= 1 ; while( dht11_dq_in ) ; //等待变为低电平 while( dht11_dq_in==0 ) ; //等待变高电平 delay_us( 40 ) ; //等待40us if( dht11_dq_in ) byte |= 0x01 ; } return byte ;}/***************************************************name :dht11_get_datafunction :获取温湿度paramater : temp:温度值(范围:0~50°) humi:湿度值(范围:20%~90%)return : 0:正常 1:读取失败***************************************************/u8 dht11_get_data( u8 *temp, u8 *humi ){ u8 i, buf[ 5 ] ; if( dht11_check()==0 ) { //读取40位数据 for( i=0; iapb2enr |= 1crh |= 0x00003000 ; gpiog->odr |= 1<<11 ; //输出1 if( dht11_check() ) return 1 ; return 0 ;}(3)创建1.c文件,并输入以下代码。
#include sys.h#include delay.h#include usart1.h#include lcd.h#include dht11.hint main(){ u8 temp, humi; u8 str1[ 20 ] ; u8 str2[ 20 ] ; stm32_clock_init( 9 ) ; //stm32时钟初始化 systick_init( 72 ) ; //systick初始化 usart1_init( 72, 115200 ) ; //初始化串口1波特率115200 lcd_init() ; //lcd初始化 while( dht11_init() ) //dht11初始化 { lcd_showstring( 100, 100, dht11 error!!! ) ; delay_ms( 200 ) ; lcd_showstring( 100, 100, ) ; delay_ms( 200 ) ; } while( 1 ) { //读取温湿度 if( dht11_get_data( &temp, &humi )==0 ) { sprintf( ( char * )str1, temperature:%02d c, temp ) ; lcd_showstring( 100, 100, str1 ) ; //显示温度值 sprintf( ( char * )str2, humidity:%02d rh%%, temp ) ; lcd_showstring( 100, 116, str2 ) ; //显示湿度值 } delay_ms( 500 ) ; }}

南疆首例飞秒激光近视手术成功_飞秒激光治疗近视手术进入了“无刀时代”
Cortex-M核心寄存器和位域
美国最大射电望远镜阿雷西博严重受损:予以拆除
coverpoint是什么意思
紫光展锐“换帅”!赵伟国退出,新董事长是他
STM32入门学习笔记之温湿度采集实验4
FEV CONSULTING荣获福布斯2022年全球最佳管理咨询公司奖
传感器与plc控制器的接线方法
浅谈眼球追踪解决VR/AR三大问题
安创加速器2018年青睐的8个初创项目,个个身手不凡
fpga是什么 fpga用什么编程语言
近半年来半导体十大烂尾项目盘点
新型远程反舰导弹LRASM连续6次飞行测试成功
华为Mate10评测 更快更智慧的全能旗舰名副其实
超声波传感器应用AGV移动小车测距应用解决方案
寒冬没能冻住的中国面板
PCB走线如何避免锐角
慧荣科技荣获全球半导体联盟2016最佳财务管理半导体公司奖
KWP2000协议分析和基于CANoe的开发测试
最值得期待的黑科技?自动驾驶等都是以人工智能为基础的