找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3486|回复: 1
打印 上一主题 下一主题
收起左侧

STM32F4+DHT11数字温湿度传感器源程序 带注释

[复制链接]
跳转到指定楼层
楼主
ID:700249 发表于 2020-2-29 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32 MCU单片机源程序如下:
  1. #include "stm32f4xx.h"
  2. #include "sys.h"
  3. #include "stdio.h"

  4. u8 buf[5]={0};   //u8 uint8
  5. GPIO_InitTypeDef   GPIO_InitStructure;
  6. USART_InitTypeDef USART_InitStructure;
  7. NVIC_InitTypeDef   NVIC_InitStructure;        //配置优先级
  8. void delay_us(uint32_t n)
  9. {
  10.         while(n--)
  11.         {
  12.                 SysTick->CTRL = 0;                         //关闭系统定时器
  13.                 SysTick->LOAD = 168;         //决定了延时时间,假如这里是延时1us,计数值为168(前提时钟源为168MHz)
  14.                
  15.                 SysTick->VAL = 0;                         //清空标志位
  16.                
  17.                 SysTick->CTRL = 5;                        //使用PLL作为时钟源,并让系统定时器工作
  18.                
  19.                 while ((SysTick->CTRL & 0x00010000)==0);//等待系统定时器减到0,CTRL寄存器的COUNT标志位置位
  20.                
  21.                 SysTick->CTRL = 0;                         //关闭系统定时器        
  22.         
  23.         }
  24. }


  25. void delay_ms(uint32_t n)
  26. {
  27.         while(n--)
  28.         {
  29.                 SysTick->CTRL = 0;                         //关闭系统定时器
  30.                 SysTick->LOAD = 168000;         //决定了延时时间,假如这里是延时1ms,计数值为168000(前提时钟源为168MHz)
  31.                
  32.                 SysTick->VAL = 0;                         //清空标志位
  33.                
  34.                 SysTick->CTRL = 5;                        //使用PLL作为时钟源,并让系统定时器工作
  35.                
  36.                 while ((SysTick->CTRL & 0x00010000)==0);//等待系统定时器减到0,CTRL寄存器的COUNT标志位置位
  37.                
  38.                 SysTick->CTRL = 0;                         //关闭系统定时器        
  39.         
  40.         }

  41. }

  42. //重定义fputc   file     putchar()  printf
  43. int fputc(int ch,FILE *f)
  44. {
  45.         USART_SendData(USART1,ch);
  46.         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

  47.         return ch;
  48. }
  49. void usart1_init(void)
  50. {
  51.         
  52.         //使能端口A的时钟
  53.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  54.         
  55.         //使能串口1的时钟
  56.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  57.         
  58.         
  59.         //配置端口A的引脚,为复用功能模式
  60.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//9 10号引脚
  61.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                //输出模式
  62.         //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出,增加输出电流,也会增加功耗
  63.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  64.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  65.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                //配置端口F        
  66.         
  67.         
  68.         //将PA9和PA10引脚连接到串口1硬件
  69.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
  70.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
  71.         
  72.         //配置串口1的参数
  73.         USART_InitStructure.USART_BaudRate = 9600;                                                //波特率
  74.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //8位数据位
  75.         USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //1个停止位
  76.         USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验
  77.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
  78.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //支持数据收发
  79.         USART_Init(USART1, &USART_InitStructure);                                       
  80.         
  81.         
  82.         
  83.         //使能串口1工作
  84.         USART_Cmd(USART1,ENABLE);
  85.         
  86.         //配置串口1中断的优先级
  87.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                        //串口1的中断号
  88.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级0x03
  89.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                //响应(子)优先级0x03
  90.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能串口1的中断
  91.         NVIC_Init(&NVIC_InitStructure);

  92.         //使能接收中断
  93.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  94. }

  95. void usart3_init(uint32_t baud)
  96. {


  97.         //使能端口B的时钟
  98.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  99.         
  100.         //使能串口3的时钟
  101.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  102.         
  103.         
  104.         //配置端口B的引脚,为复用功能模式
  105.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//10 11号引脚
  106.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                //复用功能模式
  107.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  108.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  109.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                //配置端口F        
  110.         
  111.         
  112.         //将PB10和PB11引脚连接到串口3硬件
  113.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
  114.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
  115.         
  116.         //配置串口3的参数
  117.         USART_InitStructure.USART_BaudRate = baud;                                                //波特率
  118.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //8位数据位
  119.         USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //1个停止位
  120.         USART_InitStructure.USART_Parity = USART_Parity_No;                                //无校验
  121.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
  122.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //支持数据收发
  123.         USART_Init(USART3, &USART_InitStructure);                                       
  124.         
  125.         
  126.         
  127.         //使能串口3工作
  128.         USART_Cmd(USART3,ENABLE);
  129.         
  130.         //配置串口3中断的优先级
  131.         NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;                        //串口3的中断号
  132.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级0x03
  133.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                //响应(子)优先级0x03
  134.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能串口1的中断
  135.         NVIC_Init(&NVIC_InitStructure);

  136.         //使能接收中断
  137.         USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
  138. }

  139. int dht11_init(void)
  140. {
  141.         int t=0;
  142.         int i=0,j=0;
  143.         u8 d=0;
  144.         
  145.         //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  146.         
  147.         //配置端口G的引脚,为复用功能模式
  148.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9号引脚
  149.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //输出模式
  150.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出,增加输出电流,也会增加功耗
  151.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  152.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  153.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                //配置端口G
  154.         
  155.         PGout(9)=0;
  156.         delay_ms(20);
  157.         PGout(9)=1;
  158.         delay_us(30);
  159.         
  160.         //配置端口G的引脚,为复用功能模式
  161.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9号引脚
  162.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                //输入模式
  163.         //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出,增加输出电流,也会增加功耗
  164.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  165.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  166.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                //配置端口G        
  167.         
  168.         while(PGin(9))
  169.         {
  170.                 t++;
  171.                 delay_us(1);
  172.                 if(t>1000)
  173.                 {
  174.                         return -1;
  175.                 }
  176.         }
  177.         
  178.         t=0;
  179.         while(PGin(9)==0)
  180.         {
  181.                 t++;
  182.                 delay_us(1);
  183.                 if(t>100)
  184.                 {
  185.                         return -2;
  186.                 }
  187.         }
  188.         
  189.         t=0;
  190.         while(PGin(9))
  191.         {
  192.                 t++;
  193.                 delay_us(1);
  194.                 if(t>100)
  195.                 {
  196.                         return -3;
  197.                 }
  198.         }
  199.         
  200.         for(i=0;i<5;i++)
  201.         {
  202.                 d=0;
  203.                 for(j=7;j>=0;j--)
  204.                 {
  205.                         t=0;
  206.                         while(PGin(9)==0)
  207.                         {
  208.                                 t++;
  209.                                 delay_us(1);
  210.                                 if(t>100)
  211.                                 {
  212.                                         return -4;
  213.                                 }
  214.                         }
  215.                         
  216.                         delay_us(40);
  217.                         
  218.                         if(PGin(9))
  219.                         {
  220.                                 d|=1<<j;
  221.                                 
  222.                                 t=0;
  223.                                 
  224.                                 while(PGin(9))
  225.                                 {
  226.                                         t++;
  227.                                         delay_us(1);
  228.                                         if(t>100)
  229.                                         {
  230.                                                 return -5;
  231.                                         }
  232.                                 }
  233.                         }               
  234.                 }
  235.                 buf[i]=d;
  236.         }
  237.         
  238.         //结束通信,延时100us忽略掉
  239.         delay_us(100);
  240.         
  241.         //计算校验和
  242.         d = buf[0]+buf[1]+buf[2]+buf[3];
  243.         
  244.         if(d!=buf[4])
  245.                 return -6;
  246.         return 0;
  247. }

  248. void usart3_send_str(int8_t *pbuf)
  249. {

  250.         while(*pbuf!='\0')
  251.         {
  252.                 USART_SendData(USART3,*pbuf++);
  253.                
  254.                 //等待数据发送完毕
  255.                 while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
  256.         }
  257. }



  258. void USART1_IRQHandler(void)
  259. {
  260.         uint8_t d;
  261.         
  262.         //检测是否有接收到数据
  263.         if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
  264.         {        
  265.         
  266.                 //接收数据
  267.                 d=USART_ReceiveData(USART1);
  268.                
  269.                 //将接收到的数据返发给串口1
  270.                 //usart1_send_bytes(&d,1);
  271.                 USART_SendData(USART1,d);
  272.                 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  273.         
  274.                 //清空标志位,告诉CPU,已经完成中断请求,可以处理新的数据

  275.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  276.         }
  277. }

  278. void USART3_IRQHandler(void)
  279. {
  280.         uint8_t d;
  281.         
  282.         //检测是否有接收到数据
  283.         if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
  284.         {        
  285.         
  286.                 //接收数据
  287.                 d=USART_ReceiveData(USART3);
  288.                
  289.                
  290.                 if(d==0x41)
  291.                 {
  292.                         PFout(9)=!PFout(9);
  293.                 }
  294.                
  295.                 printf("%c",d);

  296.                 USART_ClearITPendingBit(USART3,USART_IT_RXNE);
  297.         }
  298. }

  299. int main(void)
  300. {
  301.         int ii;
  302.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  303.         
  304.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  305.         
  306.         //配置PG9引脚,为输出模式
  307.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //9号引脚
  308.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //输出模式
  309.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出,增加输出电流,也会增加功耗
  310.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  311.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  312.         GPIO_Init(GPIOG, &GPIO_InitStructure);                                //配置端口F        
  313.         
  314.         PGout(9)=1;
  315.         
  316.         
  317.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  318.         
  319.         //配置PG9引脚,为输出模式
  320.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //9号引脚
  321.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                //输出模式
  322.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //推挽输出,增加输出电流,也会增加功耗
  323.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //引脚最大的工作速度为100MHz,速度越快,功耗就越高
  324.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //没有上下拉电阻
  325.         GPIO_Init(GPIOF, &GPIO_InitStructure);                                //配置端口F        
  326.         usart1_init();
  327.         usart3_init(9600);
  328.         
  329.         
  330.         
  331.         
  332.         
  333.         while(1)
  334.         {
  335.                 ii=dht11_init();
  336.                 printf("ii=%d  T=%hhd.%hhd,H=%hhd.%hhd\r\n",ii, buf[2],buf[3],buf[0],buf[1]);
  337.                 delay_ms(6000);
  338.         }
  339.         
  340. }
复制代码

所有资料51hei提供下载:
温湿度.7z (1.35 MB, 下载次数: 55)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:282650 发表于 2020-6-4 17:22 来自手机 | 只看该作者
文件不完整
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表