.
智能电风扇的设计
院 **********************
*****
****
*** ***
可修编.
学专业班级学生指导教师 . -
20**年* 月** 日
. 可修编.
.. . .
引 言
随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着安康、平安、多功能、节能等方向开展。过去的电器不断的显露出其缺乏之处。电风扇作为家用电器的一种,同样存在类似的问题。
现在电风扇的现状:大局部只有手动调速,再加上一个定时器,功能单一。 存在的隐患或缺乏:比方说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。再比方说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。
之所以会产生这些隐患的根本原因是:缺乏对环境的检测。
如果能使电风扇具有对环境进展检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就防止了上述的缺乏。本次设计就是围绕这两点对现有电风扇进展改良。
. 学习.资料.
.. . .
1.总体方案设计及功能描述
本设计是以AT89C51单片机控制中心,主要通过提取热释电红外传感器感应到的人体红外线信息和温度传感器DS18B20得到的温度以及部定时器设定时间长短来控制电风扇的开关及转速的变化。
功能描述:电风扇工作在四种状态:手动调速状态、自动调速状态、定时状态、停顿状态。
手动状态时可以手动调节速度;自动状态时通过温度上下自动调节速度,如果出现手动现象那么变为手动状态;定时状态时可以调节定时时间,并设定是否启动定时,之后可以手动退出,也可以在不操作6秒后自动退出进入手动状态;停顿状态时可以被唤醒并进入自动状态。
当没有检测到人体存在超过3分钟或定时完毕时进入停顿状态。
在数码管显示方面,当没有定时时,只显示气温,当定时启动时气温和定时剩余时间以3秒的速度交替显示。
系统方框图如下列图所示,主要包括:输入、控制、输出三大局部8个功能模块。 键盘输入 AT89C51 数码管 发光二极管
热释电红外传感器 蜂鸣器 温度传感器 〔DS18B20〕 继电器 . 学习.资料.
.. . .
图1-1系统方框图
2.功能模块硬件简介与实现
2.1键盘输入电路
由于设计中用到的按键数目不多,所以可以直接用AT89C51的通用IO端口且选用AT89C51的P1口〔部有上拉电阻〕作为键盘接口。对于按键只需一端接地另一端接P1口即可。见下列图(2-1):
AN1P1.x 图 2-1
2.2热释电红外传感器模块
2.2.1热释电红外线传感器原理简介
人体辐射的红外线中心波长为 9~10um,而探测元件的波长灵敏度在 0.2~20um 围几乎稳定不变。在传感器顶端开设了一个装有滤光镜片的窗口,这个滤光片可通过光的波长围为 7~10um,正好适合于人体红外辐射的探测,而对其它波长的红外线由滤光片予以吸收,这样便形成了一种专门用作探测人体辐射的红外线传感器。
实质上热释电传感器是对温度敏感的传感器。它由瓷氧化物或压电晶体元件组成,在元件两个外表做成电极,如图2所示。在环境温度有ΔT的变化时,由于有热释电效应,在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。
2.2.2热释电红外线传感器应用
热释电红外线传感器有三个端口,如图2-2所示:一个接电源、一个接地、一个信号端口,当有人进入其检测区域时,信号端口便产生一个电平跳变,并维持数秒钟,我们就是利用这个跳变来判断是否有人在这个检测区域。
红外线传感器VCC1Vcc . 学习.资料.
2SIG3GND.. . .
图2-2
2.3温度传感器
2.3.1温度传感器DS18B20简介
新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线,在实际应用中取得了良好的测温效果。
DS18B20的主要特性:
〔1〕独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
〔2〕测温温围-55℃~+125℃ 〔3〕最高分辨率为0.0625℃。
2.3.2DS18B20的一般操作过程
〔1〕、初始化;
〔2〕、跳过ROM〔命令:CCH〕; 〔3〕、温度变换〔命令:44H〕; (4)、读暂存存储器〔命令:BEH〕; 注:每次读取温度都要经过上面四个过程。
2.3.3DS18B20的温度存储方式即温度计算
DS18B20是用12位存储温度,最高位为符号位,下列图为它的温度存储方式:
LSBYTE 2^3 Bit7 2^2 Bit6 2^1 Bit5 2^0 Bit4 2^-1 Bit3 2^-2 Bit2 2^-3 Bit1 2^-4 Bit0 . 学习.资料.
.. . .
MSBYTE S Bit15 S Bit14 S Bit13 S Bit12 S Bit11 2^6 Bit10 2^5 Bit9 2^4 Bit8 表2-1 DS18B20温度存储地址分配
这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
2.4数码管显示电路
2.4174ls164简介
移位存放器是一类应用很广的时序逻辑电路,在时钟脉冲的作用下,低位存放器的数码送给高位存放器,作为高位存放器的次态输出。 在时钟脉冲的作用下,高位存放器的数码送给低位存放器,作为低位存放器的次态输出;移位存放器:除具存放器的功能外,所存储的数码在时钟脉冲的作用下还可以移位。
74ls164是八位串入并出移位存放器,其工作电压围4.75~5.25V,大于2V的高电平输入、小于0.8V的低电平输入,clock最高响应频率为25MHZ,八位并行输出可以直接驱动八段数码管。74ls164的引脚图及功能图如下所示:
Vcc 14 OH 13 OUTPUTS OG 12 OF 11 OE CLEAR CLOCK 10 9 8 Inputs Clear Clock A B Outputs QA QB … QH L QH0 QGn QGn QGn L X X L L … H L X QA0 QB0 … OH H H H QAn … H L L . 学习.资料. QAn 1 2 3 4 5 6 7 … OA OB A B OC OD GND H X L QAn SERIAL INPUTS
OUTPUTS
.. . .
图2-3 74ls164的引脚图及功能图
2.4.2共阴极八段数码管简介
共阴极八段数码管是将八段发光二极管封装在一起且二极管的阴极连在一起,原理图如下列图所示,公共端接低电平,其它八个端口高电平点亮相应的二极管,低电平相反。
图2-4
A B CDEFGROP
2.4.3显示电路设计
此显示电路采用两位静态数码管显示,用八位串入并出移位存放器74LS164作为驱动电路,采用共阴极八段数码管原理图示意图如下:
data 74LS164 74LS164 数码管 数码管 clock . 学习.资料. .. . .
图 2-5
从图中可以看出控制线只有两条:1、数据线;2、移位脉冲线。它只占用很少的IO口。
2.5发光二极管电路
发光二极管简称为LED,它是半导体二极管的一种。发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算:
R=〔E-Uf〕/If
式中E为电源电压,Uf为LED的正向压降,If为LED的一般工作电流。发光二极管的两根引线中较长的一根为正极,应按电源正极。
与小白炽灯泡和氖灯相比,发光二极管的特点是:工作电压很低〔有的仅一点几伏〕;工作电流很小〔有的仅零点几毫安即可发光〕;抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便地调制发光的强弱。由于有这些特点,发光二极管在一些光电控制设备中用作光源,在许多电子设备中用作信号显示器。
由于AT89C51的P0口是开漏输出,所以此电路可以设计位如下简单形式:
LED1
VCC560
图2-6
2.6蜂鸣器电路
. 学习.资料.
.. . .
蜂鸣器工作原理简介:当控制端口通以不同频率及不同占空比的信号时蜂鸣器将发出不同强度及不同频率的声音。由于其具有比传统的喇叭体积小,价格低等优点,所以此次提示音电路选用蜂鸣器。具体电路见下列图:
图2-7
1K9012VCC蜂鸣器2.7继电器控制电路
2.7.1继电器简介
继电器是一种电子控制器件,它具有控制系统〔又称输入回路〕和被控制系统〔又称输出回路〕,通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关〞。故在电路中起着自动调节、平安保护、转换电路等作用。
它有几个重要指标:
1、额定工作电压:正常工作时线圈所需要的电压。 2、直流电阻:继电器中线圈的直流电阻。
3、吸合电流:继电器能够产生吸合动作的最小电流。 4、释放电流:继电器产生释放动作的最大电流。 5、触点切换电压和电流:继电器允许加载的电压和电流。
. 学习.资料.
.. . .
2.7.2继电器驱动电路设计及工作原理简介
采用晶闸管也可以用于小电流控制大电流电路,但是其控制电路比拟复杂,而采用继电器其控制电路就比拟简单,且具有电气隔离作用。虽然其响应速度没有晶闸管快但在低频情况下采用继电器控制电路较为方便。其电路图如下所示:
图2-8
121265651212CON39012 40073344继电器3电路工作原理简介:当控制端口为低电平时,三极管导通继电器吸合,常闭触电断开,常开触点闭合。当控制端口为高电平时三极管关断,继电器线圈通过二极管放电并断开,常闭、常开触电复位。
3.软件设计与实现
3.1整体设计思路介绍
软件设计整体思路:主程序局部进展一些初始化以及温度的读取;外部中断0进展红外线感应延时时间的重新加载;定时器0进展键盘的扫描及相关操作;定时器1进展
. 学习.资料.
.. . .
显示、温控速度、以及相关需要延时〔如倒计时等等〕的操作。在显示方面,进展了一些改善----要显示的值有变化才进展重新刷新,否那么不刷新。这样就大大提高了效率及最终的显示效果〔不会出现不该亮的局部还有亮的现象〕。
3.2主要局部流程图如下:
3.2.1主程序流程图
主程序开场 初始化内部资源 读取一个正确温度 并选择速度 拉高五个按键 启动时间和温度显示 启动定时器 读取温度 图 3-1
. 学习.资料.
.. . .
3.2.2外部中断流程图
外部中断开场 红外线感应延 时重新初始化 退出外部中断 图 3-2
3.2.3定时器0中断流程图
定时器0开场 定时状Y N 手动状Y N 自动状Y N 停顿状Y 定时器重新 初始化 定时状态 键盘操作 手动状态 键盘操作 自动状态 键盘操作 停顿状态 键盘操作 键盘消抖
退出定时器 图 3-3
. 学习.资料.
.. . .
3.2.4定时器1中断流程图
定时器 1开场 N 定时状态 手动状态 N 自动状态 N 停顿状态 1重新定时器初始化 Y Y Y Y 如果有定时那 么定时倒计时,计时完毕关闭 电风扇 显示时间 如果有定时那么时间和温度交替显示,没有那么只显示温如果有定时那么时间和温度交替显示,没有那么只显示温显示时间 进入定时状态不动超过一定 时间自动退回手动状态 键盘消抖
退出定时器 图 3-4
完毕语
. 学习.资料.
.. . .
早在?单片机原理及接口技术?这门课还未完毕的时候,陆仲达教师就给我们布置了基于51单片机的课程设计。我从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。
关于51的应用设计,从上课开场我就不满足于那些诸如电子钟、交通灯控制等司空见惯的设计,我希望能把主题定位得更新颖、更具挑战性,正好夏天也到了,于是把题目定为:智能电风扇的设计。
题目确定下来,我便立刻着手资料的收集工作中,当时面对浩瀚的书海真是有些茫然,不知如何下手。在导教师的指导及同学的帮助下,我终于对自己的工作方向和方法有了初步掌握。资料已经查找完毕,我开场着手论文的写作。在写作过程中遇到困难我就及时和导师联系,并和同学互相交流,请教专业课教师。在大家的帮助下,困难一个一个解决掉,论文也慢慢成型。
当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的课程设计稿件我的心里是甜的,我觉得这一切都值了。这次课程设计论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。
本设计最终实现了电风扇的手动调速、温控自动调速、定时、温度显示、人体检测等预期功能,其中定时在1到99分钟连续可调,人体检测围角度120度、距离6米,人体检测延时时间3分钟,定时器自动退出时间6秒。存在缺乏之处就是人体检测抗干扰方面不够好,需要提高。
我不会忘记这难忘的半个月的时间。课程设计论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的冲动和兴奋;亲手用protel 99 se设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实那么蕴藏着无尽的宝藏。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感帮助我的同学。
在此更要感我的指导教师和专业教师,是你们的细心指导和关心,使我能够顺利的完成课程设计。
. 学习.资料.
.. . .
附录:程序清单
/*********************************************************************** touwenjian.h
***********************************************************************/ typedef unsigned char byte; typedef unsigned int word;
//以下管脚配置
//ds18b20局部 sbit DQ =P3^4; //显示局部 sbit DB=P2^0; sbit CP=P2^1; //发光显示局部 sbit LED_dingshi=P0^0; sbit LED_shoudong =P0^1; sbit LED_zidong=P0^2; sbit LED_kuai =P0^3; sbit LED_zhong =P0^4; sbit LED_man =P0^5; //键盘定义局部 #define wujian 0x3f
sbit KEY1=P1^0 ; //状态转换 /启动 sbit KEY2=P1^1 ; //+10 / 1 sbit KEY3=P1^2 ; //-10 / 2 sbit KEY4=P1^3 ; // 3
. 学习.资料.
.. . .
sbit KEY5=P1^4 ; // 0 //继电器控制局部
确定
sbit JDQ1=P2^4; //0表示开通,1表示关断 sbit JDQ2=P2^5; sbit JDQ3=P2^6; //蜂鸣器局部
sbit call=P2^7; //低电平鸣叫
/*********************************************************************** ds18b20.c
***********************************************************************/ #include /***************************************************** 延时子程序 *****************************************************/ extern void delay(word useconds) { for(;useconds>0;useconds--); } /***************************************************** 复位子程序 ******************************************************/ static byte ow_reset(void) { byte presence; EA=0; DQ = 0; // pull DQ line low delay(45); // leave it low for 480us //551us DQ = 1; // allow line to return high . 学习.资料. .. . . delay(4);// wait for presence //61us presence = DQ; // get presence signal delay(40); // wait for end of timeslot //491us EA=1; return(presence); // presence signal returned } // 0=presence, 1 = no part /******************************************************* 从 1-wire 总线上读取一个字节子程序 ********************************************************/ static byte read_byte(void) { byte i; byte value = 0; EA=0; for (i=8;i>0;i--) { value>>=1; DQ = 0; // pull DQ low to start timeslot DQ = 1; // then return high {unsigned char i; for(i=0;i<2;i++);}//11us if(DQ)value|=0x80; delay(6);// wait for rest of timeslot } EA=1; return(value); } /******************************************************** 向 1-WIRE 总线上写一个字节 . 学习.资料. .. . . *********************************************************/ static void write_byte(char val) { byte i; EA=0; for (i=8; i>0; i--) // writes byte, one bit at a time { DQ = 0; // pull DQ low to start timeslot DQ=0; DQ = val&0x01; //6US delay(5);// hold value for remainder of timeslot //74us DQ = 1; val=val>>1; } EA=1; delay(5); } /******************************************************* 读取温度 *******************************************************/ word Read_Temperature(void) { union{ byte c[2]; word x; }temp; ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad . 学习.资料. .. . . temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset(); write_byte(0xCC); //Skip ROM write_byte(0x44); // Start Conversion return temp.x; } /*************************************************************** 求解温度 ***************************************************************/ extern byte Real_Tem(void) { word wen; wen=Read_Temperature(); return((wen>>4)&0x00ff); } /*********************************************************************** Main.c ***********************************************************************/ #include #define time_default 41 byte dingshi_time=time_default;//存放定时时间'''''' bit flag_dingshi=0; //0表示没有定时 word dingshi_jishu3=1000;//1000*60=1分钟 // bit flag_dingshi_delay=0;//1表示有 byte dingshi_delay=100; . 学习.资料. .. . . // #define hwx_delay_const 3 //人体感应延时时间 byte hwx_delay=hwx_delay_const;//用于保存红外线触发延长时间 word hwx_jishu1=0; // byte wendu=0;//用于存放温度值'''''' // #define low_wen 18 #define mid_wen 20 #define hig_wen 24 #define vhi_wen 28 // byte time_stor=100; //存储主观时间//触发显示 byte wendu_stor=low_wen;//存储主观温度//触发显示 // enum station0{zidong,dingshi,shoudong,weak}state; //函数说明区 extern byte Real_Tem(void ); extern void delay(word useconds); void mingjiao(void); void display(byte input,bit kkl); void auto_speed(void); void weak_default(void); /******************************************************************* 主程序 *******************************************************************/ void main() { //定时器0用于键盘扫描 . 学习.资料. .. . . TMOD=0x01|TMOD;//定时器0的1方式 TH0=0xd8;TL0=0xf0; //定时器0初始化10ms扫描一次 //定时器1用于显示 TMOD=0x10|TMOD;//定时器1的1方式 TH1=0x15;TL1=0xA0; //定时器1初始化60ms中断一次 //外部中断 TCON=TCON|0x01;//外部中断0都下降沿触发 //以下为开启局部 IP=0X01; //两个定时器同等优先级 IE=0x8b; //开启定时器0,1,外部中断0中断 // while(Real_Tem()==85); auto_speed(); LED_zidong=0; //刚开场为自动方式 P1=P1|0X7C; //拉高五个键盘 wendu_stor=100; //两个不可能值//用于启动显示 time_stor=100; //两个不可能值//用于启动显示 // TR0=1; //开启定时器0 TR1=1; while(1) } /*********************************************************************************** 定时器0中断效劳子程序 功能:进展键盘处理 { wendu=Real_Tem(); } . 学习.资料. .. . . 说明:键盘输入为P1.0到P1.4 ***********************************************************************************/ void time0(void) interrupt 1 { byte jianpan; TH0=0xd8;TL0=0xf0; jianpan = P1 & wujian; if(jianpan != wujian) //如果还有键盘值提取键盘值 { delay(500);//延时消抖 jianpan = P1 & wujian; if(jianpan==wujian)goto time_out; switch(state) { case dingshi: if(KEY1==0)//状态转换时做些相应的处理 { state=shoudong; } LED_shoudong=0; flag_dingshi_delay=0;dingshi_delay=100; time_stor=100;wendu_stor=100;//触发 mingjiao(); while(KEY1==0); else if(KEY2==0)//加分 { if(dingshi_time<90) {dingshi_time+=10;} dingshi_delay=100;// mingjiao(); . 学习.资料. .. . . } while(KEY2==0); else if(KEY3==0)//减分 { if(dingshi_time>10) } else if(KEY4==0)//定时与否 { flag_dingshi=~flag_dingshi; } else if(KEY5==0) { weak_default(); } mingjiao(); while(KEY5==0); if(flag_dingshi==1){LED_dingshi=0;} else {LED_dingshi=1;dingshi_jishu3=1000;} dingshi_delay=100;// // mingjiao(); while(KEY4==0); {dingshi_time-=10;} dingshi_delay=100;// mingjiao(); while(KEY3==0); break; case shoudong:if(KEY1==0) //状态转换时做些相应的处理 { state=zidong; . 学习.资料. .. . . auto_speed(); LED_shoudong=1;LED_zidong=0; mingjiao(); while(KEY1==0); } else if(KEY2==0)//快1 { JDQ2=1;JDQ3=1;JDQ1=0;//关断其它 LED_zhong=LED_man=1;LED_kuai=0; mingjiao(); while(KEY2==0); } else if(KEY3==0)//中2 { JDQ1=1;JDQ3=1;JDQ2=0;//关断其它 LED_kuai=LED_man=1;LED_zhong=0; mingjiao(); while(KEY3==0); } else if(KEY4==0)//慢3 { JDQ1=1;JDQ2=1;JDQ3=0;//关断其它 LED_zhong=LED_kuai=1;LED_man=0; mingjiao(); while(KEY4==0); } else if(KEY5==0)//停4 { weak_default(); mingjiao(); . 学习.资料. .. . . } while(KEY5==0); break; case zidong: if(KEY1==0) //状态转换时做些相应的处理 { state=dingshi; } LED_zidong=1; flag_dingshi_delay=1;dingshi_delay=100;//开场延时 time_stor=100;// mingjiao(); while(KEY1==0); else if(KEY2==0)//快1 { JDQ2=1;JDQ3=1;JDQ1=0;//关断其它 LED_zhong=LED_man=1;LED_kuai=0; state=shoudong; LED_zidong=1;LED_shoudong=0; } mingjiao(); while(KEY2==0); else if(KEY3==0)//中2 { JDQ1=1;JDQ3=1;JDQ2=0;//关断其它 LED_kuai=LED_man=1;LED_zhong=0; state=shoudong; LED_zidong=1;LED_shoudong=0; mingjiao(); while(KEY3==0); . 学习.资料. .. . . } else if(KEY4==0)//慢3 { JDQ1=1;JDQ2=1;JDQ3=0;//关断其它 LED_zhong=LED_kuai=1;LED_man=0; state=shoudong; LED_zidong=1;LED_shoudong=0; mingjiao(); while(KEY4==0); } else if(KEY5==0)//停4 { weak_default(); mingjiao(); while(KEY5==0); } break; case weak: if(KEY1==0) { state=zidong;LED_zidong=0; wendu_stor=100;//两个不可能值 time_stor=100;//两个不可能值 auto_speed(); mingjiao(); while(KEY1==0); } break; } } . 学习.资料. .. . . time_out: ; } /************************************************************************************* 定时器1中断效劳子程序 功能: 用于定时 0.060s *************************************************************************************/ void timer1(void) interrupt 3 { // //红外线到记时 EX0=0; if(hwx_jishu1<999){ hwx_jishu1++; } else { hwx_jishu1=0; hwx_delay--; if(hwx_delay==0){ weak_default();} } EX0=1; //1分钟定时 if(flag_dingshi==1) { if(dingshi_jishu3>0){dingshi_jishu3--;} else { dingshi_jishu3=1000; if(dingshi_time>1){dingshi_time--;} else{weak_default();} TH1=0x15;TL1=0xa0; } . 学习.资料. .. . . } //5秒延时 if(flag_dingshi_delay==1) { if(dingshi_delay>1)dingshi_delay--; } //显示和温控 switch(state) { case dingshi://在定时的时候只显示时间 else { state=shoudong;flag_dingshi_delay=0;dingshi_delay=100; LED_shoudong=0; time_stor=100;wendu_stor=100; // mingjiao(); } if(time_stor!=dingshi_time){display(dingshi_time,1);time_stor=dingshi_time;} // break; case shoudong: case zidong: //是否有定时,有那么交替显示温度和时间,没有那么只显示温 度 if(flag_dingshi!=0)// { static byte jiaoti_jishu2=0; static bit flag_jiaoti=0; if(jiaoti_jishu2<49){jiaoti_jishu2++;} else {flag_jiaoti=~flag_jiaoti;jiaoti_jishu2=0;} . 学习.资料. .. . . if(flag_jiaoti!=0) { if(time_stor!=dingshi_time) {display(dingshi_time,1);time_stor=dingshi_time;wendu_stor=100;}//显示时间 } else { 示温度 } } else { if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;}// if(wendu_stor!=wendu) {display(wendu,0);wendu_stor=wendu;time_stor=100;}//显 显示温度 } //温度控制速度 if(state==zidong) { switch(wendu) { case low_wen: JDQ1=1;JDQ2=1;JDQ3=1; LED_zhong=LED_man=LED_kuai=1;//ting zhi break; case mid_wen: JDQ1=1;JDQ2=1;JDQ3=0; LED_zhong=LED_kuai=1;LED_man=0;//man . 学习.资料. .. . . break; case hig_wen: JDQ1=1;JDQ3=1;JDQ2=0; LED_kuai=LED_man=1;LED_zhong=0;//zhong break; case vhi_wen: JDQ2=1;JDQ3=1;JDQ1=0; LED_zhong=LED_man=1;LED_kuai=0;//kuai } /************************************************************************************* 外部中断0效劳子程序 功能:用于人体红外线感应中断 } } break; case weak: //关闭状态只显示温度 if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;} break; } *************************************************************************************/ void int0(void) interrupt 0 { hwx_delay=hwx_delay_const;hwx_jishu1=0; } /************************************************************************************** . 学习.资料. .. . . 数码管显示子程序 功能:数据送到数码管显示 **************************************************************************************/ byte shumaguan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0x02,0X00}; code void display(byte input,bit kkl) { byte i,j; byte k; byte shuzhu[4]; shuzhu[1]=input/10; shuzhu[0]=input%10; for(i=0;i<4;i++) { if(i<2) { k=shumaguan[ shuzhu[i]]; if(kkl==0&&i==0){k++;} } else k=0; for(j=0;j<8;j++) { CP=0; P1=(P1&0XFE)|(k&0X01); k>>=1; CP=1; } } } . 学习.资料. .. . . /************************************************************************************** 蜂鸣器鸣叫子程序 功能:只负责鸣叫就是 **************************************************************************************/ void mingjiao(void) { byte i; } /*********************************************************************************** 功能:自动控制时的转速初始化 ***********************************************************************************/ void auto_speed(void) { if(wendu>vhi_wen){JDQ2=1;JDQ3=1;JDQ1=0; LED_zhong=LED_man=1;LED_kuai=0;}//kuai else if(wendu>=hig_wen){JDQ1=1;JDQ3=1;JDQ2=0; for(i=0;i<35;i++) {call=0;delay(20);call=1;delay(20);} LED_kuai=LED_man=1;LED_zhong=0;}//zhong else if(wendu>=mid_wen){JDQ2=1;JDQ1=1;JDQ3=0; LED_zhong=LED_kuai=1;LED_man=0;}//man } /************************************************************************************ else {JDQ2=1;JDQ3=1;JDQ1=1; LED_zhong=LED_man=LED_kuai=1;}//ting . 学习.资料. .. . . 功能:进入睡眠状态之前的准备 ************************************************************************************/ void weak_default(void) { flag_dingshi=0; //清楚定时标志 dingshi_time=time_default; dingshi_jishu3=1000; // flag_dingshi_delay=0; dingshi_delay=100; // state=weak; //进入睡眠状态 JDQ1=1;JDQ2=1;JDQ3=1; //关闭继电器 LED_shoudong=LED_zidong=LED_dingshi=1; LED_kuai=LED_zhong=LED_man=1; // wendu_stor=100; time_stor=100; } . 学习.资料. 因篇幅问题不能全部显示,请点此查看更多更全内容