智能控制风扇源程序c语言.docx
- 文档编号:23158666
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:22
- 大小:18.99KB
智能控制风扇源程序c语言.docx
《智能控制风扇源程序c语言.docx》由会员分享,可在线阅读,更多相关《智能控制风扇源程序c语言.docx(22页珍藏版)》请在冰豆网上搜索。
智能控制风扇源程序c语言
/***********************************************************************
touwenjian.h
***********************************************************************/
typedefunsignedcharbyte;
typedefunsignedintword;
//以下管脚配置
//ds18b20部分
sbitDQ=P3^4;
//显示部分
sbitDB=P2^0;
sbitCP=P2^1;
//发光显示部分
sbitLED_dingshi=P0^0;
sbitLED_shoudong=P0^1;
sbitLED_zidong=P0^2;
sbitLED_kuai=P0^3;
sbitLED_zhong=P0^4;
sbitLED_man=P0^5;
//键盘定义部分
#definewujian0x3f
sbitKEY1=P1^0;//状态转换/启动
sbitKEY2=P1^1;//+10/1
sbitKEY3=P1^2;//-10/2
sbitKEY4=P1^3;//3
sbitKEY5=P1^4;//0确定
//继电器控制部分
sbitJDQ1=P2^4;//0表示开通,1表示关断
sbitJDQ2=P2^5;
sbitJDQ3=P2^6;
//蜂鸣器部分
sbitcall=P2^7;//低电平鸣叫
/***********************************************************************
ds18b20.c
***********************************************************************/
#include
#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;
EA=0;
for(i=8;i>0;i--)
{
value>>=1;
DQ=0;//pullDQlowtostarttimeslot
DQ=1;//thenreturnhigh
{unsignedchari;
for(i=0;i<2;i++);}//11us
if(DQ)value|=0x80;
delay(6);//waitforrestoftimeslot
}
EA=1;
return(value);
}
/********************************************************
向1-WIRE总线上写一个字节
*********************************************************/
staticvoidwrite_byte(charval)
{
bytei;
EA=0;
for(i=8;i>0;i--)//writesbyte,onebitatatime
{
DQ=0;//pullDQlowtostarttimeslot
DQ=0;
DQ=val&0x01;//6US
delay(5);//holdvalueforremainderoftimeslot//74us
DQ=1;
val=val>>1;
}
EA=1;
delay(5);
}
/*******************************************************
读取温度
*******************************************************/
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();
ow_reset();
write_byte(0xCC);//SkipROM
write_byte(0x44);//StartConversion
returntemp.x;
}
/***************************************************************
求解温度
***************************************************************/
externbyteReal_Tem(void)
{
wordwen;
wen=Read_Temperature();
return((wen>>4)&0x00ff);
}
/***********************************************************************
Main.c
***********************************************************************/
#include
#include"touwenjian.h"
//数据区
#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;TL0=0xf0;
jianpan=P1&wujian;
if(jianpan!
=wujian)//如果还有键盘值提取键盘值
{
delay(500);//延时消抖
jianpan=P1&wujian;
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;//
mingjiao();
while(KEY2==0);
}
elseif(KEY3==0)//减分
{
if(dingshi_time>10)
{dingshi_time-=10;}
dingshi_delay=100;//
mingjiao();
while(KEY3==0);
}
elseif(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);
}
elseif(KEY5==0)
{
weak_default();
mingjiao();
while(KEY5==0);
}
break;
caseshoudong:
if(KEY1==0)//状态转换时做些相应的处理
{
state=zidong;
auto_speed();
LED_shoudong=1;LED_zidong=0;
mingjiao();
while(KEY1==0);
}
elseif(KEY2==0)//快1
{
JDQ2=1;JDQ3=1;JDQ1=0;//关断其它
LED_zhong=LED_man=1;LED_kuai=0;
mingjiao();
while(KEY2==0);
}
elseif(KEY3==0)//中2
{
JDQ1=1;JDQ3=1;JDQ2=0;//关断其它
LED_kuai=LED_man=1;LED_zhong=0;
mingjiao();
while(KEY3==0);
}
elseif(KEY4==0)//慢3
{
JDQ1=1;JDQ2=1;JDQ3=0;//关断其它
LED_zhong=LED_kuai=1;LED_man=0;
mingjiao();
while(KEY4==0);
}
elseif(KEY5==0)//停4
{
weak_default();
mingjiao();
while(KEY5==0);
}
break;
casezidong:
if(KEY1==0)//状态转换时做些相应的处理
{
state=dingshi;
LED_zidong=1;
flag_dingshi_delay=1;dingshi_delay=100;//开始延时
time_stor=100;//
mingjiao();
while(KEY1==0);
}
elseif(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);
}
elseif(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);
}
elseif(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);
}
elseif(KEY5==0)//停4
{
weak_default();
mingjiao();
while(KEY5==0);
}
break;
caseweak:
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
*************************************************************************************/
voidtimer1(void)interrupt3
{
TH1=0x15;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--;}
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)
{
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)
{
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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 控制 风扇 源程序 语言