风扇调速系统程序.docx
《风扇调速系统程序.docx》由会员分享,可在线阅读,更多相关《风扇调速系统程序.docx(12页珍藏版)》请在冰豆网上搜索。
风扇调速系统程序
#include
codeunsignedcharseg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x40};//显示段码
sbitTMDAT=P3^1;//DS18B20的数据输入/输出脚DQ,根据情况设定
sbitP2_7=P2^7;
sbitP2_6=P2^6;
sbitP2_5=P2^5;
sbitjia=P2^4;
sbitjian=P2^3;
sbitdi=P2^2;
sbitzh=P2^1;
sbitga=P2^0;
j=0;
unsignedintsdata;//测量到的温度的整数部分
//unsignedcharxiaoshu1;//小数第一位
//unsignedcharxiaoshu2;//小数第二位
//unsignedcharxiaoshu;//两位小数
bitfg=1;//温度正负标志
//////////*显示延时程序*///////////////
voidDelay(unsignedinttc)
{while(tc!
=0)
{unsignedinti;
for(i=0;i<80;i++);
tc--;}
}
////////////延时部分///////////////
voidyanshi(unsignedintcount)
{
unsignedchari;
while(count--)
{for(i=0;i<115;i++);}
}
voiddel()/*延时1秒*/
{
unsignedchari,j,k;
for(i=20;i>0;i--)
for(j=100;j>0;j--)
for(k=248;k>0;k--);
}
/////////////发送复位///////////////
voidfashong(void)
{
unsignedchari;
TMDAT=0;for(i=0;i<103;i++);
TMDAT=1;for(i=0;i<4;i++);
}
bittmrbit(void)//读一位//
{
unsignedinti;
bitdat;
TMDAT=0;
i++;
TMDAT=1;
i++;i++;//微量延时//
dat=TMDAT;
for(i=0;i<8;i++);
return(dat);
}
unsignedchartmrbyte(void)//读一个字节
{
unsignedchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tmrbit();dat=(j<<7)|(dat>>1);}
return(dat);
}
voidtmwbyte(unsignedchardat)//写一个字节
{
unsignedcharj,i;
bittestb;
for(j=1;j<=8;j++)
{testb=dat&0x01;
dat=dat>>1;
if(testb)
{TMDAT=0;//写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);}
else
{TMDAT=0;//写0
for(i=0;i<8;i++);
TMDAT=1;
i++;i++;}
}
}
voidtmstart(void)//发送ds1820开始转换
{
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0x44);//发转换命令44H,
}
voidtmrtemp(void)//读取温度
{
unsignedchara,b;
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0xbe);//发送读取命令
a=tmrbyte();//读取低位温度
b=tmrbyte();//读取高位温度
if(b>0x7f)//最高位为1时温度是负
{a=~a;b=~b+1;//补码转换,取反加一
fg=0;//读取温度为负时fg=0
}
sdata=a/16+b*16;//整数部分
//xiaoshu1=(a&0x0f)*10/16;//小数第一位
//xiaoshu2=(a&0x0f)*100/16%10;//小数
//xiaoshu=xiaoshu1*10+xiaoshu2;//小数
}
voidDS18B20PRO(void)
{
tmstart();
//yanshi(5);//如果是不断地读取的话可以不延
tmrtemp();//读取温度,执行完毕温度将存于
}
voidLed()
{
if(fg==1)//温度为正时显示的数据
{
P2_7=0;
P0=seg7code[sdata/10];//输出十位
Delay(8);P2=P2|0xf0;
P2_6=0;
P0=seg7code[sdata%10]|0x80;//输出个位
Delay(8);P2=P2|0xf0;
P2_5=0;
P0=seg7code[j%10]|0x80;//输出延时位
Delay(4);P2=P2|0xf0;
}
}
main()
{
fg=1;
while
(1)
{
if(jia==0)
{Delay(200);j++;}
if(jian==0)
{Delay(200);j--;}
DS18B20PRO();
Led();
if(di==0)
{Delay(200);P1=0xfe;}
if(zh==0)
{Delay(200);P1=0xfd;}
if(ga==0)
{Delay(200);P1=0xfb;}
}
}
风扇调速最终程序
#include
codeunsignedcharseg7code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x40};//显示段码
sbitTMDAT=P3^1;//DS18B20的数据输入/输出脚DQ,根据情况设定
sbitP2_7=P2^7;
sbitP2_6=P2^6;
sbitP2_5=P2^5;
sbitjia=P2^4;
sbitjian=P2^3;
sbitdi=P2^2;
sbitzh=P2^1;
sbitga=P2^0;
unsignedintz=0;
sbitq=P1^7;
unsignedintsdata;//测量到的温度的整数部分
//unsignedcharxiaoshu1;//小数第一位
//unsignedcharxiaoshu2;//小数第二位
//unsignedcharxiaoshu;//两位小数
bitfg=1;//温度正负标志
//////////*显示延时程序*///////////////
voidDelay(unsignedinttc)
{while(tc!
=0)
{unsignedinti;
for(i=0;i<80;i++);
tc--;}
}
////////////延时部分///////////////
voidyanshi(unsignedintcount)
{
unsignedchari;
while(count--)
{for(i=0;i<115;i++);}
}
/////////////发送复位///////////////
voidfashong(void)
{
unsignedchari;
TMDAT=0;for(i=0;i<103;i++);
TMDAT=1;for(i=0;i<4;i++);
}
bittmrbit(void)//读一位//
{
unsignedinti;
bitdat;
TMDAT=0;
i++;
TMDAT=1;
i++;i++;//微量延时//
dat=TMDAT;
for(i=0;i<8;i++);
return(dat);
}
unsignedchartmrbyte(void)//读一个字节
{
unsignedchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{j=tmrbit();dat=(j<<7)|(dat>>1);}
return(dat);
}
voidtmwbyte(unsignedchardat)//写一个字节
{
unsignedcharj,i;
bittestb;
for(j=1;j<=8;j++)
{testb=dat&0x01;
dat=dat>>1;
if(testb)
{TMDAT=0;//写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);}
else
{TMDAT=0;//写0
for(i=0;i<8;i++);
TMDAT=1;
i++;i++;}
}
}
voidtmstart(void)//发送ds1820开始转换
{
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0x44);//发转换命令44H,
}
voidtmrtemp(void)//读取温度
{
unsignedchara,b;
fashong();//复位
yanshi
(1);//延时
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0xbe);//发送读取命令
a=tmrbyte();//读取低位温度
b=tmrbyte();//读取高位温度
if(b>0x7f)//最高位为1时温度是负
{a=~a;b=~b+1;//补码转换,取反加一
fg=0;//读取温度为负时fg=0
}
sdata=a/16+b*16;//整数部分
//xiaoshu1=(a&0x0f)*10/16;//小数第一位
//xiaoshu2=(a&0x0f)*100/16%10;//小数
//xiaoshu=xiaoshu1*10+xiaoshu2;//小数
}
voidDS18B20PRO(void)
{
tmstart();
//yanshi(5);//如果是不断地读取的话可以不延
tmrtemp();//读取温度,执行完毕温度将存于
}
voidLed()
{
if(fg==1)//温度为正时显示的数据
{
P2_7=0;
P0=seg7code[sdata/10];//输出十位
Delay(8);P2=P2|0xf0;
P2_6=0;
P0=seg7code[sdata%10]|0x80;//输出个位
Delay(8);P2=P2|0xf0;
P2_5=0;
P0=seg7code[z%10]|0x80;//输出延时位
Delay(4);P2=P2|0xf0;
if(sdata>30)
{P1=0xfe;}
if(sdata>32)
{P1=0xfd;}
if(sdata>34)
{P1=0xfb;}
}
}
voidbuzidong()
{
voidDS18B20PRO();
voidLed();
DS18B20PRO();
Led();
if(di==0)
{Delay(200);P1=0xfe;}
if(zh==0)
{Delay(200);P1=0xfd;}
if(ga==0)
{Delay(200);P1=0xfb;}
}
voidzidong()
{
while(z--)
{
voidDS18B20PRO();
voidLed();
unsignedchari,k;
//for(y=30;y>0;y--)
for(i=12;i>0;i--)
//for(j=80;j>0;j--)
for(k=248;k>0;k--)
{
if(jia==0)
{Delay(200);z++;}
if(jian==0)
{Delay(200);z--;}
DS18B20PRO();
Led();
if(di==0)
{Delay(200);P1=0xfe;}
if(zh==0)
{Delay(200);P1=0xfd;}
if(ga==0)
{Delay(200);P1=0xfb;}
/*
if((di==0)||(sdata>30))
{Delay(200);P1=0xfe;}
if((zh==0)||(sdata>32))
{Delay(200);P1=0xfd;}
if((ga==0)||(sdata>34))
{Delay(200);P1=0xfb;}
*/
};
}
}
voidmain()
{
fg=1;
while
(1)
{
//if(jia==0)
//{Delay(200);z++;}
//if(jian==0)
//{Delay(200);z--;}
//zidong();
buzidong();
if(q==0)
{z++;zidong();P1=0xff;}
}
}