智能控制风扇源程序c语言Word格式.docx
《智能控制风扇源程序c语言Word格式.docx》由会员分享,可在线阅读,更多相关《智能控制风扇源程序c语言Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
//低电平鸣叫
ds18b20.c
#include<
REGX51.H>
#include"
touwenjian.h"
/*****************************************************
延时子程序
*****************************************************/
externvoiddelay(worduseconds)
{
for(;
useconds>
0;
useconds--);
}
复位子程序
******************************************************/
staticbyteow_reset(void)
bytepresence;
EA=0;
DQ=0;
//pullDQlinelow
delay(45);
//leaveitlowfor480us//551us
DQ=1;
//allowlinetoreturnhigh
delay(4);
//waitforpresence//61us
presence=DQ;
//getpresencesignal
delay(40);
//waitforendoftimeslot//491us
EA=1;
return(presence);
//presencesignalreturned
}//0=presence,1=nopart
/*******************************************************
从1-wire总线上读取一个字节子程序
********************************************************/
staticbyteread_byte(void)
bytei;
bytevalue=0;
for(i=8;
i>
i--)
value>
>
=1;
//pullDQlowtostarttimeslot
//thenreturnhigh
{unsignedchari;
for(i=0;
i<
2;
i++);
}//11us
if(DQ)value|=0x80;
delay(6);
//waitforrestoftimeslot
return(value);
/********************************************************
向1-WIRE总线上写一个字节
*********************************************************/
staticvoidwrite_byte(charval)
i>
i--)//writesbyte,onebitatatime
//pullDQlowtostarttimeslot
DQ=0;
DQ=val&
0x01;
//6US
delay(5);
//holdvalueforremainderoftimeslot//74us
val=val>
1;
}
读取温度
*******************************************************/
wordRead_Temperature(void)
union{
bytec[2];
wordx;
}temp;
ow_reset();
write_byte(0xCC);
//SkipROM
write_byte(0xBE);
//ReadScratchPad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
//SkipROM
write_byte(0x44);
//StartConversion
returntemp.x;
/***************************************************************
求解温度
***************************************************************/
externbyteReal_Tem(void)
{
wordwen;
wen=Read_Temperature();
return((wen>
4)&
0x00ff);
Main.c
//数据区
#definetime_default41
bytedingshi_time=time_default;
//存放定时时间'
'
bitflag_dingshi=0;
//0表示没有定时
worddingshi_jishu3=1000;
//1000*60=1分钟
//
bitflag_dingshi_delay=0;
//1表示有
bytedingshi_delay=100;
#definehwx_delay_const3//人体感应延时时间
bytehwx_delay=hwx_delay_const;
//用于保存红外线触发延长时间
wordhwx_jishu1=0;
bytewendu=0;
//用于存放温度值'
#definelow_wen18
#definemid_wen20
#definehig_wen24
#definevhi_wen28
bytetime_stor=100;
//存储主观时间//触发显示
bytewendu_stor=low_wen;
//存储主观温度//触发显示
enumstation0{zidong,dingshi,shoudong,weak}state;
//函数说明区
externbyteReal_Tem(void);
externvoiddelay(worduseconds);
voidmingjiao(void);
voiddisplay(byteinput,bitkkl);
voidauto_speed(void);
voidweak_default(void);
/*******************************************************************
主程序
*******************************************************************/
voidmain()
//定时器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)
{
wendu=Real_Tem();
}
/***********************************************************************************
定时器0中断服务子程序
功能:
进行键盘处理
说明:
键盘输入为P1.0到P1.4
***********************************************************************************/
voidtime0(void)interrupt1
bytejianpan;
TH0=0xd8;
jianpan=P1&
wujian;
if(jianpan!
=wujian)//如果还有键盘值提取键盘值
delay(500);
//延时消抖
if(jianpan==wujian)gototime_out;
switch(state)
{
casedingshi:
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);
}
elseif(KEY2==0)//加分
{
if(dingshi_time<
90)
{dingshi_time+=10;
dingshi_delay=100;
while(KEY2==0);
elseif(KEY3==0)//减分
if(dingshi_time>
10)
{dingshi_time-=10;
while(KEY3==0);
elseif(KEY4==0)//定时与否
flag_dingshi=~flag_dingshi;
if(flag_dingshi==1){LED_dingshi=0;
else{LED_dingshi=1;
dingshi_jishu3=1000;
//
while(KEY4==0);
elseif(KEY5==0)
weak_default();
while(KEY5==0);
break;
caseshoudong:
if(KEY1==0)//状态转换时做些相应的处理
state=zidong;
auto_speed();
LED_shoudong=1;
LED_zidong=0;
mingjiao();
elseif(KEY2==0)//快1
JDQ2=1;
JDQ3=1;
JDQ1=0;
//关断其它
LED_zhong=LED_man=1;
LED_kuai=0;
elseif(KEY3==0)//中2
JDQ1=1;
JDQ2=0;
LED_kuai=LED_man=1;
LED_zhong=0;
elseif(KEY4==0)//慢3
JDQ2=1;
JDQ3=0;
LED_zhong=LED_kuai=1;
LED_man=0;
elseif(KEY5==0)//停4
casezidong:
if(KEY1==0)//状态转换时做些相应的处理
state=dingshi;
LED_zidong=1;
flag_dingshi_delay=1;
//开始延时
state=shoudong;
LED_shoudong=0;
caseweak:
if(KEY1==0)
wendu_stor=100;
//两个不可能值
}
time_out:
;
/*************************************************************************************
定时器1中断服务子程序
功能:
用于定时0.060s
*************************************************************************************/
voidtimer1(void)interrupt3
TL1=0xa0;
//红外线到记时
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--;
{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;
LED_shoudong=0;
time_stor=100;
mingjiao();
//显示和温控
casedingshi:
//在定时的时候只显示时间
if(time_stor!
=dingshi_time){display(dingshi_time,1);
time_stor=dingshi_time;
//
break;
caseshoudong:
casezidong:
//是否有定时,有则交替显示温度和时间,没有则只显示温度
if(flag_dingshi!
=0)//
{
staticbytejiaoti_jishu2=0;
staticbitflag_jiaoti=0;
if(jiaoti_jishu2<
49){jiaoti_jishu2++;
else{flag_jiaoti=~flag_jiaoti;
jiaoti_jishu2=0;
if(flag_jiaoti!
=0)
=dingshi_time)
{display(dingshi_time,1);
}//显示时间
if(wendu_stor!
=wendu)
{display(wendu,0);
wendu_stor=wendu;
time_stor=100;
}//显示温度
}
else
if(wendu_stor!
=wendu){display(wendu,0);
}//显示温度
//温度控制速度
if(state=