想用ds18b20控制风扇转速,总是程序总是有错,望帮忙检查一下
#include<reg52.h>#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
//void wenkong();
/*********************** 定义数据接口 **************************/
sbit wd=P2^0; //温度传感器信号线
sbit IN1=P2^1; // 风扇in1 put1 负极
sbit IN2=P2^2; // 风扇in2 put2 正极
/*********************** 定义全局变量 **************************/
uchar fen,dd,ee,KG,dw,yt,ds,cd,i,yd,li,miao,MS,zr,SD,sm,sm1,sm2,sm3;
char x,bz,count,second,minute,hour;
uint temp;
float f_temp;
/*********************** 功能:延时函数 0 *************************************/
void delay(uchar d)
{
uchar x,y;
for(x=d;x>0;x--)
for(y=110;y>0;y--);
}
/***************************************************************************************
******************************* 功能:18B20 所有函数************************************/
/******************* 18B20复位,初始化函数 **************************/
void dsreset(void)
{
uint i;
wd=0;
i=103;
while(i>0)i--;
wd=1;
i=4;
while(i>0)i--;
}
/******************* 18B20 读1位 函数 **************************/
bit tempreadbit(void)
{
uint i;
bit dat;
wd=0;i++; //i++ 起延时作用
wd=1;i++;i++;
dat=wd;
i=8;while(i>0)i--;
return (dat);
}
/******************* 18B20 读1个字节 函数 **************************/
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);
}
/******************* 18B20 写一个字节数据 函数 **************************/
void tempwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
wd=0;
i++;i++;
wd=1;
i=8;while(i>0)i--;
}
else
{
wd=0; //写 0
i=8;while(i>0)i--;
wd=1;
i++;i++;
}
}
}
/******************* 18B20 开始获取温度并转换 函数 **************************/
void tempchange(void)
{
dsreset();
delay(5);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); // 写温度转换指令
}
/******************* 18B20 读取寄存器中存储的温度数据 函数 **************************/
uint get_temp()
{
uchar a,b;
dsreset();
delay(5);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为1个字
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是整型
}
/******************* 18B20 发送数据 函数 **************************/
void comm(char *parr)
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
}
/********************** 功能:主函数 ******************************/
void main()
{
// count=20;second=0;minute=0;hour=0;P1=0xff;yd=0;
//li=0;miao=0;bz=0;MS=0;KG=0;zr=0;sm=0;sm1=0;sm2=0;sm3=0;
if(temp<=150)
{
while (1)
{
IN1=0;
IN2=1;
delay (3000);
IN1=1;
IN2=1;
delay (3000);
}
} // 温度<=15.0℃ 一档
else if(temp>=151&&temp<=320)
{
while (1)
{
IN1=0;
IN2=1;
delay (1500);
IN1=1;
IN2=1;
delay (1500);
}
}// 15.1℃<=温度<=32.0℃ 开二档
else if(temp>=321&&temp<=400)
{
while (1)
{
IN1=0;
IN2=1;
delay (750);
IN1=1;
IN2=1;
delay (750);
}
}// 32.1℃<=温度<=40.0℃ 开三档
}