《智能控制风扇源程序.docx》由会员分享,可在线阅读,更多相关《智能控制风扇源程序.docx(17页珍藏版)》请在三一办公上搜索。
1、智能控制风扇源程序/* 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 w
2、ujian 0x3f sbit KEY1=P10 ; /状态转换 /启动 sbit KEY2=P11 ; /+10 / 1 sbit KEY3=P12 ; /-10 / 2 sbit KEY4=P13 ; / 3 sbit KEY5=P14 ; / 0 确定 /继电器控制部分 sbit JDQ1=P24; /0表示开通,1表示关断 sbit JDQ2=P25; sbit JDQ3=P26; /蜂鸣器部分 sbit call=P27; /低电平鸣叫 /* ds18b20.c */ 1 #include #includetouwenjian.h /* 延时子程序 */ extern void de
3、lay(word useconds) for(;useconds0;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); / wai
4、t 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;i0;i-) value=1; DQ = 0; / pull DQ low to start timeslot 2 DQ = 1; / then return high unsigned char
5、i; for(i=0;i0; 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=val1; EA=1; delay(5); /* 读取温度 */ word Read_Temperature(void) union byte c2; word x; temp; 3 ow_reset; write_byte(0xC
6、C); / Skip ROM write_byte(0xBE); / Read Scratch 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 #inclu
7、detouwenjian.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 /人体感应延时时间 byte hwx_delay=hwx_delay_const;/用于保存红外线触发延长时间 word hwx_
8、jishu1=0; / 4 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 station0zidong,dingshi,shoudong,weakstate; /函数说明区 extern byte Real_Tem(void ); extern void delay(word useco
9、nds); 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
10、都下降沿触发 /以下为开启部分 IP=0X01; /两个定时器同等优先级 / while(Real_Tem=85); 5 IE=0x8b; /开启定时器0,1,外部中断0中断 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 */
11、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; 6 flag_dingshi_delay=0
12、;dingshi_delay=100; time_stor=100;wendu_stor=100;/触发 mingjiao; while(KEY1=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;/
13、 / mingjiao; while(KEY4=0); else if(KEY5=0) weak_default; mingjiao; while(KEY5=0); else if(KEY2=0)/加分 break; 7 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; w
14、hile(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); else if(KEY2=0)/快1 bre
15、ak; case zidong: if(KEY1=0) /状态转换时做些相应的处理 8 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(KE
16、Y2=0); else if(KEY3=0)/中2 JDQ1=1;JDQ3=1;JDQ2=0;/关断其它 JDQ1=1;JDQ2=1;JDQ3=0;/关断其它 9 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 LED_zhong=LED_kuai=1;LED_man=0; state=shoudong; LED_zidong=1;LED_shoudong=0; mingjiao; while(KEY4
17、=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 TH1=0x15;TL1=0xa
18、0; / /红外线到记时 EX0=0; if(hwx_jishu10)dingshi_jishu3-; else dingshi_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; /
19、 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; static bit flag_jiaoti=0; if(jiaoti_jishu249)jiaoti_
20、jishu2+; 11 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(wend
21、u,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
22、; case vhi_wen: JDQ2=1;JDQ3=1;JDQ1=0; 12 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; /* 数码管显示子程序 功能:数据送到数码管显示 */ by
23、te 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 shuzhu4; shuzhu1=input/10; shuzhu0=input%10; for(i=0;i4;i+) 13 if(i2) k=shumaguan shuzhui; if(kkl=0&i=0)k+; else k=0; for(j=0;j=1; CP=1; /* 蜂鸣器鸣叫子程序 功能:只负责鸣叫就是
24、*/ void mingjiao(void) byte i; for(i=0;ivhi_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; 14 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; L
25、ED_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; 15