标题:
STM32F4+DHT11数字温湿度传感器源程序 带注释
[打印本页]
作者:
Red_Sky
时间:
2020-2-29 18:16
标题:
STM32F4+DHT11数字温湿度传感器源程序 带注释
stm32 MCU单片机源程序如下:
#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; //配置优先级
void delay_us(uint32_t n)
{
while(n--)
{
SysTick->CTRL = 0; //关闭系统定时器
SysTick->LOAD = 168; //决定了延时时间,假如这里是延时1us,计数值为168(前提时钟源为168MHz)
SysTick->VAL = 0; //清空标志位
SysTick->CTRL = 5; //使用PLL作为时钟源,并让系统定时器工作
while ((SysTick->CTRL & 0x00010000)==0);//等待系统定时器减到0,CTRL寄存器的COUNT标志位置位
SysTick->CTRL = 0; //关闭系统定时器
}
}
void delay_ms(uint32_t n)
{
while(n--)
{
SysTick->CTRL = 0; //关闭系统定时器
SysTick->LOAD = 168000; //决定了延时时间,假如这里是延时1ms,计数值为168000(前提时钟源为168MHz)
SysTick->VAL = 0; //清空标志位
SysTick->CTRL = 5; //使用PLL作为时钟源,并让系统定时器工作
while ((SysTick->CTRL & 0x00010000)==0);//等待系统定时器减到0,CTRL寄存器的COUNT标志位置位
SysTick->CTRL = 0; //关闭系统定时器
}
}
//重定义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的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//使能串口1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//配置端口A的引脚,为复用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//9 10号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //输出模式
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流,也会增加功耗
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的参数
USART_InitStructure.USART_BaudRate = 9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持数据收发
USART_Init(USART1, &USART_InitStructure);
//使能串口1工作
USART_Cmd(USART1,ENABLE);
//配置串口1中断的优先级
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1的中断号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级0x03
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //响应(子)优先级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的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//使能串口3的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//配置端口B的引脚,为复用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//10 11号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能模式
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的参数
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持数据收发
USART_Init(USART3, &USART_InitStructure);
//使能串口3工作
USART_Cmd(USART3,ENABLE);
//配置串口3中断的优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //串口3的中断号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级0x03
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //响应(子)优先级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的引脚,为复用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流,也会增加功耗
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的引脚,为复用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流,也会增加功耗
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;
}
//结束通信,延时100us忽略掉
delay_us(100);
//计算校验和
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++);
//等待数据发送完毕
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
}
}
void USART1_IRQHandler(void)
{
uint8_t d;
//检测是否有接收到数据
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
//接收数据
d=USART_ReceiveData(USART1);
//将接收到的数据返发给串口1
//usart1_send_bytes(&d,1);
USART_SendData(USART1,d);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
//清空标志位,告诉CPU,已经完成中断请求,可以处理新的数据
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
void USART3_IRQHandler(void)
{
uint8_t d;
//检测是否有接收到数据
if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
{
//接收数据
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号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流,也会增加功耗
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号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流,也会增加功耗
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);
}
}
复制代码
所有资料51hei提供下载:
温湿度.7z
(1.35 MB, 下载次数: 55)
2020-3-1 01:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
xx不放火
时间:
2020-6-4 17:22
文件不完整
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1