?? 智能風扇程序.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 + -