標(biāo)題:
多個DS18B20同時工作的STM32源程序 GPIO輸入輸出
[打印本頁]
作者:
44556677
時間:
2017-11-10 15:21
標(biāo)題:
多個DS18B20同時工作的STM32源程序 GPIO輸入輸出
一個單片機帶4個18b20工作,數(shù)據(jù)通過串口輸出
注意:需要先把DS18B20接到 U16 這個接口,板子并沒有板載DS18B20
實驗現(xiàn)象:1、串口打印出序列號和溫度
2、在打印的同時,D3閃爍
GPIO寄存器描述
1、端口配置低寄存器(GPIOx_CRL)(x = A...E)
2、端口配置高寄存器(GPIOx_CRH)(x = A...E)
3、端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)(x = A...E)
這些位為只讀并只能以字(16位)的形式讀出。讀出的值為對應(yīng)I/O口的狀態(tài)。
4、端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)(x = A...E)
只能以字(16bit)的形式操作,復(fù)位值全是0。寫0即輸出0,寫1即輸出1。
5、端口位設(shè)置/清除寄存器(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系統(tǒng)定時器
******************************************************************************
*
******************************************************************************
*/
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"
#include "bsp_usart1.h"
#include "bsp_ds18b20.h"
/**
* @brief 主函數(shù)
* @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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
GPIO輸入輸出—DS18B20_多_好.rar
(332.78 KB, 下載次數(shù): 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
現(xiàn)在的你看你當(dāng)初寫的代碼是不是想笑
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1