基于proteus仿真实现的DS18B20温度传感器读取温度+lcd1602显示,附代码+仿真图


#include "reg51.h"
#include "absacc.h"
#include "string.h"
#define uchar unsigned char 
#define uint unsigned int 


uint  tem=0;

sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit DQ=P1^0;

uchar str0[]={"not,"};
uchar str1[]={" brother"};
uchar str[]={"0123456789"};

void delay(unsigned int t){
	unsigned char i;
	for(;t>0;t--){
	}
}


// 操作ds18b20

// (1)初始化:先拉高dq 480-960微秒,然后拉低,等待15-60,读取dq,如果为1就失败,为0就成功

void initDs(void) {
uchar x=0;
DQ=1;
delay(8);
DQ=0;
delay(71);
DQ=1;
delay(14);
x=DQ;
delay(20);
}

// (2)读操作, 需要读八位,首先把数据右移一位,把每次读出的数据放到第一位,然后为1就把第一位置为1,为0就不用操作
uchar readDs(void) {

uchar i=0;
uchar d=0;

for(i=8;i>0;i--){
DQ=0;
d>>=1;
DQ=1;
if(DQ)
{
d|=0x80;}
delay(4);
}
return d;

}

// (3)写操作,还是先拉低dq,写值到dq中,但是写0和写1需要延时不同,进而需要判断,如果写0,延时60以上,写1,15us以内,延时后再把dq拉高
//				每次需要先把最低为写入,然后写出

void writeDs(uchar d){
uchar i=0;
for(i=8;i>0;i--){
DQ=0;
DQ=d & 0x01; // 获取最低位
if(DQ){
// 写1
delay(2);
DQ=1;
}else {
// 写0
 delay(5);
DQ=1;
}
d>>=1;
}

}

// 读取温度

// 总的来说分为三步骤:
// 1.启动温度转换
// 2.开始读取数据
// 3.转换数据并返回

uint getT(void){
uchar a=0,b=0;
uint t=0;
// 启动温度转换
initDs();
writeDs(0xCC); // 跳过读取序号
writeDs(0x44); // 启动温度转换
delay(100);

// 准备读取温度
initDs();
writeDs(0xCC);
writeDs(0xBE); // 开始读取温度寄存器
delay(100);

// 转换温度
a=readDs(); // 低位
b=readDs();	// 高位
t=((b*256+a))>>4;

return t;
}







// 判断忙函数
void fBusy(){
  	P3=0XFF;
	RS=0;
	RW=1;
	E=0;
	E=1;
	while(P3&0X80){
		E=0;
		E=1;
	}
}

// 写命令函数
void writeCMD(uchar cmd){
	fBusy();
	E=0;
	RS=0;
	RW=0;
	E=1;
	P3=cmd;
	E=0;	
}
// 写数据函数
void  writeData(uchar cmd){
		fBusy();
	E=0;
	RS=1;
	RW=0;
	E=1;
	P3=cmd;
	E=0;
}

// 初始化函数
void initLED(){
 writeCMD(0X38);
 writeCMD(0X0C);
 writeCMD(0X06);
 writeCMD(0X01);
}


// 显示温度
void displayStr(uchar i ){
 uchar a=0,b=0,c=0;
 delay(100);
 writeCMD(0x80+0x40);
			 delay(4);
c=tem%10;
b=(tem/10)%10;
a=(tem/100)%10;


 delay(4);

writeData(str[a]);
delay(4);
writeData(str[b]);
delay(4);
writeData(str[c]);
 delay(4);
 }

void main(void) {
		uint i=0;
	   SP=0X50;
	   initLED();

	while(1){
	delay(30);
	   	tem=getT();
		delay(20);
		displayStr();
	}

}

仿真图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值