这是一个18B20的读取程序,并把数据发送出去,但是接收到的只有53.5求帮助
//DS18B20读写程序(基于STC单片机)
#include <reg51.H>
#include<intrins.h>
sbit DQ=P3^2;//定义单片机接ds18b20的数据端
void DelayNS(unsigned int dly)
{ unsigned int i;
for(; dly>0; dly--)
for(i=0; i<5000; i++)
_nop_();
}
//延时1us
void Delay1us(unsigned char us)
{
while(us)
{
_nop_();
--us;
}
}
//延时15us
void Delay15us(void)
{
Delay1us(15);
}
//延时10us
void Delay10us(void)
{
Delay1us(10);
}
//初始化串口:串口工作方式1,允许接受REN=1,波特率=1200
void initialize_UART()
{
P1=0xFF;
TMOD=0x20;
//下面已修改为适合12MHz晶振,11.0592改成E8
TH1=0xe6;
TL1=0xe6;
SCON=0x50;
TR1=1;
}
//串口发,查询发送
void s_send(unsigned char ch)
{
SBUF=ch;
TI=0;
while(!TI);
TI=0;
}
//ds18b20复位,返回0,设备正常,返回1,没有设备或设备不正常
bit resetpulse(void)
{
unsigned char i;
bit RstFlag;
RstFlag=1;
DQ=0;
for(i=0;i<40;i++)//480us延时
{
Delay15us();
}
DQ=1;
for(i=0;i<4;i++)//15~60us延时
{
Delay15us();
}
for(i=0;i<16;i++)//60~240us延时
{
Delay15us();
if(DQ==0)
RstFlag=0;
}
for(i=0;i<16;i++)
{
Delay15us();
}
return(RstFlag);
}
/*--------------------------------------------------
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void writecommandtods18b20(unsigned char command)
{
unsigned char i;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay15us();
DQ=command&0x1;//低位在先
Delay15us();
Delay15us();
Delay15us();
DQ=1;
command=command>>1;
Delay1us(1);
}
}
//ds18b20读命令
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char temp;
temp=0;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay10us();
DQ=1;
Delay1us(2);
temp=temp>>1;
if(DQ==1)
{
temp=temp+0x80;//先读到最高位,再依次右移
}
Delay15us();
Delay15us();
Delay15us();
}
return(temp);
}
/*---------------------------------------------------------
无论是读还是写操作,开始前一定要复位一下ds18b20.
-----------------------------------------------------------*/
//跳过读序号列号的操作
void SkipRomCode(void)
{
resetpulse(); //复位
writecommandtods18b20(0xCC);// 跳过读序号列号的操作
}
//启动转换
void StartADC(void)
{
resetpulse(); //复位
writecommandtods18b20(0xCC);//广播
writecommandtods18b20(0x44);//启动温度转换,12位,需时700ms
}
//获得温度值
unsigned int GetTempValue(void)
{
unsigned i,j;
unsigned int T;
SkipRomCode();
writecommandtods18b20(0xBE);//读取温度值的命令
i=readdatafromds18b20(); //温度低八位
j=readdatafromds18b20(); //温度高八位
StartADC();
T=i+j*256;
if(T==0xFFFF) return 0xFFFF;
if(T>0x8000) //温度为负
{
T=~T+1;
return(0x8000+T*5/8);
}
else //温度位正
{
return(T*5/8);
}
}
//------------------------------------------------------------------------
// 函数名 : main()
// 功 能 :
//------------------------------------------------------------------------
void main(void)
{
unsigned int w;
initialize_UART();
SkipRomCode(); //主机发布跳过读序号列号的操作
writecommandtods18b20(0x44);//启动温度转换
while(1)
{
DelayNS(38); //延时700ms
w=GetTempValue();
s_send((w%1000)/100+48);// 十位
DelayNS(1);
s_send((w%100)/10+48);//个位
DelayNS(1);
s_send(46);//小数点
DelayNS(1);
s_send(w%10+48);//小数位
DelayNS(1);
s_send(10);//换行
}
}
//说明:读写18b20,并送串口终端显示!
------围观模式启动中... -------> 视觉系统开启...
-------> 搜寻网络...
-------> 正在加载1000Tb/s带宽...
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 1.24s)
状态:已连接上
速度:1000GMbps
-------> 正在加载原始萨钢护目镜
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 3.23s)
加载完毕...
-------> 正在加载加固版钛合金F5
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 6.52s)
加载完毕...
-------> 正在加载铬合金钻石轴承滚轮
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 4.69s)
加载完毕...
-------> 围观模式启动完毕,进入强势围观LZ状态
//DS18B20读写程序(基于STC单片机)
#include <reg51.H>
#include<intrins.h>
sbit DQ=P3^2;//定义单片机接ds18b20的数据端
void DelayNS(unsigned int dly)
{ unsigned int i;
for(; dly>0; dly--)
for(i=0; i<5000; i++)
_nop_();
}
//延时1us
void Delay1us(unsigned char us)
{
while(us)
{
_nop_();
--us;
}
}
//延时15us
void Delay15us(void)
{
Delay1us(15);
}
//延时10us
void Delay10us(void)
{
Delay1us(10);
}
//初始化串口:串口工作方式1,允许接受REN=1,波特率=1200
void initialize_UART()
{
P1=0xFF;
TMOD=0x20;
//下面已修改为适合12MHz晶振,11.0592改成E8
TH1=0xe6;
TL1=0xe6;
SCON=0x50;
TR1=1;
}
//串口发,查询发送
void s_send(unsigned char ch)
{
SBUF=ch;
TI=0;
while(!TI);
TI=0;
}
//ds18b20复位,返回0,设备正常,返回1,没有设备或设备不正常
bit resetpulse(void)
{
unsigned char i;
bit RstFlag;
RstFlag=1;
DQ=0;
for(i=0;i<40;i++)//480us延时
{
Delay15us();
}
DQ=1;
for(i=0;i<4;i++)//15~60us延时
{
Delay15us();
}
for(i=0;i<16;i++)//60~240us延时
{
Delay15us();
if(DQ==0)
RstFlag=0;
}
for(i=0;i<16;i++)
{
Delay15us();
}
return(RstFlag);
}
/*--------------------------------------------------
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void writecommandtods18b20(unsigned char command)
{
unsigned char i;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay15us();
DQ=command&0x1;//低位在先
Delay15us();
Delay15us();
Delay15us();
DQ=1;
command=command>>1;
Delay1us(1);
}
}
//ds18b20读命令
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char temp;
temp=0;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay10us();
DQ=1;
Delay1us(2);
temp=temp>>1;
if(DQ==1)
{
temp=temp+0x80;//先读到最高位,再依次右移
}
Delay15us();
Delay15us();
Delay15us();
}
return(temp);
}
/*---------------------------------------------------------
无论是读还是写操作,开始前一定要复位一下ds18b20.
-----------------------------------------------------------*/
//跳过读序号列号的操作
void SkipRomCode(void)
{
resetpulse(); //复位
writecommandtods18b20(0xCC);// 跳过读序号列号的操作
}
//启动转换
void StartADC(void)
{
resetpulse(); //复位
writecommandtods18b20(0xCC);//广播
writecommandtods18b20(0x44);//启动温度转换,12位,需时700ms
}
//获得温度值
unsigned int GetTempValue(void)
{
unsigned i,j;
unsigned int T;
SkipRomCode();
writecommandtods18b20(0xBE);//读取温度值的命令
i=readdatafromds18b20(); //温度低八位
j=readdatafromds18b20(); //温度高八位
StartADC();
T=i+j*256;
if(T==0xFFFF) return 0xFFFF;
if(T>0x8000) //温度为负
{
T=~T+1;
return(0x8000+T*5/8);
}
else //温度位正
{
return(T*5/8);
}
}
//------------------------------------------------------------------------
// 函数名 : main()
// 功 能 :
//------------------------------------------------------------------------
void main(void)
{
unsigned int w;
initialize_UART();
SkipRomCode(); //主机发布跳过读序号列号的操作
writecommandtods18b20(0x44);//启动温度转换
while(1)
{
DelayNS(38); //延时700ms
w=GetTempValue();
s_send((w%1000)/100+48);// 十位
DelayNS(1);
s_send((w%100)/10+48);//个位
DelayNS(1);
s_send(46);//小数点
DelayNS(1);
s_send(w%10+48);//小数位
DelayNS(1);
s_send(10);//换行
}
}
//说明:读写18b20,并送串口终端显示!
------围观模式启动中... -------> 视觉系统开启...
-------> 搜寻网络...
-------> 正在加载1000Tb/s带宽...
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 1.24s)
状态:已连接上
速度:1000GMbps
-------> 正在加载原始萨钢护目镜
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 3.23s)
加载完毕...
-------> 正在加载加固版钛合金F5
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 6.52s)
加载完毕...
-------> 正在加载铬合金钻石轴承滚轮
(10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 4.69s)
加载完毕...
-------> 围观模式启动完毕,进入强势围观LZ状态
