精华内容
下载资源
问答
  • 此次实验用了5根杜邦线...小风扇的正极接在STM32的PA6上;当程序下载到开发板以后,在程序设置了温度达到20度-25度时,小风扇转动;所以当温度达到20度-25度时,小风扇转动;温度低于20度时或高于25度时,小风扇不转。
  • STM32温控风扇

    2019-03-30 14:13:41
    此次实验用了5根杜邦线...小风扇的正极接在STM32的PA6上;当程序下载到开发板以后,在程序设置了温度达到20度-25度时,小风扇转动;所以当温度达到20度-25度时,小风扇转动;温度低于20度时或高于25度时,小风扇不转。
  • 基于STM32温控风扇设计综合实践论文
  • 基于stm32温控风扇

    2019-01-05 17:10:02
    采用stm系列单片机,根据温度来实验对风扇转速的自动调节。
  • 基于stm32开发的智能温控风扇 带LCD档位显示
  • 资源为源代码,硬件部分采用STM32C8T6作为主控芯片,由一个1.3寸OLED显示屏,四个独立按键,一个DS18B20测温模块,一个L298N电机驱动,一个12V直流电源,一个12V的CPU风扇,一个LM2596降压模块构成
  • 基于STM32单片机的智能风扇,PWM输出 具有HCSR501模块的人体感应功能 DHT11的温度读取功能
  • 基于STM32智能温控自调速风扇PID控制研究.pdf
  • 基于STM32温控风扇的设计程序

    万次阅读 多人点赞 2016-03-06 11:27:06
    这周末有空,自己完成一个用STM32开发板加上一个电脑散热风扇,以及DS18B0完成了一温控和手动的...下面直接分享温控风扇的主要程序: 一、DS18B20程序: #inlcude “stm32f10x.h” #include "ds18b20.h" static

    这周末有空,自己完成一个用STM32开发板加上一个电脑散热风扇,以及DS18B0完成了一温控和手动的风扇。主要功能是:1、自动模式,利用温度控制风扇的转速以及风扇的开关;

    2、手动模式,通过按键控制风扇的转速和开关。

    下面直接分享温控风扇的主要程序:


    一、DS18B20程序:

    #inlcude “stm32f10x.h”

    #include "ds18b20.h"
    static void DS18B20_GPIO_Config(void)
    {
    /*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);    
      GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    /*调用库函数,初始化DS18B20_PORT*/
      GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

    GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);  
    }

    static void DS18B20_Mode_IPU(void)
    {
       GPIO_InitTypeDef GPIO_InitStructure;
     GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
     GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    }

    /*
     * 函数名:DS18B20_Mode_Out_PP
     * 描述  :使DS18B20-DATA引脚变为输出模式
     * 输入  :无
     * 输出  :无
     */
    static void DS18B20_Mode_Out_PP(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;   
      GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    }


    /*
     *主机给从机发送复位脉冲
     */
    static void DS18B20_Rst(void)
    {
    /* 主机设置为推挽输出 */
    DS18B20_Mode_Out_PP();

    DS18B20_DATA_OUT=0;
    /* 主机至少产生480us的低电平复位信号 */
    delay_us(750);

    /* 主机在产生复位信号后,需将总线拉高 */
    DS18B20_DATA_OUT=1;

    /*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/
    delay_us(15);
    }


    /*
     * 检测从机给主机返回的存在脉冲
     * 1:成功
     * 0:失败
     */
    int DS18B20_Check(void)
    {
    uint8_t pulse_time = 0;

    /* 主机设置为上拉输入 */
    DS18B20_Mode_IPU();

    /* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 
    * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
    */
    while( DS18B20_DATA_IN() && pulse_time<100 )
    {
    pulse_time++;
    delay_us(1);
    }
    /* 经过100us后,存在脉冲都还没有到来*/
    if( pulse_time >=100 )
    return 0;
    else
    pulse_time = 0;

    /* 存在脉冲到来,且存在的时间不能超过240us */
    while( !DS18B20_DATA_IN() && pulse_time<240 )
    {
    pulse_time++;
    delay_us(1);
    }
    if( pulse_time >=240 )
    return 0;
    else
    return 1;
    }


    /*
     * 从DS18B20读取一个bit
     */
    static uint8_t DS18B20_Read_Bit(void)
    {
    uint8_t dat;

    /* 读0和读1的时间至少要大于60us */
    DS18B20_Mode_Out_PP();
    /* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */
    DS18B20_DATA_OUT=0;
    delay_us(10);

    /* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */
    DS18B20_Mode_IPU();
    //Delay_us(2);

    if( DS18B20_DATA_IN() == SET )
    dat = 1;
    else
    dat = 0;

    /* 这个延时参数请参考时序图 */
    delay_us(45);

    return dat;
    }


    /*
     * 从DS18B20读一个字节,低位先行
     */
    uint8_t DS18B20_Read_Byte(void)
    {
    uint8_t i, j, dat = 0;

    for(i=0; i<8; i++) 
    {
    j = DS18B20_Read_Bit();
    dat = (dat) | (j<<i);
    }

    return dat;
    }


    /*
     * 写一个字节到DS18B20,低位先行
     */
    void DS18B20_Write_Byte(uint8_t dat)
    {
    uint8_t i, testb;
    DS18B20_Mode_Out_PP();

    for( i=0; i<8; i++ )
    {
    testb = dat&0x01;
    dat = dat>>1;
    /* 写0和写1的时间至少要大于60us */
    if (testb)
    {
    DS18B20_DATA_OUT=0;
    /* 1us < 这个延时 < 15us */
    delay_us(8);

    DS18B20_DATA_OUT=1;
    delay_us(58);
    }
    else
    {
    DS18B20_DATA_OUT=0;
    /* 60us < Tx 0 < 120us */
    delay_us(70);

    DS18B20_DATA_OUT=1;
    /* 1us < Trec(恢复时间) < 无穷大*/
    delay_us(2);
    }
    }
    }


    void DS18B20_Start(void)
    {
    DS18B20_Rst();   
    DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
    DS18B20_Write_Byte(0X44); /* 开始转换 */
    }


    void DS18B20_Init(void)
    {
    DS18B20_GPIO_Config();
    DS18B20_Rst();

    // return DS18B20_Presence();
    }


    /*
     * 存储的温度是16 位的带符号扩展的二进制补码形式
     * 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位
     *
     *         |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
     * 低字节  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
     *
     *
     *         |-----符号位:0->正  1->负-------|-----------整数-----------|
     * 高字节  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |
     *
     * 
     * 温度 = 符号位 + 整数 + 小数*0.0625
     */
    float DS18B20_Get_Temp(void)
    {
    uint8_t tpmsb, tplsb;
    short s_tem;
    float f_tem;

    DS18B20_Rst();
    delay_us(300);
    DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
    DS18B20_Write_Byte(0X44); /* 开始转换 */

    DS18B20_Rst();
    delay_us(300);
    DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
    DS18B20_Write_Byte(0XBE); /* 读温度值 */

    tplsb = DS18B20_Read_Byte();  
    tpmsb = DS18B20_Read_Byte(); 

    s_tem = tpmsb<<8;
    s_tem = s_tem | tplsb;

    if( s_tem < 0 ) /* 负温度 */
    f_tem = (~s_tem+1) * 0.0625;
    else
    f_tem = s_tem * 0.0625;

    return f_tem;
    }

    二、利用PWM风扇控制程序:

    #include "stm32f10x.h"
    #include "fanner.h"
    #include "ds18b20.h"
    #include "delay.h"
    #include "lcd.h"




    u16 change;   //保存温度变化
    int flag=0; //作为手动挡和自动挡
    int pluse=79; //保存捕获比较寄存器的值
    int j=1; //电风扇手动挡档数


    /*设置风扇相关的GPIO,定时器和捕获比较的设置*/
    void fanner_config(void)
    {

    GPIO_InitTypeDef GPIO_InitStructer;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
    TIM_OCInitTypeDef TIM_OCInitStructer;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    GPIO_InitStructer.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructer);

    TIM_TimeBaseInitStructer.TIM_Period=99; //周期为100
    TIM_TimeBaseInitStructer.TIM_Prescaler=71;
    TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructer);

    TIM_OCInitStructer.TIM_OCMode=TIM_OCMode_PWM1; //pwm模式1,小于比较捕获寄存器的值为有效电平
    TIM_OCInitStructer.TIM_OutputState=TIM_OutputState_Enable;
    TIM_OCInitStructer.TIM_Pulse=0;
    TIM_OCInitStructer.TIM_OCPolarity=TIM_OCPolarity_Low; //有效电平为低电平,pwm输入到风扇负极,比较寄存器越大,低电平时间越长
    TIM_OC3Init(TIM3, &TIM_OCInitStructer);
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_Cmd(TIM3, ENABLE); //开计数器

    }


    /*风扇控制*/
    void temp_con(void)
    {

    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
    {
    delay_ms(10);
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
    {
    while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1);
    flag++;
    }
    }
    /*自动情况*/
    if(flag%2==0)
    {
    LCD_Clear(0, 60, 100, 20, BLACK);
    LCD_DispStr(66, 60,"atuo", WHITE);

    change=(int)DS18B20_Get_Temp();


    if(change>26 || change<22) //温度在22-17度之间,风扇转速随温度升高而加快
    {

    TIM_SetCompare3(TIM3, 0);
    }
    else
    {
    TIM_SetCompare3(TIM3, change*5-31); //随温度调节捕获比较寄存器的值,调整转速
    }
    }
    /*手动模式*/
    if(flag%2!=0) 
    {
    LCD_DispStr(66, 60,"human", WHITE);
    LCD_DisNum(56,60,j,WHITE);
    TIM_SetCompare3(TIM3, pluse);

    if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0)
    {
    delay_ms(10);
    if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0)
    {
    while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0);
    pluse=pluse+5;
    j=j+1;

    if(pluse>99)
    {
    pluse=79;
    j=1;
    }
    LCD_DisNum(56,60,j,WHITE);
    TIM_SetCompare3(TIM3, pluse);
    }
    }

    }

    }



    展开全文
  • 文章目录1 简介2 绪论2.1 课题背景3 系统设计3.1 系统架构3.2 硬件部分3.2.1 DS18B20 ...基于stm32的智能温控风扇设计与实现 大家可用于 课程设计 或 毕业设计 技术解答、毕设帮助、开题指导 print("Q 746876041") 2


    1 简介

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

    基于stm32的智能温控风扇设计与实现

    大家可用于 课程设计 或 毕业设计

    技术解答、毕设帮助、开题指导
    print("Q 746876041") 
    

    2 绪论

    2.1 课题背景

    随着科技的日新月异,智能家居逐渐走入普通家庭,风扇作为基本的家用电器也将成为智能家居的一部分。这里介绍的是以STM32单片机为控制单元并结合嵌入式技术设计的一款具有温控调速、液晶显示温度等信息的智能电风扇。经过前期设计、制作和最终的测试得出,该风扇电源稳定性好,操作方便,运行可靠,功能强大,价格低廉,节约能耗,能够满足用户多元化的需求。该风扇具有的人性化设计和低廉的价格很适合普通用户家庭使用。

    3 系统设计

    3.1 系统架构

    设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在LCD1602上。根据温度的不同,利用STM32对风扇进行调速,总体硬件设计如下图所示
    在这里插入图片描述

    3.2 硬件部分

    3.2.1 DS18B20 简介

    DS18B20 是美国 DALLAS 半导体公司继 DS1820 之后最新推出的一种改进型智能温度传感器。 与传统的热敏电阻相比, 它能够直接读出被测温度并且可根据实际要求通过简单的编程实现 9~12 位的数字值读数方式。

    在这里插入图片描述

    3.2.2 LCD1602 液晶屏简介

    1602 液晶也叫 1602 字符型液晶, 它是一种专门用来显示字母、 数字、 符号等的点阵型液晶模块。 它由若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔, 每行之间也有间隔, 起到了字符间距和行间距的作用, 正因为如此所以它不能很好地显示图形

    在这里插入图片描述

    3.3 软件部分

    3.3.1 整体软件流程

    控制系统软件使用 C 语言编程。

    使用模块化设计, 除主程序外, 还有各功能子程序, 分别执行直流电机驱动调速及温度采集、 显示等功能, 编辑环境采用集成开发环环境 Keil。

    程序总体运行流程图如下:

    在这里插入图片描述

    3.3.2 初始化

    系统初始化包括 STM32 系统定时器初始化, GPIO 口初始化以及 LCD1602 初始化等。

    在这里插入图片描述

    3.3.3 温度采集与显示

    DS18B20 温度传感器进行温度采集时, 要依次进行初始化, ROM 操作指令, 存储器操作指令, 数据传输等操作

    在这里插入图片描述

    3.4 实现效果

    在这里插入图片描述

    在这里插入图片描述

    3.5 部分相关代码

    
    /************************************************
     作者:丹成学长,Q746876041
    ************************************************/
    1.主函数
    #include "stm32f10x.h"
    #include "bsp_SysTick.h"
    #include <LCD1602.h>
    #include "bsp_ds18b20.h"
    int main()
    { int PWM,low,zhouqi;
    float wendu;
     int wendu1;
     zhouqi=500;
     low=zhouqi-PWM;
     SysTick_Init();
     init1602();
    lcdpos(1,0);
    writestring("TEM: 00.0");
     GPIO_SetBits(GPIOB,GPIO_Pin_0);
    while( DS18B20_Init()) 
     {
    lcdpos(0,0);
     writestring(" no ds18b20 exit");
    }
     lcdpos(0,0);
     writestring("ds18b20 exit");
     for(;;)
     {
    DS18B20_Get_Temp(wendu);
     if (wendu<0)
     { lcdpos(1,4);
     writestring("-");
    }
      wendu1=wendu*100;
     lcdpos(1,5);
     write_dat(wendu1/10000+0x30);
    lcdpos(1,6);
      write_dat(wendu1%10000/1000+0x30);
      lcdpos(1,7);
      write_dat(wendu1%1000/100+0x30);
      lcdpos(1,9);
      write_dat(wendu1%100/10+0x30);
      lcdpos(1,10);
    write_dat(wendu1%10+0x30);
      Delay_ms(2000);
     if(wendu1>30)
     { low=500;
     GPIO_SetBits(GPIOB,GPIO_Pin_0);
    Delay_ms(PWM);
    }  
     if(wendu1<15)
     { low=0;
      GPIO_SetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(PWM);
    }
     if(wendu1>=15&wendu1<20)
     { low=100;
    GPIO_SetBits(GPIOB,GPIO_Pin_0);
     Delay_ms(PWM);
     GPIO_ResetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(low);
    } 
      if(wendu1>=20&wendu1<25)
      {
    low=200;
      GPIO_SetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(PWM);
      GPIO_ResetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(low);
      }
     if(wendu1>=25&wendu1<30)
     { low=300;
    GPIO_SetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(PWM);
      GPIO_ResetBits(GPIOB,GPIO_Pin_0);
      Delay_ms(low);
    }
     }
    }
    2.DS18B20 子程序
    #include "bsp_ds18b20.h"
    /*
    * 函数名: DS18B20_GPIO_Config
    * 描述 : 配置 DS18B20 用到的 I/O 口
    * 输入 : 无
    * 输出 : 无
    */
    static void DS18B20_GPIO_Config(void)
    { 
    /*定义一个 GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;
    /*开启 DS18B20_PORT 的外设时钟*/
    RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
    /*选择要控制的 DS18B20_PORT 引脚*/
    GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
    /*设置引脚模式为通用推挽输出*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    /*设置引脚速率为 50MHz */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    /*调用库函数, 初始化 DS18B20_PORT*/
    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
    }
    /*
    * 函数名: DS18B20_Mode_IPU
    * 描述 : 使 DS18B20-DATA 引脚变为输入模式
    * 输入 : 无
    * 输出 : 无
    */
    static void DS18B20_Mode_IPU(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    /*选择要控制的 DS18B20_PORT 引脚*/
    GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
    /*设置引脚模式为浮空输入模式*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    /*调用库函数, 初始化 DS18B20_PORT*/
    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    }
    /*
    * 函数名: DS18B20_Mode_Out_PP
    * 描述 : 使 DS18B20-DATA 引脚变为输出模式
    * 输入 : 无
    * 输出 : 无
    */
    static void DS18B20_Mode_Out_PP(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    /*选择要控制的 DS18B20_PORT 引脚*/
    GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
    /*设置引脚模式为通用推挽输出*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    /*设置引脚速率为 50MHz */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    /*调用库函数, 初始化 DS18B20_PORT*/
    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    }
    /*
    *主机给从机发送复位脉冲
    */
    static void DS18B20_Rst(void)
    {
    /* 主机设置为推挽输出 */
    DS18B20_Mode_Out_PP();
    DS18B20_DATA_OUT(LOW);
    /* 主机至少产生 480us 的低电平复位信号 */
    Delay_us(750);
    /* 主机在产生复位信号后, 需将总线拉高 */
    DS18B20_DATA_OUT(HIGH);
    Delay_us(15);
    }
    /*
    * 检测从机给主机返回的存在脉冲
    * 0: 成功
    * 1: 失败
    */
    static uint8_t DS18B20_Presence(void)
    {
    uint8_t pulse_time = 0;
    /* 主机设置为上拉输入 */
    DS18B20_Mode_IPU();
    while( DS18B20_DATA_IN() && pulse_time<100 )
    {
    pulse_time++;
    Delay_us(1);
    } 
    / * 经过 100us 后, 存在脉冲都还没有到来*/
    if( pulse_time >=100 )
    return 1;
    else
    pulse_time = 0;
    
    /* 存在脉冲到来, 且存在的时间不能超过 240us */
    while( !DS18B20_DATA_IN() && pulse_time<240 )
    {
    pulse_time++;
    Delay_us(1);
    } 
    if( pulse_time >=240 )
    return 1;
    else
    return 0;
    }
    /*
    * 从 DS18B20 读取一个 bit
    */
    static uint8_t DS18B20_Read_Bit(void)
    {
    uint8_t dat; /* 读 0 和读 1 的时间至少要大于 60us */
    DS18B20_Mode_Out_PP();
    /* 读时间的起始: 必须由主机产生 >1us <15us 的低电平信号 */
    DS18B20_DATA_OUT(LOW);
    Delay_us(10);
    / * 设置成输入, 释放总线, 由外部上拉电阻将总线拉高 */
    DS18B20_Mode_IPU();
    //Delay_us(2);
    if( DS18B20_DATA_IN() == SET )
    dat = 1;
    else
    dat = 0;
    /* 这个延时参数请参考时序图 */
    Delay_us(45);
    return dat;
    }
    /*
    * 从 DS18B20 读一个字节, 低位先行
    */
    uint8_t DS18B20_Read_Byte(void)
    {
    uint8_t i, j, dat = 0;
    for(i=0; i<8; i++)
    {
    j = DS18B20_Read_Bit();
    dat = (dat) | (j<<i);
    }
    return dat;
    }
    /*
    * 写一个字节到 DS18B20, 低位先行
    */
    void DS18B20_Write_Byte(uint8_t dat)
    {
    uint8_t i, testb;
    DS18B20_Mode_Out_PP();
    for( i=0; i<8; i++ )
    {
    testb = dat&0x01;
    dat = dat>>1; 
    /* 写 0 和写 1 的时间至少要大于 60us */
    if (testb)
    {  
    DS18B20_DATA_OUT(LOW);
    /* 1us < 这个延时 < 15us */
    Delay_us(8);
    DS18B20_DATA_OUT(HIGH);
    Delay_us(58);
    } 
    else
    {  
    DS18B20_DATA_OUT(LOW);
    /* 60us < Tx 0 < 120us */
    Delay_us(70);
    DS18B20_DATA_OUT(HIGH);  
    /* 1us < Trec(恢复时间) < 无穷大*/
    Delay_us(2);
    }
    }
    }
    void DS18B20_Start(void)
    {
    DS18B20_Rst(); 
    DS18B20_Presence();
    DS18B20_Write_Byte(0XCC);  /* 跳过 ROM */
    DS18B20_Write_Byte(0X44);  /* 开始转换 */
    }
    uint8_t DS18B20_Init(void)
    {
    DS18B20_GPIO_Config();
    DS18B20_Rst();
    return DS18B20_Presence();
    }
    float DS18B20_Get_Temp(float f_tem)
    {
    uint8_t tpmsb, tplsb;
    short s_tem;
    DS18B20_Rst(); 
    DS18B20_Presence();
    DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
    DS18B20_Write_Byte(0X44);    /* 开始转换 */
    DS18B20_Rst();
    DS18B20_Presence();
    DS18B20_Write_Byte(0XCC);    /* 跳过 ROM */
    DS18B20_Write_Byte(0XBE);    /* 读温度值 */
    tplsb = DS18B20_Read_Byte(); 
    tpmsb = DS18B20_Read_Byte();
    s_tem = tpmsb<<8;
    s_tem = s_tem | tplsb;
    I f( s_tem < 0 )  /* 负温度 */
    f_tem = (~s_tem+1) * 0.0625;
    else
    f_tem = s_tem * 0.0625;
    return f_tem;
    }
    
    /*******************************************************************
    篇幅有限,只展示部分代码
    作者:丹成学长,Q746876041
    ********************************************************************/
    
    
    
    

    4 最后

    技术解答、毕设帮助、开题指导
    print("Q 746876041") 
    

    请添加图片描述

    单片机毕设项目大全:
    https://blog.csdn.net/huawei123444/article/details/119822845

    展开全文
  • 本次单片机实验,我主要是做了一个简单的智能风扇风扇可以通过感知外部温度、按键、红外遥控来控制转速,并将转速与外部温度通过lcd显示屏显示。主要就是用了温度传感器DS18B20,红外遥控,lcd显示屏等外设。通过...
  • 通过人体传感器检测周围是否有人存在,并根据温度的不同,利用STM32风扇进行调速。 主要由STM32单片机+LCD1602液晶显示+DS18B20温度采集+按键设置电路+PWM风扇+人体红外检测;如图: 二.设计功能 (1)LCD1602...

    一.硬件方案

    本次设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在 LCD1602上。通过人体传感器检测周围是否有人存在,并根据温度的不同,利用STM32对风扇进行调速。
    主要由STM32单片机+LCD1602液晶显示+DS18B20温度采集+按键设置电路+PWM风扇+人体红外检测;如图:
    在这里插入图片描述

    二.设计功能

    (1)LCD1602液晶显示当前温度,风扇等级,自动手动模式。
    (2)按键可以设置自动和手动2种模式切换,按键设置温度上限。
    (3)手动模式下可以自由开启风扇,调整档位等级。
    (4)自动模式下,人体红外检测到人并且当前温度大于我们设置温度上限值风扇开启。
    (5)每大于一度风扇档位pwm加一,最大上限为10档。

    三.设计原理图

    (1)原理图主要采用AD软件进行设计,如图:
    在这里插入图片描述

    (2)PCB图如下:
    在这里插入图片描述

    四.软件设计

    (1)程序流程图
    在这里插入图片描述

    (2)主程序源码

    int main(void)
    {		
    	  u8 count = 0;
    	
    	  Motor = 0;
    		delay_init();	    	 //延时函数初始化	  
    		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    		delay_ms(500);
    	  LCD_Init();//1602初始化
    	  KEY_Init();//按键初始化
    		while(DS18B20_Init())//温度初始化
    		{
    				LCD_Write_String(0,0,"  DS18B20 Erro  ");
    				LCD_Write_String(0,1,"                ");
    		}
    		DS18B20_Get_Temp();//温度初始化
    		LCD_Write_String(0,0," DS18B20 Init...");
    		delay_ms(1000);
    		LCD_Write_String(0,0,"Temp:   C  M:  C");
    	  LCD_Write_String(0,1,"Auto:    Gear:  ");
    		TIM3_Int_Init(1,7199);//10kh频率计数,定时100us
    		if(Auto_flag == 1)
    			LCD_Write_String(5,1,"on ");
    		else
    			LCD_Write_String(5,1,"off");
    		display_Max();
    		
    		while(1)
    		{
    			  keyscan();//按键扫描
    			  if(count++ >= 200)//延时一段时间读取温度
    				{
    						count = 0;
    						temperature = DS18B20_Get_Temp();//获取温度
    						if(temperature<0)
    						{
    							LCD_Write_Char(5,0,'-');			//显示负号
    							temperature=-temperature;					//转为正数
    						}else LCD_Write_Char(5,0,' ');			//去掉负号
    						
    						//显示温度
    						LCD_Write_Char(6,0,temperature/100+'0');
    						LCD_Write_Char(7,0,temperature%100/10+'0');
    						
    						if(Auto_flag == 1)//在开启模式下,感应到有人,并且温度超过上限开启风扇
    						{
    							  if(RTHW == 1)//感应到有人
    								{
    										temp_dispose(temperature/10);//根据温度进行pwm调节
    								}
    								else//没感应到有人,关闭风扇
    								{
    									  PWM_Val = 100;
    										Motor = 0;
    									  LCD_Write_String(14,1,"--");
    								}
    						}
    						else//关闭风扇
    						{
    							  PWM_Val = 100;
    								Motor = 0;
    								LCD_Write_String(14,1,"--");
    						}
    				}
    				delay_ms(1);
    		}
    }
    

    如需资料请关注公众号“单片机实例设计”,首页回复“STM32温控风扇”获取资料;
    在这里插入图片描述

    展开全文
  • 北邮小学期电子工艺实习温控风扇pic32单片机实验报告加代码
  • 本文尝试在STM32F103C6微控制器上设计一种比较简单的散热器,通过DS18B20温度传感器实时检测环境温度,并通过LCD1602液晶显示器显示出具体的温度值。此外可以设置一个温度阈值,当检测到环境温度高于阈值时,通过...

    摘要
    本文尝试在STM32F103C6微控制器上设计一种比较简单的散热器,通过DS18B20温度传感器实时检测环境温度,并通过LCD1602液晶显示器显示出具体的温度值。此外可以设置一个温度阈值,当检测到环境温度高于阈值时,通过驱动电机转动带动排气扇开始对环境进行散热,当温度降到阈值以下,电机自动停止转动,从而实现一种简单的散热扇设计。
    比较简单的STM32的课程设计,包含温度传感、LCD液晶显示和电机驱动控制三个模块,资源有常私我vx:xdsqczkyqs713,打包一份40r,包含Proteus+keil+课程设计文档,注意是有常鸭,非诚勿扰<认真脸.jpg>

    环境要求:
    proteus8.8,keil4以上版本。
    整体设计电路原理图如下:
    在这里插入图片描述
    附带的设计报告概况如下:
    在这里插入图片描述在这里插入图片描述

    展开全文
  • STM32风扇控制系统

    千次阅读 2020-07-24 14:52:18
    基于STM32F103C8T6制作的风扇控制系统,系统总体功能包括:实时时钟,手动/自动模式切换,三档可调,风扇定时,温度显示。 上电初始化默认为时间显示界面,启动后进入风扇控制界面 模式切换功能:按下模式...
  • 结合网友给出的代码,改写成STM32F4的程序,由于没有oled,就把把oled改为了lcd
  • 基于STM32F103C8T6的温控器小设计,内含原理图,流量传感器为霍尔传感器,温度传感器为DS18B20,显示是0.96寸IIC接口的OLED。
  • 风扇我设置了两个模式,一个是温控模式,一个是按键模式,并使用SPI的OLED显示温度和风扇档数,风扇电机的驱动模块我使用的是L298N ,温度传感器为DS18B20
  • 基于STM32温控系统原理图,包括利用STM32发出PWM波进行温度的升温和降温,18B20进行温度采集,485总线跟上位机通信等。
  • STM8 风扇温度控制器

    2018-10-14 09:12:35
    风扇温控速度控制,原理图,有需要的可以下载参考。。。
  • 智能风扇全套程序。可以实现温控,热释电检测,触摸按键,液晶屏幕显示
  • STM32F030单片机蓝牙风扇主控板AD硬件设计原理图+PCB+封装库+软件源码,采用2层板设计,板子大小为50x50mm,双面布局布线,主要器件为STM32F030F4P6(TSSOP20),直流驱动TB6612FNG,USB充电电路TP4057,升压电路SX...
  • STM32作为主控制器,采用温湿度传感器、人体红外感应模块作为环境检测元件,采用TFT触控屏(或LCD显示模块结合按键)作为人机的交互设备,设计一适用于家用电风扇风扇智能控制器。能在档位按键的控制下多档调节...
  • 7、基于STM32的智能风扇√★

    千次阅读 多人点赞 2021-08-08 15:36:52
    7、基于STM32的智能风扇 文章目录7、基于STM32的智能风扇Introduction引言1、系统概述1.1、设计任务1.2、设计要求2 、方案设计与论证2.1、芯片选择方案2.1.1、控制核心的选择2.1.2、温度传感器可由以下几种方案可供...
  • 本设计为一种温控风扇系统,具有灵敏的温度感测和显示功能,系统选用STC89C52单片机作为控制平台对风扇转速进行控制。可在测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档...
  • 自动控制模式由当前检测的环境温度决定,可以通过按键设置温度的上下限,实现温控不同风扇转速档位;手动模式为按键控制电机的转速,一共有9档,其中,0档为停止,8档最最快转速,控制电机转速用PWM脉宽控制,希望对...
  • STM32 STM32F103C8T6 读取DS18B20温度数据例程 将读出的温度数据发送到调试串口 温度数据单位是0.1摄氏度
  • 基于单片机的风扇
  • 单片机的智能温控风扇的设计(Proteus 仿真,原理图,程序,论文全套设计 数码管显示)

空空如也

空空如也

1 2 3 4 5
收藏数 100
精华内容 40
关键字:

stm32温控风扇