DS18B20-51代码

声明 :仅供参考  

单片机 :89c52      pnp三极管驱动共阳数码管      

# include <reg52.h>
# include <intrins.h>
# define uint unsigned int 
# define uchar unsigned char
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x66,0x21,0x06,0x0e,0x0c,0x09,0x11};
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit ds=P2^6;
float ftemp;
uint temp,flag;
void delay15us(uint temp)	  //整个函数关键的部分就在这个延时函数  在ds18b20中 每一步的延时都要求比较精确  要严格依据时序来写
{
	for(temp;temp>0;temp--)
	{
		_nop_();
		_nop_();
		_nop_();
	}
	_nop_();
	_nop_();
}
void delay(uint k)	 //延时函数	   这个延时是为了数码管
{
	uint i,j;
	for(i=k;i>0;i--)
		for(j=113;j>0;j--) ;
}

bit RST()	   //复位函数
{
	bit ret=1;
 	ds=0;
	delay15us(39);
	ds=1;
	delay15us(4);
	ret=ds;  //检测是否变位成功  即ds是否为零 下面用一个led/测试一下
	//led=ds;
	delay15us(27);//这都是根据时序图上来写的
	ds=1;
    return ret ;//其实有点不明白  为什么加上这个返回值  有什么用吗
}
void writebit(bit dat_bit) //完全依据时序来写一位 的函数
{
	ds=0;
	delay15us(0);
	ds=dat_bit;
	delay15us(2);
	ds=1;	
}
void writebyte(uchar dat_byte)
{
	uint i;
	for(i=0;i<8;i++)
	{
		 writebit((dat_byte&0x01));
		 dat_byte>>=1;
	}
}
bit readbit()
{
	bit dat_bit;
	ds=0;
	_nop_();
	_nop_();
	_nop_();
	ds=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	dat_bit=ds;
	delay15us(3);
	ds=1;
	return dat_bit;
}
uchar readbyte()
{
	uchar dat_byte=0;
	uchar i,j;
	for(i=0;i<8;i++)
	{
		j= readbit();
		dat_byte=(j<<7)|(dat_byte>>1);
	}
	return dat_byte;
}
void sweap()	  //启动温度转换
{
	RST();
	_nop_();
	_nop_();
	writebyte(0xcc);
	writebyte(0x44);
}
uint get()
{
	uint a,b,t;
	RST();
	_nop_();
	_nop_();
	writebyte(0xcc);
	writebyte(0xbe);
	a=readbyte();
	b=readbyte();
	if(b&0xfc)
	{
		 temp=b;
		 temp= temp<<8;
		 temp|=a;
		 temp=((~temp)+1);
		 ftemp=temp*0.0625*100+0.5;
		 t=ftemp;
		 flag=1;
	}
	else
	{
	   	ftemp=((b*256)+a)*0.0625;
	    t=ftemp*100+0.5;
		flag=0;
	}

	return t;
}
void display(disnum)
{
	led0=0;
	P1=table1[disnum/1000];
	delay(3);
	P1=0xff;
	led0=1;	

	led1=0;
	P1=table2[disnum%1000/100];
	delay(3);
	P1=0xff;
	led1=1;

	led2=0;
	P1=table1[disnum%100/10];
	delay(3);
	P1=0xff;
	led2=1;

	led3=0;
	P1=table1[disnum%10];
	delay(3);
	P1=0xff;
	led3=1;

	led4=0;
	P1=0xc6;
	delay(1);
	led4=1;

}
void main()
{
	uint disnum;
	led5=0;
	while(1)
	{	
		sweap()	 ;
		disnum=get();
		display(disnum);
	}
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是DS18B20在C51单片机上的代码示例: ```c #include<reg51.h> #define DQ P3_4 typedef unsigned char uchar; typedef unsigned int uint; uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } uchar Ds18b20Init() { uchar dat; DQ = 1; delay(2); DQ = 0; delay(80); DQ = 1; delay(10); dat = DQ; delay(10); return dat; } void Ds18b20WriteByte(uchar dat) { uchar i; for(i=0;i<8;i++) { DQ = 0; _nop_(); DQ = dat&0x01; delay(5); DQ = 1; dat >>= 1; } } uchar Ds18b20ReadByte() { uchar i,dat = 0; for(i=0;i<8;i++) { dat >>= 1; DQ = 0; _nop_(); DQ = 1; delay(2); if(DQ) dat |= 0x80; delay(5); } return dat; } void Ds18b20ChangTemp() { Ds18b20Init(); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44); } void Ds18b20ReadTempCom() { Ds18b20Init(); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); } int Ds18b20ReadTemp() { uchar temp1,temp2; int temp; Ds18b20ChangTemp(); Ds18b20ReadTempCom(); temp1 = Ds18b20ReadByte(); temp2 = Ds18b20ReadByte(); temp = temp2<<8|temp1; return temp; } void main() { uchar i,TempH,TempL; int Temp; while(1) { Temp = Ds18b20ReadTemp(); TempH = Temp/16; TempL = Temp%16; P0 = 0x00; P2 = 0xfe; P0 = table[TempH]; delay(100); P0 = 0x00; P2 = 0xfd; P0 = table[TempL]; delay(100); } } ``` 上面的代码中,我们使用了P3.4引脚来连接DS18B20传感器的数据线。程序中的函数分别用于初始化DS18B20、写入一个字节、读取一个字节、转换温度、读取温度等操作。最后,在主函数中通过循环不断地读取温度值并显示在数码管上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值