1、智能控制风扇源程序c语言/*touwenjian.h*/typedef unsigned char byte; typedef unsigned int word;/以下管脚配置/ds18b20部分sbit DQ =P34; /显示部分sbit DB=P20;sbit CP=P21;/发光显示部分sbit LED_dingshi=P00;sbit LED_shoudong =P01;sbit LED_zidong=P02;sbit LED_kuai =P03;sbit LED_zhong =P04;sbit LED_man =P05;/键盘定义部分#define wujian 0x3fsbit
2、 KEY1=P10 ; /状态转换 /启动sbit KEY2=P11 ; /+10 / 1sbit KEY3=P12 ; /-10 / 2sbit KEY4=P13 ; / 3sbit KEY5=P14 ; / 0 确定/继电器控制部分sbit JDQ1=P24; /0表示开通,1表示关断sbit JDQ2=P25;sbit JDQ3=P26;/蜂鸣器部分sbit call=P27; /低电平鸣叫/* ds18b20.c*/#include #includetouwenjian.h/* 延时子程序*/extern void delay(word useconds) for(;useconds0
3、;useconds-); /* 复位子程序 */static byte ow_reset(void) byte presence;EA=0; DQ = 0; / pull DQ line low delay(45); / leave it low for 480us /551usDQ = 1; / allow line to return high delay(4);/ wait for presence /61uspresence = DQ; / get presence signal delay(40); / wait for end of timeslot /491usEA=1;retu
4、rn(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;i0;i-) value=1; DQ = 0; / pull DQ low to start timeslot DQ = 1; / then return high unsigned char i; for(i=0;i0; i-) / writes byte, one bit a
5、t a time DQ = 0; / pull DQ low to start timeslotDQ=0; DQ = val&0x01; /6USdelay(5);/ hold value for remainder of timeslot /74usDQ = 1; val=val1; EA=1; delay(5); /*读取温度 */ word Read_Temperature(void) union byte c2; word x; temp; ow_reset(); write_byte(0xCC); / Skip ROM write_byte(0xBE); / Read Scratch
6、 Pad temp.c1=read_byte(); temp.c0=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(wen4)&0x00ff);/* Main.c*/#include #includetouwenjian.h/数据区#define time_default 41byte
7、 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
8、 mid_wen 20#define hig_wen 24#define vhi_wen 28/byte time_stor=100; /存储主观时间/触发显示byte wendu_stor=low_wen;/存储主观温度/触发显示/enum station0zidong,dingshi,shoudong,weakstate;/函数说明区extern byte Real_Tem(void );extern void delay(word useconds);void mingjiao(void);void display(byte input,bit kkl);void auto_speed(
9、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);
10、 auto_speed(); LED_zidong=0; /刚开始为自动方式 P1=P1|0X7C; /拉高五个键盘 wendu_stor=100; /两个不可能值/用于启动显示 time_stor=100; /两个不可能值/用于启动显示 /TR0=1; /开启定时器0TR1=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
11、(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(K
12、EY2=0)/加分 if(dingshi_time10) 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(); ming
13、jiao(); while(KEY5=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;/关
14、断其它 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
15、=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
16、_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=
17、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_jishu10)dingshi_jishu3-; else din
18、gshi_jishu3=1000; if(dingshi_time1)dingshi_time-; elseweak_default(); /5秒延时 if(flag_dingshi_delay=1) if(dingshi_delay1)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:/在定时的时候只显示时
19、间 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_jishu249)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=
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2