基于51单片机的 电风扇控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
sbit pwm_out=P2^6; //电扇 驱动信号
sbit yt_out=P2^7; //摇头驱动信号
sbit bit1=P2^0; // 数码管位选 因为端口 复用 所以 位选单独使用位
sbit bit2=P2^1;
sbit bit3=P2^2;
sbit bit4=P2^3;
sbit wxout=P2^5; //温度 太高 报警灯
sbit clock=P2^4; //
sbit start=P3^5;
sbit eoc=P3^6; //adc0809 驱动端口定义
sbit oe=P3^7; //
#define outseg P0 //段选
#define key P3
#define key_zrf 0x01 //常风
#define key_cf 0x02 // 自然风
#define key_smf 0x04 // 睡眠风
#define key_ds 0x08 // 定时
#define key_yt 0x10 // 摇头
data uchar ledbuf[4]={0x00,0x00,0x00,0x00}; // 显示暂存
code uchar table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //段码
uchar pwm_cnt=0; //pwm计数
uint sec_cnt,dat; //秒计数 ad数据
uchar yt_cnt,wxin=0xf0; //~~ 摇头计数 温度报警设置阈值
uchar pwm_h=1;//脉宽高电平持续时间
uchar djs_time;//倒计时值
bit yt_flag=0;//1-摇头 0-停
void delay(uchar x)
{uchar i;
while(x--){for(i=0;i<200;i++);}
}
void displayled(void)
{
bit1=0;
bit2=1;
bit3=1;
bit4=1;
outseg=~table[ledbuf[0]];
delay(1);
bit1=1;
bit2=0;
bit3=1;
bit4=1;
outseg=~table[ledbuf[1]];
delay(1);
bit1=1;
bit2=1;
bit3=0;
bit4=1;
outseg=~table[ledbuf[2]];
delay(1);
bit1=1;
bit2=1;
bit3=1;
bit4=0;
outseg=~table[ledbuf[3]];
delay(1);
}
uchar kbscan()
{uchar i=0;
if(~key&0x1f)//有键
{displayled();
displayled();
displayled(); //延时
if(~key&0x1f){
i=(~key)&0x1f;
while((~key)&0x1f){displayled();}} //键释放
}
return(i);
}
void key_proc(uchar k)
{switch(k){
case key_zrf: //自然风1:3
pwm_h=3;
ledbuf[3]=1;
break;
case key_cf: //常风3:1
pwm_h=9;ledbuf[3]=2;
break;
case key_smf: //睡眠风1:5
pwm_h=2;
ledbuf[3]=3;
break;
case key_ds: //定时
if(djs_time%10>4){djs_time=((djs_time/10)+2)*10;}
else djs_time=((djs_time/10)+1)*10;
break;
case key_yt: //摇头
yt_flag=!yt_flag;
break;
default:break;
}
}
void t0_int() interrupt 1
{
TH0= (65536-1000)/256;
TL0= (65536-1000)%256;
if(pwm_cnt>11)pwm_cnt=0;
else pwm_cnt++;
if(pwm_cnt==pwm_h)pwm_out=0;
else if(pwm_cnt==0) pwm_out=1;
//pwm 调制
sec_cnt++;
yt_cnt++;
if (yt_flag)
{ if(yt_cnt>59)yt_cnt=0;
if(yt_cnt<30)yt_out=1;
else yt_out=0;
}
else yt_cnt=0;
}
main()
{unsigned char vv;//
TMOD=0x01;
IE= 0x82;
TH0= (65536-1000)/256;
TL0= (65536-1000)%256;
TR0= 1;
while(1) //
{pwm_h=0; //
vv=kbscan();
if(vv!=1&&vv!=2&&vv!=4){ break; } //判断有没有按下风级键 没有就不输出
}
while(1)
{
key_proc(kbscan());
if(sec_cnt>999)
{
sec_cnt=0;
if(djs_time)djs_time--;
}
/////////////////////////////////
//yaotou
/////////////////
//////////////
ledbuf[0]=djs_time%10;
ledbuf[1]=djs_time%100/10;
ledbuf[2]=10;
displayled();
wxout=1;
start=0;
start=1;
start=0;
do{
clock=~clock;
}while(eoc==0);
oe=1;
dat=P1;
oe=0;
if(dat>=wxin)
{wxout=0; TR0=0;}
else TR0=1; //温度大于阈值 报警
}
}