📄 智能风扇程序.c
字号:
#include <intrins.h>
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" Set 000 ";
uchar code table1[]="Speed 000 T:00.0";
uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar count,num;
long int sudu;
uchar bai,shi,ge,qian,gaowei,diwei;
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag,flag;//温度正负标志
uchar s1num,s2num,s4num,s5num,s8num;
uchar fengsu;
uchar ziran1,ziran2,ziran3;
uchar setspeed;
sbit rs=P2^0;//液晶显示
sbit lcden=P2^1;//液晶功能
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit s1=P1^0;//全速按钮
sbit s2=P1^1;//停止按钮
sbit s3=P1^2;//半速按钮
sbit s4=P1^3;//自然风按钮
sbit s5=P1^4;//速度功能按钮
sbit s6=P1^5;//风扇速度设置按钮——加
sbit s7=P1^6;//风扇速度设置按钮——减
sbit s8=P1^7;//智能按钮
sbit zhishi0=P3^1;//速度设置指示灯
sbit zhishi1=P2^2;//全速指示灯
sbit zhishi2=P2^3;//停止指示灯
sbit zhishi3=P2^4;//半速指示灯
sbit zhishi4=P2^5;//自然风指示灯
sbit zhishi5=P2^6;//智能方式指示灯
sbit zhishi6=P2^7;//声光报警灯
sbit kongzhikou=P3^0;//继电器输出口
void write_com(uchar com);
void write_sfm(uchar add,uchar date);
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/****蜂鸣器响应频率延时程序****/
void delaybaojing(uint m)
{
uint x,y;
for(x=m;x>0;x--)
for(y=50;y>0;y--);
}
/****自然风延时程序****/
void delayziranfeng(uint n)
{
uint x,y;
for(x=n;x>0;x--)
{
if(s1&&s2&&s3&&s4&&s5&&s6&&s7&&s8!=0)
for(y=110;y>0;y--);
else
{
s4num=0;
s8num=0;
}
}
}
/**************各个按键的功能函数****************/
void s1_function()
{
if(s1num==1&&s2&&s3&&s4&&!s5num&&s6&&s7&&s8&&s5)
{
s1num=0;
zhishi1=0;
zhishi2=1;
zhishi3=1;
zhishi4=1;
zhishi5=1;
kongzhikou=1;
}
setspeed=0;
}
void s2_function()
{
while(s2num==1&&s3&&s4&&s5&&s8)
{
s2num=0;
zhishi0=1;
zhishi1=1;
zhishi2=0;
zhishi3=1;
zhishi4=1;
zhishi5=1;
kongzhikou=0;
}
setspeed=0;
}
void s3_function()
{
setspeed=0;
while(s3&&s2&&s1&&s4&&!s5num&&s6&&s7&&s8&&s5)
{
zhishi1=1;
zhishi2=1;
zhishi3=0;
zhishi4=1;
zhishi5=1;
kongzhikou=1;
delay(50);
kongzhikou=0;
delay(50);
}
}
void s4_function()
{
setspeed=0;
while(s4&&s2&&s3&&s1&&!s5num&&s6&&s7&&s8&&s5)
{
zhishi1=1;
zhishi2=1;
zhishi3=1;
zhishi4=0;
zhishi5=1;
for(ziran1=2;ziran1>0;ziran1--)
{
kongzhikou=1;
delayziranfeng(1000);
kongzhikou=0;
delayziranfeng(3000);
}
for(ziran2=2;ziran2>0;ziran2--)
{
kongzhikou=1;
delayziranfeng(2000);
kongzhikou=0;
delayziranfeng(2000);
}
for(ziran3=2;ziran3>0;ziran3--)
{
kongzhikou=1;
delayziranfeng(3000);
kongzhikou=0;
delayziranfeng(1000);
}
}
}
void s8_function()
{
while(s8num==1&&s2&&s3&&s4&&!s5num&&s6&&s7&&s1&&s5)
{
zhishi1=1;
zhishi2=1;
zhishi3=1;
zhishi4=1;
zhishi5=0;
while(tvalue<=200&&s1&&s2&&s3&&s4&&s5)
{
kongzhikou=0;
}
while(tvalue>200&&tvalue<=250&&s1&&s2&&s3&&s4&&s5)
{
for(ziran1=2;ziran1>0;ziran1--)
{
kongzhikou=1;
delayziranfeng(1000);
kongzhikou=0;
delayziranfeng(3000);
}
for(ziran2=2;ziran2>0;ziran2--)
{
kongzhikou=1;
delayziranfeng(2000);
kongzhikou=0;
delayziranfeng(2000);
}
for(ziran3=2;ziran3>0;ziran3--)
{
kongzhikou=1;
delayziranfeng(3000);
kongzhikou=0;
delayziranfeng(1000);
}
}
while(tvalue>250&&tvalue<=330&&s1&&s2&&s3&&s4&&s5)
{
kongzhikou=1;
delay(50);
kongzhikou=0;
delay(50);
}
while(tvalue>330&&tvalue<=400&&s1&&s2&&s3&&s4&&s5)
{
kongzhikou=1;
}
while(tvalue>400&&s1&&s2&&s3&&s4&&s5)
{
kongzhikou=0;
zhishi6=0;
delaybaojing(2);
zhishi6=1;
delaybaojing(2);
}
}
s8num=0;
setspeed=0;
}
void keyscan()
{
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
s1_function();
}
}
if(s2==0)
{
delay(5);
if(s2==0)
{ s2num++;
while(!s2);
s2_function();
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
s3_function();
}
}
if(s4==0)//自然风的运行,必须由外部中断来完成,扫描方式无法完成功能的随意转换,内部函数执行时间太长
{
delay(5);
if(s4==0)
{
while(!s4);
s4_function();
}
}
if(s8==0)
{
delay(5);
if(s8==0)
{ s8num++;
while(!s8);
s8_function();
}
}
}
void dingshiqi()
{
TMOD=0x51;
TH0=(65536-41000)/256;
TL0=(65536-41000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=0;
TL1=0;
ET1=0;
TR1=1;
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay(5);
}
}//液晶初始化程序
void dusu()
{
gaowei=TH1;
diwei=TL1;
TH1=0;
TL1=0;
TR1=1;
}
void xiesu()
{
sudu=(gaowei/16)*16*16*16+(gaowei%16)*16*16+(diwei/16)*16+diwei%16;
bai=sudu%1000/100;
write_com(0x80+0x40+6);
write_date(table2[bai]);
delay(2);
shi=sudu%1000%100/10;
write_com(0x80+0x40+7);
write_date(table2[shi]);
delay(2);
ge=sudu%10;
write_com(0x80+0x40+8);
write_date(table2[ge]);
delay(2);
write_com(0x80+0x40+9);
write_date(' ');
delay(2);
}
/***显示设置速度用函数***/
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void tiaosu()
{
kongzhikou=1;
delay(50+fengsu);
kongzhikou=0;
delay(50-fengsu);
}
void shesu()
{
kongzhikou=1;
delay(fengsu);
kongzhikou=0;
delay(100-fengsu);
}
void keyscan1()
{
flag=0;
if(s5==0)
{
delay(5);
if(s5==0)
{ s5num++;
while(!s5);
if(s5num==1)
{
zhishi0=0;
zhishi1=1;
zhishi2=1;
zhishi3=1;
zhishi4=1;
zhishi5=1;
write_com(0x80+9);
flag=0;
}
}
if(s5num==2)
{
zhishi0=1;
zhishi1=1;
zhishi2=1;
zhishi3=1;
zhishi4=1;
zhishi5=1;
s5num=0;
flag=1;
}
}
if(s5num==0)
{
if(s6==0&&s1&&s2&&s3&&s4&&s5&&s7&&s8)
{
delay(5);
if(s6==0)
{
while(!s6);
fengsu++;
if(fengsu>=50)
fengsu=50;
while(s6&&s2&&s1&&s3&&s4&&s8&&s5&&s7)
tiaosu();
}
}
if(s7==0&&s1&&s2&&s3&&s4&&s5&&s6&&s8)
{
delay(5);
if(s7==0)
{
while(!s7);
fengsu--;
if(fengsu<=-50)
{ fengsu=-50; }
while(s6&&s2&&s1&&s3&&s4&&s8&&s5&&s7)
tiaosu();
}
}
while(s5num==0&&s1&&s2&&s3&&s4&&s5&&s6&&s7&&s8&&flag)
{
fengsu=setspeed*5;
shesu();
}
}
if(s5num!=0)
{
if(s6==0)
{
delay(5);
if(s6==0)
{
while(!s6);
if(s5num==1)
{
setspeed++;
if(setspeed==21)
setspeed=0;
write_sfm(9,setspeed);
write_com(0x80+9);
}
}
}
if(s7==0)
{
delay(5);
if(s7==0)
{
while(!s7);
if(s5num==1)
{
setspeed--;
if(setspeed==-1)
setspeed=20;
write_sfm(9,setspeed);
write_com(0x80+9);
}
}
}
}
}
/**/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
write_com(0xc0+10);
write_date('T');//显示符号位
write_com(0xc0+11);
write_date(':');//显示百位
write_com(0xc0+12);
write_date(disdata[1]);//显示十位
write_com(0xc0+13);
write_date(disdata[2]);//显示个位
write_com(0xc0+14);
write_date(0x2e);//显示小数点
write_com(0xc0+15);
write_date(disdata[3]);//显示小数位
}
void main()
{
kongzhikou=0;
init();
dingshiqi();
dusu();
xiesu();
read_temp();//读取温度
ds1820disp();//显示
while(1)
{ keyscan();
keyscan1();
}
}
void timer0() interrupt 1
{
TH0=(65536-41000)/256;
TL0=(65536-41000)%256;
count++;
if(count==20)
{
count=0;
TR1=0;
dusu();
xiesu();
read_temp();//读取温度
ds1820disp();//显示
write_sfm(9,setspeed);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -