標(biāo)題:
STM32F4+DHT11數(shù)字溫濕度傳感器源程序 帶注釋
[打印本頁]
作者:
Red_Sky
時(shí)間:
2020-2-29 18:16
標(biāo)題:
STM32F4+DHT11數(shù)字溫濕度傳感器源程序 帶注釋
stm32 MCU單片機(jī)源程序如下:
#include "stm32f4xx.h"
#include "sys.h"
#include "stdio.h"
u8 buf[5]={0}; //u8 uint8
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; //配置優(yōu)先級(jí)
void delay_us(uint32_t n)
{
while(n--)
{
SysTick->CTRL = 0; //關(guān)閉系統(tǒng)定時(shí)器
SysTick->LOAD = 168; //決定了延時(shí)時(shí)間,假如這里是延時(shí)1us,計(jì)數(shù)值為168(前提時(shí)鐘源為168MHz)
SysTick->VAL = 0; //清空標(biāo)志位
SysTick->CTRL = 5; //使用PLL作為時(shí)鐘源,并讓系統(tǒng)定時(shí)器工作
while ((SysTick->CTRL & 0x00010000)==0);//等待系統(tǒng)定時(shí)器減到0,CTRL寄存器的COUNT標(biāo)志位置位
SysTick->CTRL = 0; //關(guān)閉系統(tǒng)定時(shí)器
}
}
void delay_ms(uint32_t n)
{
while(n--)
{
SysTick->CTRL = 0; //關(guān)閉系統(tǒng)定時(shí)器
SysTick->LOAD = 168000; //決定了延時(shí)時(shí)間,假如這里是延時(shí)1ms,計(jì)數(shù)值為168000(前提時(shí)鐘源為168MHz)
SysTick->VAL = 0; //清空標(biāo)志位
SysTick->CTRL = 5; //使用PLL作為時(shí)鐘源,并讓系統(tǒng)定時(shí)器工作
while ((SysTick->CTRL & 0x00010000)==0);//等待系統(tǒng)定時(shí)器減到0,CTRL寄存器的COUNT標(biāo)志位置位
SysTick->CTRL = 0; //關(guān)閉系統(tǒng)定時(shí)器
}
}
//重定義fputc file putchar() printf
int fputc(int ch,FILE *f)
{
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
void usart1_init(void)
{
//使能端口A的時(shí)鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//使能串口1的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//配置端口A的引腳,為復(fù)用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//9 10號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //輸出模式
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會(huì)增加功耗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOA, &GPIO_InitStructure); //配置端口F
//將PA9和PA10引腳連接到串口1硬件
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//配置串口1的參數(shù)
USART_InitStructure.USART_BaudRate = 9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數(shù)據(jù)位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1個(gè)停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //無校驗(yàn)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持?jǐn)?shù)據(jù)收發(fā)
USART_Init(USART1, &USART_InitStructure);
//使能串口1工作
USART_Cmd(USART1,ENABLE);
//配置串口1中斷的優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1的中斷號(hào)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優(yōu)先級(jí)0x03
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //響應(yīng)(子)優(yōu)先級(jí)0x03
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1的中斷
NVIC_Init(&NVIC_InitStructure);
//使能接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}
void usart3_init(uint32_t baud)
{
//使能端口B的時(shí)鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//使能串口3的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//配置端口B的引腳,為復(fù)用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//10 11號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復(fù)用功能模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口F
//將PB10和PB11引腳連接到串口3硬件
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
//配置串口3的參數(shù)
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數(shù)據(jù)位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1個(gè)停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //無校驗(yàn)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持?jǐn)?shù)據(jù)收發(fā)
USART_Init(USART3, &USART_InitStructure);
//使能串口3工作
USART_Cmd(USART3,ENABLE);
//配置串口3中斷的優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //串口3的中斷號(hào)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優(yōu)先級(jí)0x03
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //響應(yīng)(子)優(yōu)先級(jí)0x03
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1的中斷
NVIC_Init(&NVIC_InitStructure);
//使能接收中斷
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
}
int dht11_init(void)
{
int t=0;
int i=0,j=0;
u8 d=0;
//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
//配置端口G的引腳,為復(fù)用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會(huì)增加功耗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口G
PGout(9)=0;
delay_ms(20);
PGout(9)=1;
delay_us(30);
//配置端口G的引腳,為復(fù)用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //輸入模式
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會(huì)增加功耗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口G
while(PGin(9))
{
t++;
delay_us(1);
if(t>1000)
{
return -1;
}
}
t=0;
while(PGin(9)==0)
{
t++;
delay_us(1);
if(t>100)
{
return -2;
}
}
t=0;
while(PGin(9))
{
t++;
delay_us(1);
if(t>100)
{
return -3;
}
}
for(i=0;i<5;i++)
{
d=0;
for(j=7;j>=0;j--)
{
t=0;
while(PGin(9)==0)
{
t++;
delay_us(1);
if(t>100)
{
return -4;
}
}
delay_us(40);
if(PGin(9))
{
d|=1<<j;
t=0;
while(PGin(9))
{
t++;
delay_us(1);
if(t>100)
{
return -5;
}
}
}
}
buf[i]=d;
}
//結(jié)束通信,延時(shí)100us忽略掉
delay_us(100);
//計(jì)算校驗(yàn)和
d = buf[0]+buf[1]+buf[2]+buf[3];
if(d!=buf[4])
return -6;
return 0;
}
void usart3_send_str(int8_t *pbuf)
{
while(*pbuf!='\0')
{
USART_SendData(USART3,*pbuf++);
//等待數(shù)據(jù)發(fā)送完畢
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
}
}
void USART1_IRQHandler(void)
{
uint8_t d;
//檢測(cè)是否有接收到數(shù)據(jù)
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
//接收數(shù)據(jù)
d=USART_ReceiveData(USART1);
//將接收到的數(shù)據(jù)返發(fā)給串口1
//usart1_send_bytes(&d,1);
USART_SendData(USART1,d);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
//清空標(biāo)志位,告訴CPU,已經(jīng)完成中斷請(qǐng)求,可以處理新的數(shù)據(jù)
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
void USART3_IRQHandler(void)
{
uint8_t d;
//檢測(cè)是否有接收到數(shù)據(jù)
if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
{
//接收數(shù)據(jù)
d=USART_ReceiveData(USART3);
if(d==0x41)
{
PFout(9)=!PFout(9);
}
printf("%c",d);
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
}
}
int main(void)
{
int ii;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
//配置PG9引腳,為輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會(huì)增加功耗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口F
PGout(9)=1;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//配置PG9引腳,為輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會(huì)增加功耗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
GPIO_Init(GPIOF, &GPIO_InitStructure); //配置端口F
usart1_init();
usart3_init(9600);
while(1)
{
ii=dht11_init();
printf("ii=%d T=%hhd.%hhd,H=%hhd.%hhd\r\n",ii, buf[2],buf[3],buf[0],buf[1]);
delay_ms(6000);
}
}
復(fù)制代碼
所有資料51hei提供下載:
溫濕度.7z
(1.35 MB, 下載次數(shù): 55)
2020-3-1 01:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
xx不放火
時(shí)間:
2020-6-4 17:22
文件不完整
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1