智能风扇调速系统 总体设计框图 系统电路设计总体设计方框图所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用2位LED数码管以串口传送数据实现温度显示。 总体设计方框图 主控制器 单片机AT89S52具有低电压供电和体积小等特点,四个端就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。 状态显示 显示风扇调速系统处于的工作状态,状态有三种分别是 低速状态、中速状态和高速状态,此系统以发光二极管指示作演示。 LED显示 本系统共使用的三个共阳极七段数码管分别显示,当前的温度和设定定时的倒计时时间。温度以标准摄氏度为单位。时间以分钟为单位。数码管采用单片机P0口并行数据输出,P2口数据扫描控制显示,三极管8550做数码管的驱动。 键盘控制 有一组键盘控制倒计时温度的设定加与减。另一组控制系统处于的三种状态,分别对应的是低速状态、中速状态和高速状态,此系统以发光二极管指示作演示。还有一个开关按键是控制系统是处于自动状态和手动状态的开关。 温度传感器 DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下: ●独特的单线接口仅需要一个端口引脚进行通信; ●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件; ●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗; ●温度以9或12位数字; ●用户可定义报警设置; ●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; 系统复位 系统单片机采用的是上电复位,当复位键按下时,系统会变为,开始的初始状态。 时钟振荡 系统单片机使用的是外部时钟振荡,振荡频率为标准的11.0592MHZ。
元件清单 风扇调速系统使用说明书 - 接通交流220伏电源,电源指示灯亮。
- 按下启动电源开关,系统开始运行。
- 当手动/自动按键弹起时,为手动状态,温度显示为当前温度,时间显示为零,加,减键不起作用。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当手动/自动按键按下时,为自动状态,温度显示为当前温度,时间显示为零,加,减键起作用。每次加1或减1 。系统处于倒计时状态。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当系统处于自动状态时,如果温度大于30度,低速灯自动点亮。如果温度大于32度,中速灯自动点亮。如果温度大于34度,高速灯自动点亮。
Altium Designer画的原理图如下:(51hei附件中可下载工程文件)
风扇调速最终程序: - #include
- code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- 0x82,0xf8,0x80,0x90,0x40}; //显示段码
-
- sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定
-
- sbit P2_7=P2^7;
- sbit P2_6=P2^6;
- sbit P2_5=P2^5;
-
- sbit jia=P2^4;
- sbit jian=P2^3;
- sbit di=P2^2;
- sbit zh=P2^1;
- sbit ga=P2^0;
-
- unsigned int z=0;
- sbit q=P1^7;
-
- unsigned int sdata;//测量到的温度的整数部分
- //unsigned char xiaoshu1;//小数第一位
- //unsigned char xiaoshu2;//小数第二位
- //unsigned char xiaoshu;//两位小数
-
- bit fg=1; //温度正负标志
-
- //////////*显示延时程序*///////////////
-
- void Delay(unsigned int tc)
- {while( tc != 0 )
- {unsigned int i;
- for(i=0; i<80; i++);
- tc--;}
- }
-
- ////////////延时部分///////////////
-
- void yanshi (unsigned int count)
- {
- unsigned char i;
- while(count--)
- {for(i=0;i<115;i++);}
- }
-
-
- /////////////发送复位///////////////
-
- void fashong (void)
- {
- unsigned char i;
- TMDAT = 0; for(i=0;i<103;i++);
- TMDAT = 1; for(i=0;i<4;i++);
- }
-
-
- bit tmrbit (void) //读一位//
- {
- unsigned int i;
- bit dat;
- TMDAT = 0;
- i++;
- TMDAT = 1;
- i++; i++; //微量延时 //
- dat = TMDAT;
- for(i=0;i<8;i++);
- return (dat);
- }
-
- unsigned char tmrbyte (void) //读一个字节
- {
- unsigned char i,j,dat;
- dat = 0;
- for (i=1;i<=8;i++)
- { j = tmrbit(); dat = (j << 7) | (dat >> 1); }
- return (dat);
- }
-
- void tmwbyte (unsigned char dat) //写一个字节
- {
- unsigned char j,i;
- bit testb;
- for (j=1;j<=8;j++)
- { testb = dat & 0x01;
- dat = dat >> 1;
- if (testb)
- { TMDAT = 0; //写0
- i++; i++;
- TMDAT = 1;
- for(i=0;i<8;i++); }
- else
- { TMDAT = 0; //写0
- for(i=0;i<8;i++);
- TMDAT = 1;
- i++; i++;}
- }
- }
-
- void tmstart (void) //发送ds1820 开始转换
- {
- fashong(); //复位
- yanshi(1); //延时
- tmwbyte(0xcc); //跳过序列号命令
- tmwbyte(0x44); //发转换命令 44H,
- }
- void tmrtemp (void) //读取温度
- {
- unsigned char a,b;
- fashong (); //复位
- yanshi (1); //延时
- tmwbyte (0xcc); //跳过序列号命令
- tmwbyte (0xbe); //发送读取命令
- a = tmrbyte (); //读取低位温度
- b = tmrbyte (); //读取高位温度
- if(b>0x7f) //最高位为1 时温度是负
- {a=~a; b=~b+1; //补码转换,取反加一
- fg=0; //读取温度为负时fg=0
- }
- sdata = a/16+b*16; //整数部分
- //xiaoshu1 = (a&0x0f)*10/16; //小数第一位
- //xiaoshu2 = (a&0x0f)*100/16%10;//小数
- //xiaoshu=xiaoshu1*10+xiaoshu2; //小数
- }
- void DS18B20PRO(void)
- {
- tmstart();
- //yanshi(5); //如果是不断地读取的话可以不延
- tmrtemp(); //读取温度,执行完毕温度将存于
- }
- void Led()
- {
- if(fg==1) //温度为正时显示的数据
- {
- P2_7=0;
- P0=seg7code[sdata/10]; //输出十位
- Delay(8); P2=P2|0xf0;
-
- P2_6=0;
- P0=seg7code[sdata%10]|0x80; //输出个位
- Delay(8); P2=P2|0xf0;
-
- P2_5=0;
- P0=seg7code[z%10]|0x80; //输出延时位
- Delay(4); P2=P2|0xf0;
-
- if(sdata>30)
- {P1=0xfe;}
- if(sdata>32)
- {P1=0xfd;}
- if(sdata>34)
- {P1=0xfb;}
-
- }
- }
-
- void buzidong()
- {
-
- void DS18B20PRO();
- void Led();
-
- DS18B20PRO();
- Led();
- if(di==0)
- {Delay(200);P1=0xfe;}
- if(zh==0)
- {Delay(200);P1=0xfd;}
- if(ga==0)
- {Delay(200);P1=0xfb;}
-
- }
- void zidong()
- {
- while(z--)
- {
- void DS18B20PRO();
- void Led();
-
- unsigned char i,k;
- //for(y=30;y>0;y--)
- for(i=12;i>0;i--)
- //for(j=80;j>0;j--)
- for(k=248;k>0;k--)
- {
- if(jia==0)
- {Delay(200);z++;}
- if(jian==0)
- {Delay(200);z--;}
-
- DS18B20PRO();
- Led();
- if(di==0)
- {Delay(200);P1=0xfe;}
- if(zh==0)
- {Delay(200);P1=0xfd;}
- if(ga==0)
- {Delay(200);P1=0xfb;}
-
- /*
- if((di==0)||(sdata>30))
- {Delay(200);P1=0xfe;}
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料下载地址:
智能风扇调速系统资料.zip
(12.31 MB, 下载次数: 357)
|