DS18B20读写程序(基于STC单片机。
源代码在线查看: 基于stc单片机的zlg7290读写程序(改自周立功软件包).txt
DS18B20读写程序(基于STC单片机)
2007-08-13 23:24
#include
#include
sbit DQ=P3^2;//定义单片机接ds18b20的数据端
void DelayNS(unsigned int dly)
{ unsigned int i;
for(; dly>0; dly--)
for(i=0; 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 {
Delay15us();
}
DQ=1;
for(i=0;i {
Delay15us();
}
for(i=0;i {
Delay15us();
if(DQ==0)
RstFlag=0;
}
for(i=0;i {
Delay15us();
}
return(RstFlag);
}
/*--------------------------------------------------
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void writecommandtods18b20(unsigned char command)
{
unsigned char i;
DQ=1;
Delay1us(1);
for(i=0;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 {
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,并送串口终端显示!