下面是main.c文件,求各位过目!
#include "reg52.h"
#include "Ds.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,};
void delay(u16 i)
{
while(i--);
}
void datapros(u16 temp)
{
float tp;
if (temp<0)
{
DisplayData[0]=0x40;
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0]=0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
DisplayData[1]=smgduan[temp/10000]; //百
DisplayData[2]=smgduan[temp%10000/1000]; //十
DisplayData[3]=smgduan[temp%1000/100]|0x80; //个+小数点
DisplayData[4]=smgduan[temp%100/10]; //0.1
DisplayData[5]=smgduan[temp%10]; //0.01
}
void smgDisplay()
{
u8 i;
for(i=0;i<6;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
}
P0=DisplayData[5-i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
datapros(DsTempRead());
smgDisplay();
}
}
下面是Ds.c文件的程序,求各位过目这个DS18B20的程序是否有错!
#include "Ds.h"
void delay10us(u16 i) //误差 0us
{
unsigned char a,b;
for(;i>0;i--)
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
//初始化函数//
u8 DsInit()
{
DsPort=0; //数据线拉低
delay10us(65); //延时600us
DsPort=1; //数据线拉高
delay10us(8); //延时80us
while(DsPort) //判断DsPort是否被拉低
{
u8 i;
delay10us(100); //延时1ms
i++;
if(i>5)
{
return 0; //初始化失败,Ds不存在
}
}
return 1; //初始化成功,Ds存在
}
u8 DsReadByte() //单片机读字节
{
u8 byte,bi; //定义字节,每次接收的值
u8 i=0;
for(i;i<8;i++)
{
DsPort=0; //数据线拉低
i=i; //延时1us
DsPort=1; //数据线拉高
delay10us(1);//延时10us
bi=DsPort; //读取接收值
byte=(byte>>1)|(bi<<7); //通过调整,使byte得到读取字节
delay10us(5); //读取完后延时50us读取下一个接收值
}
return byte;
}
void DsWriteByte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
DsPort=0; //数据线拉低
delay10us(1); //延时15us
DsPort=dat&0x01; //传送数据
delay10us(7); //延时60us
DsPort=1; //释放总线
dat>>=1; //传输下一位
}
}
void DsTempChange()
{
DsInit(); //初始化
delay10us(100); //延时1ms
DsWriteByte(0xCC); //跳过ROM操作命令
DsWriteByte(0x44); //温度转换命令
}
void DsTempReadCom()
{
DsInit(); //初始化
delay10us(100); //延时1ms
DsWriteByte(0xCC); //跳过ROM操作命令
DsWriteByte(0xBE); //温度转换命令
}
u16 DsTempRead() //读取温度
{
u16 temp;
u8 tml,tmh; //定义温度低八位,高八位
DsTempChange(); //开始温度转换
DsTempReadCom(); //开始温度读取
tml=DsReadByte(); //读取低八位
tmh=DsReadByte(); //读取高八位
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}