新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2014-9-26
- 在线时间
- 0 小时
|
5金钱
#include <stdio.h>
#include"stm32f10x.h"
#define uint unsigned int
uint us = 0;
uint ms = 0;
__IO uint32_t TimingDelay;//设置全局变量
//__IO uint i;
USART_InitTypeDef USART_InitStructure;
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
void SysTickInit(uint Hzsecond) //滴答定时器初始化
{
if(SysTick_Config(SystemCoreClock / Hzsecond))
{
while(1);
}
}
void SysTickDelay(__IO uint32_t nTime)//滴答定时器延时
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
void SysTick_Handler(void)//滴答定时器中断
{
TimingDelay_Decrement();
}
void NVIC_GroupConfig(void)
{
/* 配置NVIC中断优先级分组:
- 1比特表示主优先级 主优先级合法取值为 0 或 1
- 3比特表示次优先级 次优先级合法取值为 0..7
- 数值越低优先级越高,取值超过合法范围时取低bit位
*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*==================================================================================
NVIC_PriorityGroup | 主优先级范围 | 次优先级范围 | 描述
==================================================================================
NVIC_PriorityGroup_0 | 0 | 0-15 | 0 比特表示主优先级
| | | 4 比特表示次优先级
----------------------------------------------------------------------------------
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 比特表示主优先级
| | | 3 比特表示次优先级
----------------------------------------------------------------------------------
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 比特表示主优先级
| | | 2 比特表示次优先级
----------------------------------------------------------------------------------
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 比特表示主优先级
| | | 1 比特表示次优先级
----------------------------------------------------------------------------------
NVIC_PriorityGroup_4 | 0-15 | 0 | 4 比特表示主优先级
| | | 0 比特表示次优先级
==================================================================================*/
}
void GPIO_Configure_OUT() //引脚输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void GPIO_Configure_IN() //引脚出入配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void DHT11_Rst(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
SysTickDelay(20000);
GPIO_SetBits(GPIOA,GPIO_Pin_11);
SysTickDelay(30);
}
uint DHT11_Check(void)
{
uint retry = 0;
uint i = 1;
GPIO_Configure_IN();
i = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
while(!i && retry<100)
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;
else retry = 0;
while(!i && retry<100)
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;
else return 0;
}
int DHT11(void)
{
GPIO_Configure_OUT();
GPIO_SetBits(GPIOA,GPIO_Pin_11);
DHT11_Rst();
return DHT11_Check();
}
uint DHT11_Read_Bit(void)
{
uint retry = 0,i = 0;
i = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
while(i && retry<100)
{
retry++;
SysTickDelay(1);
}
retry = 0;
while(!i && retry<100)
{
retry++;
SysTickDelay(1);
}
SysTickDelay(40);
if(i) return 1;
else return 0;
}
uint DHT11_Read_Byte(void)
{
uint i,dat;
dat = 0;
for(i=0;i<8;i++)
{
dat<<=1;
dat |= DHT11_Read_Bit();
}
return dat;
}
uint DHT11_Read_Data(uint *temp,uint *humi)
{
uint buf[5];
uint j;
DHT11_Rst();
if(DHT11_Check() == 0)
{
for(j=0;j<5;j++)
{
buf[j] = DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
else return 1;
} return 0;
}
//void RCC_Configuration(void) { /* Setup the microcontroller system. Initialize the Embedded Flash Interface, initialize the PLL and update the SystemFrequency variable. */ SystemInit(); }
void Usart()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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;
// GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
int main()
{
uint t=0;
uint temperature,humidty;
SystemInit();
Usart();
SysTickInit(1000000);//初始化滴答定时us级延时
printf("\n\r----------------------------------------\n");
printf("\n\rthis is my DHT11\r\n");
// printf("\n\r---------------------------------------------\n");
// printf("\n\rWWW.ARMJISHU.COM\n ");
while(DHT11())
{
printf("\r\n-------DHT11初始化失败----\r\n");
}
printf("\r\n-------DHT11初始化----\r\n");
while(1)
{
DHT11_Read_Data(&temperature,&humidty);
printf("\r\n---当前温度是('C):%d\r\n",temperature);
printf("\r\n---当前湿度是(%):%d\r\n",humidty);
SysTickInit(100000);
}
}
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
return ch;
}
谢谢大家指教 求助
|
|