×
单片机 > 单片机程序设计 > 详情

单片机温控风扇Proteus仿真与源程序设计

发布时间:2020-06-17 发布时间:
|

硬件构成:单片机+最小系统+数码管显示模块+74HC573数码管驱动模块+温度采集模块+风扇驱动模块+按键模块

1.采用DS18B20温度传感器测温,74HC573驱动数码管,数码管显示温度和风扇的档位;
2.三个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整;
3.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(风扇50%转速转动),当温度超过上限时,全速转动。

仿真原理图如下
 

制作出来的实物图如下:
 

温控风扇元件清单
1)    7*9万用板
2)    风扇
3)    STC89C51单片机
4)    74hc573
5)    40脚IC座
6)    20脚IC座
7)    0.36四位一体共阴数码管
8)    10k电阻*2
9)    1k电阻*2
10)    103排阻
11)    DS18B20
12)    10uf电容
13)    11.0592M晶振
14)    30pf瓷片电容*2
15)    9012三极管
16)    2p排针
17)    按键*3
18)    DC电源接口
19)    自锁开关
20)    导线若干
21)    焊锡若干
22)    电源线或电池盒+DC电源插头


单片机源程序如下:

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit ds=P3^6;



sbit w1=P2^4;

sbit w2=P2^5;

sbit w3=P2^6;

sbit w4=P2^7;             //数码管的位选端

sbit dp=P0^7;

sbit fm=P3^7;


sbit key_shezhi=P1^5;

sbit key_jia=P1^6;

sbit key_jian=P1^7;

uchar flag_0;

uint t_max=250,t_max_1=300;

uint count=0;

int wendu,t;

void delay(uint z)                   //延时函数

{

        uint x,y;

        for(x=z;x>0;x--)

                for(y=110;y>0;y--);

}

/********************************/

void pro()

{

        if(key_shezhi==0)

        {

                delay(10);

                if(key_shezhi==0)

                {

                        flag_0++;

                        if(flag_0>=3)

                                flag_0=0;

                        while(!key_shezhi)        ;

                }

        }

}

/**********************************/

uchar code table[]={

0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40

};

uchar code table1[]={

0x38,0x76

};

uint temp,mm;uchar i;float f_temp;

/*******************************************************

温度函数

*******************************************************/

void dsreset(void)                  //下边是温度获取子程序

{

        uint i;

        ds=0;

        i=103;

        while(i>0)i--;

        ds=1;

        i=4;

        while(i>0)i--;

}

bit tempreadbit(void)              //读一位

{

        uint i;

        bit dat;

        ds=0;i++;

        ds=1;i++;i++;

        dat=ds;

        i=8;while(i>0)i--;

        return(dat);

}

uchar tempread(void)                                         //获取温度

{

        uchar i,j,dat;

        dat=0;

        for(i=1;i<=8;i++)

        {

                j=tempreadbit();

                dat=(j<<7)|(dat>>1);

        }

        return(dat);

}

void tempwritebyte(uchar dat)                           //写一个字节

{

        uint i;

        uchar j;

        bit testb;

        for(j=1;j<=8;j++)

        {

                testb=dat&0x01;

                dat=dat>>1;

                if(testb)

                {

                        ds=0;

                        i++;i++;

                        ds=1;

                        i=8;while(i>0)i--;

                }

                else

                {

                        ds=0;

                        i=8;while(i>0)i--;

                        ds=1;

                        i++;i++;

                }

        }

}

void tempchange(void)                    //温度转换

{

        dsreset();

        delay(1);

        tempwritebyte(0xcc);

        tempwritebyte(0x44);

}

uint get_temp()                          /获取温度

{

        uchar a,b;

        dsreset();

        delay(1);

        tempwritebyte(0xcc);

        tempwritebyte(0xbe);

        a=tempread();

        b=tempread();

        temp=b;

        temp<<=8;

        temp=temp|a;

        f_temp=temp*0.0625;

        temp=f_temp*10+0.5;

        f_temp=f_temp+0.05;

        return temp;

}

/***********************************/

void display0()

{

        P0=0x00;

        w1=0;

        P0=0x00;

        delay(2);

        w1=1;

        

        P0=0x00;

        w2=0;

        P0=table[wendu/100];

        delay(2);

        w2=1;

        

        P0=0x00;

        w3=0;

        P0=table[wendu%100/10];

        dp=1;

        delay(2);

        w3=1;

        

        P0=0x00;

        w4=0;

        P0=table[wendu%10];

        delay(2);

        w4=1;                

}

/***************************************/

void baojing()

{

        count++;

        if(count>=3)

                count=0;

        if(wendu>=t_max&&wendu

                {

                        if(count<2)      //只有三分之二的时间会给风扇供电

                                fm=0;

                        else

                                fm=1;

                }

        else if(wendu>=t_max_1)     //高于设定的最高温度,   全速转动        

                {

                        fm=0;

                }

        else                       //高于设定的次级温度,缓慢转动

                {

                        fm=1;

                }

}

/**************************************/

/**************************************/

void display1()

{

        P0=0x00;

        w1=0;

        P0=table1[0];

        delay(2);

        w1=1;

        

        P0=0x00;

w2=



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析