一个ds18b20程序问题求教
时间:10-02
整理:3721RD
点击:
写完了一个ds18b20的程序,可以使数码管上一直显示的是 30 ,可是明明这里的温度才20多点度··· 我又下了例程进去 果然是24度···可是我看了好久自己的程序 也不知道哪里出了问题 也对照了一些网上的程序看 也没有找出原因 程序主要是看天狼星教学视频学着写的 大神们帮忙看看吧 叩谢! (数码管显示是没有问题的 主要问题应该在ds18b20里) 程序见下:
main.c 如下:
#include<reg52.h>
#include"fz.h"
uchar num=0;
void smg_scan(void);
int main(void)
{
while(1)
{
num=read_temp();
smg_scan();
}
}
void smg_scan(void) //数码管显示 数码管程序被封装好了
{
smg_dis(1,disp_tab[num%10]);
smg_dis(2,disp_tab[num%100/10]);
smg_dis(3,disp_tab[num%1000/100]);
smg_dis(4,disp_tab[num/1000]);
}
fz.h 如下:
#ifndef __FZ_H
#define __FZ_H
#include"delay.h"
//#include"lcd1602.h"
#include"iic.h"
#include"adda.h"
#include"smg.h"
//#include"ds1302.h"
#include"ds18b20.h"
#endif
ds18b20.c 如下 :
#include<reg52.h>
#include"delay.h"
#include"ds18b20.h"
sbit DQ=P3^7;
void delayds18b20(uchar t) //延时us
{
while(t--);
}
void ds18b20_init(void) //ds18b20初始化
{
uchar n;
DQ=1;
delayds18b20(8);
DQ=0;
delayds18b20(80);
DQ=1;
delayds18b20(8);
n=DQ; //这里可以换成标志位,并且可以在延时完之后把传输线拉高诶
delayds18b20(4);
}
void ds18b20wr_byte(uchar a) //ds18b20写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=a&0x01;
delayds18b20(4);
DQ=1;
a>>=1;
}
delayds18b20(4);
}
uchar ds18b20re_byte(void) //ds18b29读一个字节
{
uchar i,r=0;
for(i=0;i<8;i++)
{
DQ=0;
r>>=1;
DQ=1;
if(DQ)
r|=0x80;
delayds18b20(4);
}
return r;
}
uchar read_temp(void) //ds18b20配置 并读出温度值
{
uchar a=0,b=0;
ds18b20_init();
ds18b20wr_byte(0xcc);
ds18b20wr_byte(0x44);
delayds18b20(300);
ds18b20_init();
ds18b20wr_byte(0xcc);
ds18b20wr_byte(0xbe);
a=ds18b20re_byte();
b=ds18b20re_byte();
b<<=4;
b=b+(a&0xf0)>>4; //屏蔽掉小数点。暂时不考虑小数点 因为连连没有小数点的都读温度都不对
return b;
}
ds18b20.h 如下:
#ifndef __DS18B20_H
#define __DS18B20_H
#include"delay.h"
extern void delayds18b20(uchar t);
extern void ds18b20_init(void);
extern void ds18b20wr_byte(uchar a);
extern uchar ds18b20re_byte(void);
extern uchar read_temp(void);
#endif
smg.c 如下:
#include<reg52.h>
#include"delay.h"
#include"smg.h"
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned char code disp_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //阴极数码管
void smg_dis(uchar i,uchar a)
{
P0=0;
switch(i)
{
case 1:LS138C=1;LS138B=1;LS138A=1;break;
case 2:LS138C=1;LS138B=1;LS138A=0;break;
case 3:LS138C=1;LS138B=0;LS138A=1;break;
case 4:LS138C=1;LS138B=0;LS138A=0;break;
case 5:LS138C=0;LS138B=1;LS138A=1;break;
case 6:LS138C=0;LS138B=1;LS138A=0;break;
case 7:LS138C=0;LS138B=0;LS138A=1;break;
case 8:LS138C=0;LS138B=0;LS138A=0;break;
}
P0=a;
delay_ms(1);
}
smg.h 如下:
#ifndef __SMG_H
#define __SMG_H
#include"delay.h"
extern unsigned char code disp_tab[];
extern void smg_dis(uchar i,uchar a);
#endif
main.c 如下:
#include<reg52.h>
#include"fz.h"
uchar num=0;
void smg_scan(void);
int main(void)
{
while(1)
{
num=read_temp();
smg_scan();
}
}
void smg_scan(void) //数码管显示 数码管程序被封装好了
{
smg_dis(1,disp_tab[num%10]);
smg_dis(2,disp_tab[num%100/10]);
smg_dis(3,disp_tab[num%1000/100]);
smg_dis(4,disp_tab[num/1000]);
}
fz.h 如下:
#ifndef __FZ_H
#define __FZ_H
#include"delay.h"
//#include"lcd1602.h"
#include"iic.h"
#include"adda.h"
#include"smg.h"
//#include"ds1302.h"
#include"ds18b20.h"
#endif
ds18b20.c 如下 :
#include<reg52.h>
#include"delay.h"
#include"ds18b20.h"
sbit DQ=P3^7;
void delayds18b20(uchar t) //延时us
{
while(t--);
}
void ds18b20_init(void) //ds18b20初始化
{
uchar n;
DQ=1;
delayds18b20(8);
DQ=0;
delayds18b20(80);
DQ=1;
delayds18b20(8);
n=DQ; //这里可以换成标志位,并且可以在延时完之后把传输线拉高诶
delayds18b20(4);
}
void ds18b20wr_byte(uchar a) //ds18b20写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=a&0x01;
delayds18b20(4);
DQ=1;
a>>=1;
}
delayds18b20(4);
}
uchar ds18b20re_byte(void) //ds18b29读一个字节
{
uchar i,r=0;
for(i=0;i<8;i++)
{
DQ=0;
r>>=1;
DQ=1;
if(DQ)
r|=0x80;
delayds18b20(4);
}
return r;
}
uchar read_temp(void) //ds18b20配置 并读出温度值
{
uchar a=0,b=0;
ds18b20_init();
ds18b20wr_byte(0xcc);
ds18b20wr_byte(0x44);
delayds18b20(300);
ds18b20_init();
ds18b20wr_byte(0xcc);
ds18b20wr_byte(0xbe);
a=ds18b20re_byte();
b=ds18b20re_byte();
b<<=4;
b=b+(a&0xf0)>>4; //屏蔽掉小数点。暂时不考虑小数点 因为连连没有小数点的都读温度都不对
return b;
}
ds18b20.h 如下:
#ifndef __DS18B20_H
#define __DS18B20_H
#include"delay.h"
extern void delayds18b20(uchar t);
extern void ds18b20_init(void);
extern void ds18b20wr_byte(uchar a);
extern uchar ds18b20re_byte(void);
extern uchar read_temp(void);
#endif
smg.c 如下:
#include<reg52.h>
#include"delay.h"
#include"smg.h"
sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned char code disp_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //阴极数码管
void smg_dis(uchar i,uchar a)
{
P0=0;
switch(i)
{
case 1:LS138C=1;LS138B=1;LS138A=1;break;
case 2:LS138C=1;LS138B=1;LS138A=0;break;
case 3:LS138C=1;LS138B=0;LS138A=1;break;
case 4:LS138C=1;LS138B=0;LS138A=0;break;
case 5:LS138C=0;LS138B=1;LS138A=1;break;
case 6:LS138C=0;LS138B=1;LS138A=0;break;
case 7:LS138C=0;LS138B=0;LS138A=1;break;
case 8:LS138C=0;LS138B=0;LS138A=0;break;
}
P0=a;
delay_ms(1);
}
smg.h 如下:
#ifndef __SMG_H
#define __SMG_H
#include"delay.h"
extern unsigned char code disp_tab[];
extern void smg_dis(uchar i,uchar a);
#endif
又是一个被DS18B20困扰的人。可惜我的帖子沉下去了,关于DS18B20的一点建议~
恩恩 看到你的帖子了··
有兴趣加QQ 306 226 714
"b=b+(a&0xf0)>>4; //屏蔽掉小数点。暂时不考虑小数点 因为连连没有小数点的都读温度都不对"
貌似你在读出温度值的时候有问题,这里的a应该是低八位,b是高八位,此时进行运算的思路应该是去掉高八位的四个“S”正负标志位,然后去掉低八位中表示小数点的四位,剩下的并成一个字节做温度运算,按照这个思路回去检查检查……
对头 确实是这里有问题 谢谢··
嗯嗯 加了哈· 可以多交流。最近红外遥控也没调出来
