新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机-温度传感器DS18B20

51单片机-温度传感器DS18B20

作者: 时间:2016-12-02 来源:网络 收藏
DS18B20的写0和写1时序:
DS18B20的读数据时序:
读出光刻ROM中的ID号,在LCD上显示:
#include <reg52.h>
#include<intrins.h>
sbit DQ = P3^3;
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
sbit bell = P3^4;
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
uint i;
uchar value;
uchar DS[8];
uchar Time_Data[]={0,1,2,3,4,5,6,7,
8,9,A,B,C,D,E,F};
void delay(uchar t){
while(--t);
}
void lcd_com(uchar s){
RS = 0; //低电平,写指令
P2 = s; //传数据
delay(14); //看时序图,数据需要稳定一段时间
E = 1; //给一个高脉冲,发送命令
delay(14); //如图,高脉冲延时一段时间,确保命令发送
E = 0; //发送结束E置为低电平
}
void lcd_data(uchar s){
RS = 1;
P2 = s;
delay(14);
E = 1;
delay(14);
E = 0;
}
void init_lcd(){
RS = 1; //先发指令,在初始时刻RS是高,E和RW是低
E = 0;
RW = 0;
lcd_com(0x38); //设置为16*2显示,5*7点阵,8位数据接口
lcd_com(0x0f); //开显示,显示光标,光标闪烁
lcd_com(0x06); //读写一个字符后地址指针加一
lcd_com(0x01);
}
void Display_lcd(uchar y, uchar x, uchar value){
if(y)
lcd_com(0x80+0x40+x); //如果y为1,写在第二行
else
lcd_com(0x80+x);
lcd_data(value); //写到LCD602上
}
void DS18B20_reset(){
DQ = 1; //开始的时候是高脉冲
DQ=0; //然后是低脉冲
i=103;
while(i>0)i--; //低脉冲需要延迟一会儿
DQ=1; //数据线拉高
i=4;
while(i>0)i--; //延时等待,若初始化成功则在15"60ms内产生一个由
if(DQ == 0){ //DS18B20返回的低电平
while(DQ == 0);
// bell = 0;
}
else
bell = 1;
}
uchar DS18B20_read(void)
{
uchar i = 0;
uchar Value = 0;
for(i = 0; i < 8; i ++)
{
DQ = 1;
DQ = 0;
delay(1);
DQ = 1; //在T1时刻将总线拉高,产生读时间隙
delay(1); //读时隙在T1和T2之间有效
if(DQ)
{
Value |= 0x01 << i;
}
delay(17); //必须在T3时刻之间主机完成读操作
DQ = 1;
nop();
}
return Value;
}
void DS18B20_write(uchar Value){
for(i = 0; i < 8; i++){
DQ = 1;
DQ = 0; //当t0从高拉低产生写时隙,
delay(5);
DQ = Value & 0x01; //必须在t0开始的15us内将数据送到总线上
delay(20); //DS18B20在t0后的15us"60us内对总线采样
DQ = 1; //如果采到低电平则写入0,高电平写入1
Value >>= 1;
delay(2);
}
}

评论


技术专区