您的当前位置:首页正文

51单片机课程设计——智能电风扇

2023-09-09 来源:步旅网


智能电风扇的设计

学 院 计算机与控制工程学院 专业班级 自动化073班 学生姓名 冯文科 指导教师 白晓乐 夏康伟

2010年6 月25 日

引 言

随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。过去的电器不断的显露出其不足之处。电风扇作为家用电器的一种,同样存在类似的问题。

现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。 存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。

之所以会产生这些隐患的根本原因是:缺乏对环境的检测。

如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。本次设计就是围绕这两点对现有电风扇进行改进。

I

1.总体方案设计及功能描述

本设计是以AT89C51单片机控制中心,主要通过提取热释电红外传感器感应到的人体红外线信息和温度传感器DS18B20得到的温度以及内部定时器设定时间长短来控制电风扇的开关及转速的变化。

功能描述:电风扇工作在四种状态:手动调速状态、自动调速状态、定时状态、停止状态。

手动状态时可以手动调节速度;自动状态时通过温度高低自动调节速度,如果出现手动现象则变为手动状态;定时状态时可以调节定时时间,并设定是否启动定时,之后可以手动退出,也可以在不操作6秒后自动退出进入手动状态;停止状态时可以被唤醒并进入自动状态。

当没有检测到人体存在超过3分钟或定时完毕时进入停止状态。

在数码管显示方面,当没有定时时,只显示气温,当定时启动时气温和定时剩余时间以3秒的速度交替显示。

系统方框图如下图所示,主要包括:输入、控制、输出三大部分8个功能模块。

键盘输入 数码管 发光二极管 AT89C51 热释电红外传感器 蜂鸣器 温度传感器 (DS18B20) 继电器 图1-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所示:一个接电源、一个接地、一个信号端口,当有人进入其检测区域时,信号端口便产生一个电平跳变,并维持数秒钟,我们就是利用这个跳变来判断是否有人在这个检测区域。

红外线传感器VCC123VccSIGGND图2-2

2

2.3温度传感器

2.3.1温度传感器DS18B20简介

新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线,在实际应用中取得了良好的测温效果。

DS18B20的主要特性:

(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)测温温范围-55℃~+125℃ (3)最高分辨率为0.0625℃。

2.3.2 DS18B20的一般操作过程

(1)、初始化;

(2)、跳过ROM(命令:CCH); (3)、温度变换(命令:44H); (4)、读暂存存储器(命令:BEH); 注:每次读取温度都要经过上面四个过程。

2.3.3 DS18B20的温度存储方式即温度计算

DS18B20是用12位存储温度,最高位为符号位,下图为它的温度存储方式:

LSBYTE MSBYTE 2^3 Bit7 S Bit15 2^2 Bit6 S Bit14 2^1 Bit5 S Bit13 2^0 Bit4 S Bit12 2^-1 Bit3 S Bit11 2^-2 Bit2 2^6 Bit10 2^-3 Bit1 2^5 Bit9 2^-4 Bit0 2^4 Bit8 表2-1 DS18B20温度存储地址分配

这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

3

2.4数码管显示电路

2.4 174ls164简介

移位寄存器是一类应用很广的时序逻辑电路,在时钟脉冲的作用下,低位寄存器的数码送给高位寄存器,作为高位寄存器的次态输出。 在时钟脉冲的作用下,高位寄存器的数码送给低位寄存器,作为低位寄存器的次态输出;移位寄存器:除具寄存器的功能外,所存储的数码在时钟脉冲的作用下还可以移位。

74ls164是八位串入并出移位寄存器,其工作电压范围4.75~5.25V,大于2V的高电平输入、小于0.8V的低电平输入,clock最高响应频率为25MHZ,八位并行输出可以直接驱动八段数码管。74ls164的引脚图及功能图如下所示:

OUTPUTS

Vcc OH OG OF OE CLEAR CLOCK 14 13 11 8 10 9 12 OH 1 2 3 4 5 6 7 OA OB A OC OD GND B

SERIAL INPUTS OUTPUTS

Inputs Clear L H H H H Clock X L A B X X H L X Outputs QA L QA0 H L L QB L QB0 QAn QAn QAn … … … … … QH L QH0 QGn QGn QGn 图2-3 74ls164的引脚图及功能图

2.4.2共阴极八段数码管简介

共阴极八段数码管是将八段发光二极管封装在一起且二极管的阴极连在一起,原理图如下图所示,公共端接低电平,其它八个端口高电平点亮相应的二极管,低电平相反。

4

A B CDEFGROP图2-4

2.4.3显示电路设计

此显示电路采用两位静态数码管显示,用八位串入并出移位寄存器74LS164作为驱动电路,采用共阴极八段数码管原理图示意图如下:

data clock

从图中可以看出控制线只有两条:1、数据线;2、移位脉冲线。它只占用很少的IO口。

数码管 数码管 74LS164 74LS164 图 2-5

2.5发光二极管电路

发光二极管简称为LED,它是半导体二极管的一种。发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算:

R=(E-Uf)/If

式中E为电源电压,Uf为LED的正向压降,If为LED的一般工作电流。发光二极管的两根引线中较长的一根为正极,应按电源正极。

与小白炽灯泡和氖灯相比,发光二极管的特点是:工作电压很低(有的仅一点几伏);工作电流很小(有的仅零点几毫安即可发光);抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便地调制发光的强弱。由于有这些特点,发光二极管在一些光电控制设备中用作光源,在许多电子设备中用作信号显示器。

由于AT89C51的P0口是开漏输出,所以此电路可以设计位如下简单形式:

VCC560LED1图2-6

5

2.6蜂鸣器电路

蜂鸣器工作原理简介:当控制端口通以不同频率及不同占空比的信号时蜂鸣器将发出不同强度及不同频率的声音。由于其具有比传统的喇叭体积小,价格低等优点,所以此次提示音电路选用蜂鸣器。具体电路见下图:

VCC1K9012蜂鸣器图2-7

2.7继电器控制电路

2.7.1继电器简介

继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

它有几个重要指标:

1、额定工作电压:正常工作时线圈所需要的电压。 2、直流电阻:继电器中线圈的直流电阻。

3、吸合电流:继电器能够产生吸合动作的最小电流。 4、释放电流:继电器产生释放动作的最大电流。 5、触点切换电压和电流:继电器允许加载的电压和电流。

6

2.7.2继电器驱动电路设计及工作原理简介

采用晶闸管也可以用于小电流控制大电流电路,但是其控制电路比较复杂,而采用继电器其控制电路就比较简单,且具有电气隔离作用。虽然其响应速度没有晶闸管快但在低频情况下采用继电器控制电路较为方便。其电路图如下所示:

9012 4007121265651212CON33344继电器3图2-8

电路工作原理简介:当控制端口为低电平时,三极管导通继电器吸合,常闭触电断开,常开触点闭合。当控制端口为高电平时三极管关断,继电器线圈通过二极管放电并断开,常闭、常开触电复位。

7

3.软件设计与实现

3.1整体设计思路介绍

软件设计整体思路:主程序部分进行一些初始化以及温度的读取;外部中断0进行红外线感应延时时间的重新加载;定时器0进行键盘的扫描及相关操作;定时器1进行显示、温控速度、以及相关需要延时(如倒计时等等)的操作。在显示方面,进行了一些改善----要显示的值有变化才进行重新刷新,否则不刷新。这样就大大提高了效率及最终的显示效果(不会出现不该亮的部分还有亮的现象)。

3.2主要部分流程图如下:

3.2.1主程序流程图

主程序开始

初始化内部资源 读取一个正确温度 并选择速度 拉高五个按键 启动时间和温度显示 启动定时器 读取温度 图 3-1

8

3.2.2外部中断流程图

外部中断开始 红外线感应延 时重新初始化 退出外部中断 图 3-2

3.2.3定时器0中断流程图

定时器0开始 定时器重新 初始化 键盘消抖 定时状Y N 手动状Y N 自动状Y N 停止状Y 定时状态 键盘操作 手动状态 键盘操作 自动状态 键盘操作 停止状态 键盘操作 退出定时器 图 3-3

9

3.2.4定时器1中断流程图

定时器 1开始 定时器 1重新初始化 如果有定时则 定时倒计时, 计时结束关闭电 风扇 进入定时状态 不动超过一定 时间自动退回手动状态 键盘消抖 N N N 定时状态 手动状态 自动状态 停止状态 Y Y Y Y 如果有定时则如果有定时则显示时间 时间和温度交时间和温度交替显示,没有则替显示,没有则显示时间 只显示温度 只显示温度 退出定时器 图 3-4

10

结束语

早在《单片机原理及接口技术》这门课还未结束的时候,陆仲达老师就给我们布置了基于51单片机的课程设计。我从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。

关于51的应用设计,从上课开始我就不满足于那些诸如电子钟、交通灯控制等司空见惯的设计,我希望能把主题定位得更新颖、更具挑战性,正好夏天也到了,于是把题目定为:智能电风扇的设计。

题目确定下来,我便立刻着手资料的收集工作中,当时面对浩瀚的书海真是有些茫然,不知如何下手。在导老师的指导及同学的帮助下,我终于对自己的工作方向和方法有了初步掌握。资料已经查找完毕,我开始着手论文的写作。在写作过程中遇到困难我就及时和导师联系,并和同学互相交流,请教专业课老师。在大家的帮助下,困难一个一个解决掉,论文也慢慢成型。

当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的课程设计稿件我的心里是甜的,我觉得这一切都值了。这次课程设计论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。

本设计最终实现了电风扇的手动调速、温控自动调速、定时、温度显示、人体检测等预期功能,其中定时在1到99分钟连续可调,人体检测范围角度120度、距离6米,人体检测延时时间3分钟,定时器自动退出时间6秒。存在不足之处就是人体检测抗干扰方面不够好,需要提高。

我不会忘记这难忘的半个月的时间。课程设计论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用protel 99 se设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。

在这次课程设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。

在此更要感谢我的指导老师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成课程设计。

11

附录:程序清单

/*********************************************************************** 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; //低电平鸣叫

12

/*********************************************************************** ds18b20.c

***********************************************************************/ #include #include\"touwenjian.h\"

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

延时子程序

*****************************************************/ 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--)

13

{

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{

14

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 #include\"touwenjian.h\" //数据区

#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 //人体感应延时时间

15

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; //两个定时器同等优先级

16

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) {

wendu=Real_Tem(); } }

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

定时器0中断服务子程序 功能:进行键盘处理

说明:键盘输入为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)//状态转换时做些相应的处理

17

{

state=shoudong; LED_shoudong=0; flag_dingshi_delay=0;dingshi_delay=100;

time_stor=100;wendu_stor=100;//触发 mingjiao(); while(KEY1==0); }

{

if(dingshi_time<90) {dingshi_time+=10;} dingshi_delay=100;// mingjiao(); while(KEY2==0); }

else if(KEY3==0)//减分 {

if(dingshi_time>10) {dingshi_time-=10;} dingshi_delay=100;// mingjiao(); while(KEY3==0); }

else if(KEY4==0)//定时与否

{

flag_dingshi=~flag_dingshi; if(flag_dingshi==1){LED_dingshi=0;} else {LED_dingshi=1;dingshi_jishu3=1000;} dingshi_delay=100;// // mingjiao(); while(KEY4==0); }

else if(KEY5==0) {

weak_default(); mingjiao();

18

else if(KEY2==0)//加分

break; {

while(KEY5==0); }

case shoudong:if(KEY1==0) //状态转换时做些相应的处理

state=zidong; auto_speed(); LED_shoudong=1;LED_zidong=0; mingjiao(); while(KEY1==0); } {

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); }

19

else if(KEY2==0)//快1

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); } {

JDQ2=1;JDQ3=1;JDQ1=0;//关断其它

LED_zhong=LED_man=1;LED_kuai=0; state=shoudong;

LED_zidong=1;LED_shoudong=0;

else if(KEY2==0)//快1

mingjiao(); while(KEY2==0); }

else if(KEY3==0)//中2 {

JDQ1=1;JDQ3=1;JDQ2=0;//关断其它 } {

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); 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

20

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 {

TH1=0x15;TL1=0xa0; //

//红外线到记时

EX0=0;

if(hwx_jishu1<999){ hwx_jishu1++; } else {

hwx_jishu1=0; hwx_delay--;

21

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();} } } //5秒延时

if(flag_dingshi_delay==1) {

if(dingshi_delay>1)dingshi_delay--; else {

state=shoudong;flag_dingshi_delay=0;dingshi_delay=100; LED_shoudong=0;

time_stor=100;wendu_stor=100; // mingjiao(); } }

//显示和温控 switch(state) {

case dingshi://在定时的时候只显示时间

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;

22

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 {

if(wendu_stor!=wendu) {display(wendu,0);wendu_stor=wendu;time_stor=100;}//显示温度

}

} else { }

//温度控制速度

if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;}// 显示温度

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;

23

case vhi_wen: JDQ2=1;JDQ3=1;JDQ1=0;

LED_zhong=LED_man=1;LED_kuai=0;//kuai } } break;

case weak: //关闭状态只显示温度

if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;} break; } }

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

外部中断0服务子程序

功能:用于人体红外线感应中断

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

void int0(void) interrupt 0 {

hwx_delay=hwx_delay_const;hwx_jishu1=0; }

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

数码管显示子程序

功能:数据送到数码管显示

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

byte code shumaguan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0x02,0X00};

void display(byte input,bit kkl) {

byte i,j; byte k;

byte shuzhu[4]; shuzhu[1]=input/10; shuzhu[0]=input%10;

24

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;

for(i=0;i<35;i++)

{call=0;delay(20);call=1;delay(20);} }

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

功能:自动控制时的转速初始化

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

void auto_speed(void) {

if(wendu>vhi_wen){JDQ2=1;JDQ3=1;JDQ1=0;

25

LED_zhong=LED_man=1;LED_kuai=0;}//kuai

else if(wendu>=hig_wen){JDQ1=1;JDQ3=1;JDQ2=0; 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; }

26

因篇幅问题不能全部显示,请点此查看更多更全内容