您们看看这程序对不对?还请各位指教
我做一个智能风扇,用了51,ds18b20,但是这个程序总达不到我的理想效果,还请各位指教#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit ds=P2^0;
uint temp; //定义整形温度数据
float f_temp; //定义浮点型的温度数据
uint warn_11=250; //定义温度下限制 是温度乘以10后的结果
uint warn_12=50; //定义温度下限值
uint warn_h1=500; //定义温度上限值
uint warn_h2=750; //定义温度上限值
uchar t;
void delay (uint z) //延时函数
{
uint x,y;
for (x=z;x>0;x--)
for (y=110;y>0;y--);
}
void dsreset (void) //DS18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while (i>0)i--;
ds=1;
i=4;
while (i>0)i--;
}
bit tempreadbit (void) //读一位数据函数
{
uint i;
bit dat;
ds=0;i++; //i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread (void) //读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte (uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange (void) //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为一个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取 1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
void deal (uint t) //温度处理函数
{
if((t>warn_12)&&(t<=warn_11)) //大于5度小25
{
while (1)
{
IN1=0;
IN2=1;
delay (2000);
IN1=1;
IN2=1;
delay (2000);
}
}
else if(t<=warn_12) //小于5度
{
while (1)
{
IN1=0;
IN2=1;
delay (3000);
IN1=1;
IN2=1;
delay (3000);
}
}
else if((t<warn_h2)&&(t>=warn_h1)) //小于75度大于50度
{
while (1)
{
IN1=0;
IN2=1;
delay (500);
IN1=1;
IN2=1;
delay (500);
}
}
else if(t>=warn_h2) //大于75度
{
IN1=0;
IN2=1;
}
}
void init_com(void) //串口初始化函数
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xfd; //波特率9600
TL1=0xfd;
TR1=1;
}
void comm (char *parr) //串口数据发送函数
{
do
{
SBUF=*parr++; //发送数据
while (!TI); //等待发送完成标志为1
TI=0; //标志清零
}
while(*parr); //保持循环直到字符为'\0'
}
void main () //主函数
{
uchar buff[4],i;
init_com();
while(1)
{
tempchange(); //温度转换函数
deal(temp); //进行温度处理
sprintf(buff,"%f",f_temp); //将 浮点型温度格式 化为字符型
comm(buff); //串口发送数据
}
}