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)
|