标题:
多个DS18B20同时工作的STM32源程序 GPIO输入输出
[打印本页]
作者:
44556677
时间:
2017-11-10 15:21
标题:
多个DS18B20同时工作的STM32源程序 GPIO输入输出
一个单片机带4个18b20工作,数据通过串口输出
注意:需要先把DS18B20接到 U16 这个接口,板子并没有板载DS18B20
实验现象:1、串口打印出序列号和温度
2、在打印的同时,D3闪烁
GPIO寄存器描述
1、端口配置低寄存器(GPIOx_CRL)(x = A...E)
2、端口配置高寄存器(GPIOx_CRH)(x = A...E)
3、端口输入数据寄存器(GPIOx_IDR)(x = A...E)
这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。
4、端口输出数据寄存器(GPIOx_ODR)(x = A...E)
只能以字(16bit)的形式操作,复位值全是0。写0即输出0,写1即输出1。
5、端口位设置/清除寄存器(GPIOx_BSRR)(x = A...E)
高16bit写1用于清0,低16bit写1用于置位,同时写1的话低16bi有效。
6、端口位清除寄存器(GPIOx_BRR)(x = A...E)
低16位写1用于置位。
7、端口配置锁定寄存器(GPIOx_LCKR)(x = A...E)
单片机源程序如下:
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @brief systick系统定时器
******************************************************************************
*
******************************************************************************
*/
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"
#include "bsp_usart1.h"
#include "bsp_ds18b20.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
uint8_t uc1, ucDs18b20Id1 [ 8 ];
uint8_t uc2, ucDs18b20Id2 [ 8 ];
uint8_t uc3, ucDs18b20Id3 [ 8 ];
uint8_t uc4, ucDs18b20Id4 [ 8 ];
/* 配置SysTick 为1us中断一次 */
SysTick_Init();
USARTx_Config(); //初始化串口1
printf("\r\n this is a ds18b20 test demo \r\n");
while( 1 )
{
while( DS18B20_Init() )
printf("\r\n no ds18b20 exit \r\n");
printf("\r\n ds18b20 exit \r\n");
DS18B20_ReadId ( ucDs18b20Id1 ); // 读取 DS18B20 的序列号
//printf("\r\nDS18B20的序列号是: 0x");
//for ( uc1 = 0; uc1 < 8; uc1 ++ ) // 打印 DS18B20 的序列号 1
//printf ( "%.2x", ucDs18b20Id1 [ uc1 ] );
printf ( "\r\n获取传感器一的温度: %.1f\r\n", DS18B20_GetTemp_SkipRom ( ) ); // 打印通过 DS18B20 序列号获取的温度值
Delay_ms(1000); /* 1s 读取一次温度值 */
while( DS18B20_Init2() )
DS18B20_ReadId2 ( ucDs18b20Id2 ); // 读取 DS18B20 的序列号
//printf("\r\nDS18B20的序列号是: 0x");
//for ( uc2 = 0; uc2 < 8; uc2 ++ ) // 打印 DS18B20 的序列号 2
//printf ( "%.2x", ucDs18b20Id2 [ uc2 ] );
printf ( "\r\n获取传感器二的的温度: %.1f\r\n", DS18B20_GetTemp_SkipRom2 ( ) ); // 打印通过 DS18B20 序列号获取的温度值
Delay_ms(1000); /* 1s 读取一次温度值 */
while( DS18B20_Init3() )
DS18B20_ReadId3 ( ucDs18b20Id3 ); // 读取 DS18B20 的序列号
//rintf("\r\nDS18B20的序列号是: 0x");
//for ( uc3 = 0; uc3 < 8; uc3 ++ ) // 打印 DS18B20 的序列号 3
//printf ( "%.2x", ucDs18b20Id3 [ uc3 ] );
printf ( "\r\n获取传感器三的温度: %.1f\r\n", DS18B20_GetTemp_SkipRom3 ( ) ); // 打印通过 DS18B20 序列号获取的温度值
Delay_ms(1000); /* 1s 读取一次温度值 */
while( DS18B20_Init4() )
DS18B20_ReadId4 ( ucDs18b20Id4 ); // 读取 DS18B20 的序列号
//printf("\r\nDS18B20的序列号是: 0x");
//for ( uc4 = 0; uc4 < 8; uc4 ++ ) // 打印 DS18B20 的序列号 4
//printf ( "%.2x", ucDs18b20Id4 [ uc4 ] );
printf ( "\r\n获取传感器四的温度: %.1f\r\n", DS18B20_GetTemp_SkipRom4 ( ) ); // 打印通过 DS18B20 序列号获取的温度值
Delay_ms(1000); /* 1s 读取一次温度值 */
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
GPIO输入输出—DS18B20_多_好.rar
(332.78 KB, 下载次数: 88)
2017-11-10 21:24 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
wcy1223
时间:
2017-12-2 21:11
4个ds18b20要怎么接,我找不到U16
作者:
三观残存
时间:
2018-5-14 12:04
好像对寄存器不太熟悉
作者:
poisonbee
时间:
2021-9-24 09:59
现在的你看你当初写的代码是不是想笑
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1