📄 18b20.c
字号:
/********************************************/
#include"reg51.h"
#include "intrins.h"//预处理命令
#define uchar unsigned char //
#define uint unsigned int
#define DATA_OUT P0 //定义段码数据输出口
#define BIT P2 //定义位位码数据输出口
sbit DQ=P1^7; //定义DS18B20温度传感器的数据通信端口
unsigned char code seg[]={0xc0,0xf9,0xA4,0xB0,0x99,
0x92,0x82,0x0F8,0x80,0x90,0xFF};//定义数码管段码值(共阳)
unsigned char code bit_data[]={0X00,0X80,0X40,0XC0,
0X20,0XA0,0X60,0XE0};//定义数码管位码数据(经3-8译码器译码产生位码)
unsigned char data_seg[8]; //显示缓存
/*
void delay2(void)//延时程序
{
unsigned char k,i;
for(i=0;i<5;i++)
for(k=0;k<50;k++);
}
*/
/***********18b20程序**************/
//11us延时函数//
void delay(uint t)
{for(;t>0;t--);}
//**********DS18B20复位函数************//
void ow_reset(void)
{char presence=1;
while(presence)
{
while(presence)
{ DQ=1;_nop_();_nop_();
DQ=0;//产生低电平的复位脉冲
delay(50);//延时550us
DQ=1; //经过延时后,将数据线拉至高电平,等待66us
delay(10);//延时等待66us后发出存在脉冲
presence=DQ;
// delay(3);
}
delay(50);
presence=~DQ;//发出存在脉冲,是低电平,单片机检测到低电平说明复位成功
}
// delay(20); //低电平持续220us
DQ=1;
}
//********DS18B20写命令函数**********//
//向1-Write 总线上写一个字节//
void write_byte(uchar val)
{ uchar i;
for (i=8;i>0;i--)//一个字节8位
{ DQ=1;_nop_();_nop_();//
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//将数据线从高电平拉至低电平,产生写时序,延时5us,
DQ=val&0x01; //就是对数据线进行采样,如果相与后为0,DQ就为0,否则就为1
delay(6);//延时66us
val=val>>1; //右移一位
}
DQ=1;
delay(1);
}
//********DS18B20读1字节函数**********//
uchar read_byte(void)
{ uchar i;
uchar value=0;
for(i=8;i>0;i--)
{ DQ=1;_nop_();_nop_();
value>>=1; //将读取的温度值移位
DQ=0; //高电平拉到低电平后至少维持1us
_nop_();_nop_();_nop_();_nop_();//至少维持1us
DQ=1;_nop_();_nop_();_nop_();_nop_();//拉到高电平产生读时序,读时序产生后DS18B20马上就输出温度数据
if (DQ)value|=0x80;//这时DS18B20输出数据,如果输出数据线DQ为1就发送1,为0就发送0
delay(6);//读一位的时序至少维持60us以上然后再释放总线拉到高电平
}
DQ=1;//读完一个字节后就将数据线拉到高电平
return(value);//返回读取的温度数据
}
//*********读出温度函数*********//
void read_temp(void)
{ uchar j;
uint low,high,tempdata;
for(j=1;j<4;j++)
{ ow_reset();//总线复位
//Matching_ROM(j); //调用匹配函数
write_byte(0xcc);//跳过ROM
write_byte(0x44);//发转换命令
delay(1);
ow_reset();
//Matching_ROM(j); //调用匹配函数
write_byte(0xcc);//跳过ROM
write_byte(0xbe); //发读命令,就是从暂存器里把温度数据读出来的命令
low=read_byte();//温度低8位
high=read_byte();//温度高8位
high=high<<8;
tempdata=low+high;
tempdata=tempdata>>4;
data_seg[0]=tempdata/100;
data_seg[1]=tempdata%100/10;
data_seg[2]=tempdata%100%10;
/* temp_display[0]=1;
temp_display[2]=2;
temp_display[1]=2;
temp_display[2]=3;
*/
}
}
/**************DS18B20ROM匹配函数*****************/
/*
void Matching_ROM(unsigned char mux)
{
unsigned char i,*P;
if(mux==1) P=ROM1;
if(mux==2) P=ROM2;
if(mux==3) P=ROM3;
write_byte(0x55);
for(i=0;i<8;i++)
{write_byte(*(P+i));}
}*/
void main(void)
{
unsigned char m;
while(1)
{
for(m=0;m<3;m++) //
{
DATA_OUT=seg[data_seg[m]]; //将显示缓存数据转换成数码管段码数据输出
BIT =bit_data[m]; //位码输出
read_temp();
DATA_OUT=0XFF; //去消隐
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -