打印

数字温度传感DS18B20不知道哪里出错了,求救!!!

[复制链接]
1592|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张永标张标|  楼主 | 2012-10-5 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3;
sbit P20=P2^0;//段选
sbit P21=P2^1;//位选
sbit P35=P3^5;
uint temp;
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code wei[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};   
uchar tmep[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
void init_ds18b20(void);
void delay(uint t);
void write_byte_18(uchar dat);
uchar read_byte_18(void);
uint readtemperature(void);
void display(uchar a,uchar b);
void delay1(uint z)//延时
{
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void delay_50us(uint t)//延时
{
uchar j;
for(;t>0;t--)
        for(j=19;j>0;j--);
}

void main(void)
{
P35=0;            
while(1)
{
temp=readtemperature();
tmep[0]=duan[temp/1000];
tmep[1]=duan[(temp/100)%10];
tmep[2]=duan[(temp/10)%10];
tmep[3]=duan[temp%10];   
  display(0,8);
}
}


void delay(uint t)
{
while(t--);
}

void init_ds18b20(void)//初始化
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);

}

void write_byte_18(uchar dat)//写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
  DQ=0;
  DQ=dat&0x01;
  delay(4);
  DQ=1;
  dat>>=1;
}
delay(4);
}

uchar read_byte_18(void)//读一个字节
{
uchar i,value;
for(i=0;i<8;i++)
{
  DQ=0;
  value>>=1;
  DQ=1;
  if(DQ)
  value|=0x80;
  delay(4);

}
return value;
}

uint readtemperature(void)
{
uchar a,b;
uint c;
init_ds18b20();
write_byte_18(0xcc); //跳过ROM
write_byte_18(0x44); //启动温度测量
delay(300);

init_ds18b20();
write_byte_18(0xcc);
write_byte_18(0xbe);
a=read_byte_18();
b=read_byte_18();
c=((b*256)+a)*6.25;
return c;
}


void display(uchar a,uchar b)//显示
{
   uchar i;
   for(i=0;i<b;i++)
   {
     P1=0xff;
     P20=1;
     P20=0;
      
     P1=wei[i+a];
     P21=1;
     P21=0;

     P1=tmep[i];
     P20=1;
     P20=0;   
     delay1(4);
   }
}

相关帖子

沙发
NE5532| | 2012-10-5 21:37 | 只看该作者
贴代码对解决你的问题没有什么帮助,你器件复位应答调通了没?

使用特权

评论回复
板凳
张永标张标|  楼主 | 2012-10-5 22:00 | 只看该作者
不知道啊!!!!!!!!!!!!!!

使用特权

评论回复
地板
NE5532| | 2012-10-5 22:11 | 只看该作者
楼主代码不是自己写的??那就只有静下心来看书咯。

使用特权

评论回复
5
张永标张标|  楼主 | 2012-10-5 22:16 | 只看该作者
我自已写的!!

使用特权

评论回复
6
NE5532| | 2012-10-5 22:36 | 只看该作者
写程序要一步一步来,学会目标分解,不要写完了来看对不对,先看一下协议,器件复位应答是什么,先把这个动作调通。

使用特权

评论回复
7
andy2003hu| | 2012-10-5 22:44 | 只看该作者
写程序要一步一步来,学会目标分解,不要写完了来看对不对,先看一下协议,器件复位应答是什么,先把这个动作调通。
NE5532 发表于 2012-10-5 22:36
是啊,不然程序调试的时间比写程序花得还长。

使用特权

评论回复
8
sedatefire| | 2012-10-5 22:52 | 只看该作者
抓波见证一切,波形符合datasheet规范的,一般都不会有错。

使用特权

评论回复
9
hjs1618| | 2012-10-6 17:32 | 只看该作者
一点点的调,一个模块一个模块的调,直到最后就OK,别愣着写完再调,那工作量更大

使用特权

评论回复
10
stycx| | 2012-10-6 22:38 | 只看该作者
我自已写的!!
张永标张标 发表于 2012-10-5 22:16

这么老的器件就不要自己写代码了,用别人调试好的代码做修改就好了。啥都自己写会找不着北的,吃力不讨好:)

使用特权

评论回复
11
NE5532| | 2012-10-7 11:57 | 只看该作者
这么老的器件就不要自己写代码了,用别人调试好的代码做修改就好了。啥都自己写会找不着北的,吃力不讨好:)
stycx 发表于 2012-10-6 22:38


别人代码有漏洞,老板提着菜刀追你的时候,你就会改口的。

使用特权

评论回复
12
chenbb8| | 2012-10-8 18:00 | 只看该作者
网上代码很多,实现的方法千奇百怪,参考别人的代码还是可以的,又不是照抄。

使用特权

评论回复
13
stycx| | 2012-10-8 20:24 | 只看该作者
11# NE5532
我知道我错了:P,楼主就是用别人的代码找不着北的。

http://www.tlxmcu.com/loadSingleNewsAction.action?id=35

51单片机第二十四课 数字温度传感器DS18B20测温
所属类别: 课程代码 发布日期: 2011-03-05 点击量: 1474
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2;
sbit smg1=P2^4;
sbit smg2=P2^5;
sbit smg3=P2^6;
uchar temp;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
void init_ds18b20(void);
void delay(uint t);
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature(void);
void display(void);
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
        for(j=19;j>0;j--);
}
void main(void)
{
while(1)
{
  temp=readtemperature();
  display();
  
}


  
}

void delay(uint t)
{
while(t--);
}
void init_ds18b20(void)
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  DQ=0;
  DQ=dat&0x01;
  delay(4);
  DQ=1;
  dat>>=1;
}
delay(4);
}
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
  DQ=0;
  value>>=1;
  DQ=1;
  if(DQ)
  value|=0x80;
  delay(4);
}
return value;
}
uchar readtemperature(void)
{
uchar a,b;
init_ds18b20();
write_byte(0xcc); //跳过ROM
write_byte(0x44); //启动温度测量
delay(300);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}

void display(void)
{
smg3=0;
smg2=0;
smg1=0;
P1=smg_du[temp%10];
delay_50us(20);
smg2=0;
smg1=1;
P1=smg_du[temp/10];
delay_50us(20);
   
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

88

帖子

0

粉丝