如题,查看了DS18B20资料,仍不知道程序要干些什么。如果接3个DS18B20温度分别显示在1602上,怎么实现?
我想要个思路:
1、DS18B20本身要干些什么,是否只需硬件连好?所有数据线并一起连到 单片机端口就可以了?
2、用STC的52单片机,单片机要干些什么,要写些什么子程序?
3、DS18B20输出与单片机怎样对接上?DS18B20输出什么,单片机接收后
怎样处理,处理结果是什么形式,特别是怎样显示成有小数点?
另外,1602显示我知道,写指令和写数据,显示,我会弄,就是不知道怎样操作DS18B20,就算它有返回数据,我也不知道是什么数,还有看网上又怎么*10啦什么的,小数点在哪啊什么的,看不明白,希望大神帮助解答,资料可在论坛说,或发我邮箱:mdt150@163.com。谢谢啦!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
先说电路:
3---VCC
1---GND
2---数据线(要加上拉电阻)
再说程序
sbit DQ=P1^7; //单片机P1.7接数据口
unsigned char time; //设置全局变量,专门用于严格延时
//函数功能:将DS18B20传感器初始化
Init_DS18B20(void)
{
DQ = 1; //先将数据线拉高
delay_us(6); //略微延时约6微秒
DQ = 0; //再将数据线从高拉低,要求保持480~960us
delay_us(600); //略微延时约600微秒,以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
delay_us(30);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
delay_us(200);
}
//从DS18B20读取一个字节数据
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //储存读出的一个字节数据
for (i=0;i<8;i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_(); //等待一个机器周期
DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
delay_us(6); //延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80; //如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r
delay_us(3); //延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat); //返回读出的十进制数据
}
//向DS18B20写入一个字节数据
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
delay_us(30);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
delay_us(3);//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
delay_us(5); //稍作延时,给硬件一点反应时间
}
// 读温度
void ReadTemperature(unsigned char *p)
{
unsigned char tempL=0;
unsigned char tempH=0;
unsigned int sdate;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
bit fg=1; //温度正负标志
Init_DS18B20(); //将DS18B20初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_us(500); //温度转换需要一点时间
Init_DS18B20(); //将DS18B20初始化
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1;
fg=0; //读取温度为负时fg=0
}
sdate = tempL/16+tempH*16; //整数部分
xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
if(fg==0) *p=1;
else *p=0;
*(p+1) = sdate/10;
*(p+2) = sdate%10;
*(p+3) = xiaoshu1;
*(p+4) = xiaoshu2;
}
应用
unsigned char arTemperature[5];
void main(void)
{
......
ReadTemperature(arTemperature);
......
}
那么在数组arTemperature中就是温度。
第一个元素是 正负温度,00是零上,01 是零下
第二、三个元素是温度的整数部分2位 二是十位 三是个位
第四、五个元素是温度的小数部分2位
如: 00 02 06 08 03 就是零上 26.83度。
后期数据处理自己看着办就行了。
一周热门 更多>