各位师兄可以用到,原理图,,仿真都有
②573驱动:
硬件构成:单片机+最小系统+数码管显示模块+74HC573数码管驱动模块+温度采集模块+风扇驱动模块+按键模块
1.采用DS18B20温度传感器测温,74HC573驱动数码管,数码管显示温度和风扇的档位;
2.三个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整;
3.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(风扇50%转速转动),当温度超过上限时,全速转动。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
制作出来的实物图如下:
温控风扇元件清单
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 <reg52.h>
- #include <stdio.h>
- #include<intrins.h>
- #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<t_max_1)
- {
- 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=0;
- P0=table[t_max/100];
- delay(2);
- w2=1;
-
- P0=0x00;
- w3=0;
- P0=table[t_max%100/10];
- dp=1;
- delay(2);
- w3=1;
-
- P0=0x00;
- w4=0;
- P0=table[t_max%10];
- delay(2);
- w4=1;
- }
- /**************************************/
- void display2()
- {
- P0=0x00;
- w1=0;
- P0=table1[1];
- delay(2);
- w1=1;
-
- P0=0x00;
- w2=0;
- P0=table[t_max_1/100];
- delay(2);
- w2=1;
-
- P0=0x00;
- w3=0;
- P0=table[t_max_1%100/10];
- dp=1;
- delay(2);
- w3=1;
-
- P0=0x00;
- w4=0;
- P0=table[t_max_1%10];
- delay(2);
- w4=1;
- }
- /***************************************/
- void shezhi()
- {
- if(flag_0==1)
- {
- if(key_jia==0)
- {
- delay(10);
- if(key_jia==0)
- {
- t_max=t_max+5;
- if(t_max>=t_max_1) //防止低温度高于高温度
- t_max=t_max_1-5;
- while(!key_jia);
- }
- }
- if(key_jian==0)
- {
- delay(10);
- if(key_jian==0)
- {
- t_max=t_max-5;
- while(!key_jian);
- }
- }
- }
- if(flag_0==2)
- {
- if(key_jia==0)
- {
- delay(10);
- if(key_jia==0)
- {
- t_max_1=t_max_1+5;
- while(!key_jia);
- }
- }
- if(key_jian==0)
- {
- delay(10);
- if(key_jian==0)
- {
- t_max_1=t_max_1-5;
- if(t_max_1<=t_max) //防止高温度小于低温度
- t_max_1=t_max+5;
- while(!key_jian);
- }
- }
- }
- }
- void display()
- {
- if(flag_0==0)
- display0();
- else if(flag_0==1)
- display1();
- else if(flag_0==2)
- display2();
- }
- void main()
- {
- while(1)
- {
- tempchange();
- t=get_temp();
- if(t>=0&&t<=1250) //温度合法范围,不在这个范围就是没有获取到合适的值
- {
- wendu=t;
- }
- pro();
- display();
- shezhi();
- baojing();
- }
- }
复制代码
所有资料51hei提供下载:
温度风扇74HC573+.7z
(869.48 KB, 下载次数: 62)
|