51单片机的温控风扇设计

一.硬件方案

        系统采用51单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇。风扇控制状态随外界温度而定,并通过PWM的方式控制风扇的转速。
        整体电路主要由51单片机最小系统,数码管显示模块,数码管驱动模块,温度采集模块,人体感应模块,风扇模块,按键模块等构成;原理图如下:


 

PCB及仿真图如下:

 

二.设计功能

  • 采用DS18B20温度传感器测温,三级管驱动数码管显示温度和风扇的档位,人体感应模块检测是否有人。
  • 共3个按键:1设置、2键加、3键减。按一下设置可以设置上限值,再按下设置下限,均可以按键加减调整;
  • 利用PWM调速,当温度低于下限时,风扇步转动,当温度处于上下限之间时,1档转动(风速50%转速转动),当温度超过上限时,风扇全速转动。
  • 红外人体传感器检测周围是否有人,当周围无人时,风扇停止转动。

三.软件设计

        主程序源码

/****************主函数***************/
void main()
{
    static uchar value;
    time_init();                    //初始化定时器 
    pwm=1;
    hw = 1;
    while(1)
    {        
        key();                    //按键程序
        if(key_can < 10)
        {
            key_with();            //设置温度    
        }
        if(flag_200ms == 1)        //200ms 处理一次温度程序
        {       
            flag_200ms = 0;    
            temperature = read_temp()%1000;    //先读出温度的值
            if(menu_1 == 0)
            {    
                smg_i = 3;
                dis_smg[0] = smg_du[temperature % 10];     //取温度的小数显示
                dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示
                dis_smg[2] = smg_du[temperature / 100 % 10] ;       //取温度的十位显示
            }
            fengshan_kz();        //风扇控制函数
            value ++;
            if(value >= 4)
            {
                value = 0;
                if(miao != 0)
                {
                    miao --;    //时间减1
                }
                if(miao == 0)
                    flag_en = 0;
            }
            if(hw == 1)  //感应到人
            {
                miao = 30;
                flag_en = 1;
            }
        }

        
    }
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{    
    static uchar value;             //定时2ms中断一次
    TH0 = 0xf8;
    TL0 = 0x30;     //2ms
    value++;      
    display();        //数码管显示函数
    if(value >= 150)
    {
        value = 0;      
        flag_200ms = 1;
    }
    if(flag_lj_en == 1)       //按下按键使能
    {
        key_time ++;
        if(key_time >= 250) //500ms
        {
            key_time = 0;
            key_500ms = 1; //500ms
            key_value ++;
            if(key_value > 3)
            {
                key_value = 10;
                flag_lj_3_en = 1; //3次后1.5秒连加大些
            }                        
        }
    }
}

资料链接:https://pan.baidu.com/s/1TAN-I-XEUopsmbODRRPvzg?pwd=e9ri 
提取码:e9ri 

猜你喜欢

转载自blog.csdn.net/m0_60790717/article/details/128226216
今日推荐