打印

求助,18b20程序调试不成功

[复制链接]
2078|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无敌小Q|  楼主 | 2011-7-20 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我最近在研究1--wire总线,然后通过单片机控制18b20测温,并把温度显示在4个数码管上,但是调了半天程序,显示一直都是0000,哪位大侠帮我看下我的程序错在哪?谢谢~~

      #include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x00,0x04,0x08,0x0c};
uchar code table2[]={0xfc,0x60,0xda,0xf2,
                    0x66,0xb6,0xbe,
     0xe0,0xfe,0xf6};
sbit DQ=P3^7;
uint temp,num=0;
void delay(uint z)
{
while(z--)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
}
void init_t0( )
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
void init18b20( ) //初始化总线
{
DQ=1;
_nop_();
DQ=0;
delay(48);//延迟至少480微秒
DQ=1;//释放总线
delay(10);
}
void write_bit(bit abit)  //写入一个字位
{
DQ=1;
_nop_();//保证每次写之间有至少1微秒的间隔
DQ=0;
_nop_();
if(abit)      //写1时间间隙
  {
    DQ=1;
   delay(6);
  }
else     //写0时间间隙
  {
   delay(6);
   DQ=1;
  }
}
void write_byte(uchar dat) //写入一个字节
{
uint i=0;
bit test;
_nop_();
for(i=0;i<8;i++)
{
  test=dat&0x01;
  write_bit(test);
  dat=dat>>1;
  _nop_();
}
}
bit read_bit(void)  //读出一个字位
{
   
bit abit;
_nop_();
DQ=1;
_nop_( );
DQ=0;               //准备好读
_nop_();
_nop_();
abit=DQ;     //主机采样
return(abit);
}
uchar read_byte(void)  //读出一个字节
{

uint i=0;
uchar dat,j;
for(i=0;i<8;i++)
{ _nop_();
  j=read_bit();
  dat=(j<<7)|(dat>>1);//由于传输多是从最低有效位开始的,故先把最低位移至高位,再慢慢往低位移动  

}
return(dat);
}
void get_tem(void)
{

init18b20();
write_byte(0xcc);  //忽略读ROM
write_byte(0x44);  //温度转化

}
uint read_tem( )
{
    uint i;
    uchar a,b;
    init18b20();
write_byte(0xcc);
write_byte(0xbe);  //读暂存器
a=read_byte( );
b=read_byte( );
    i=b;
i=i<<8;
i=i|a;
temp=i;
//if(temp>6348)                        // 温度值正负判断
     //{temp=65536-temp;}
  //temp=temp*0.625;
return(temp);
}
void display( )
{
        P2=table1[0];
  P0=table2[temp%10];
  delay(200);
  P2=table1[1];
  P0=table2[(temp%100)/10];
  delay(200);
  P2=table1[2];
  P0=table2[(temp%1000)/100];
  delay(200);
  P2=table1[3];
  P0=table2[temp/1000];
  delay(200);
}
void main( )
{
    init_t0( );
while(1)
{
       get_tem( );
    delay(100);
  if(num==10)
  {
    TR0=0;
    num=0;
   
    read_tem( );
    }
    display( );
  TR0=1;
  
}
}
void ext_t0( ) interrupt 1
{
   
    TMOD=0x01;
    TH0=0x3c;
    num++;
}

相关帖子

沙发
icecut| | 2011-7-21 09:15 | 只看该作者
找不到while(--i)
lz太新手

使用特权

评论回复
板凳
无敌小Q|  楼主 | 2011-7-21 15:19 | 只看该作者
while(--i)是用来延迟的?我是刚开始学这个,求大侠指教

使用特权

评论回复
地板
icecut| | 2011-7-21 16:53 | 只看该作者
3# 无敌小Q 代替你的nop...

你网上找代码,有直接能用的.注意软件算时间.keil专门有一个指令周期计数器

使用特权

评论回复
5
无敌小Q|  楼主 | 2011-7-21 22:41 | 只看该作者
好的,谢谢大侠指点

使用特权

评论回复
6
waerpcj| | 2011-7-25 16:10 | 只看该作者
这个注意一下 18B20的读写时序,另外注意一下每次操作的延时,一般问题不大的!

使用特权

评论回复
7
afei9527| | 2011-7-25 19:40 | 只看该作者
时序要求严格

使用特权

评论回复
8
xoyo| | 2011-7-29 14:14 | 只看该作者
用汇编写吧,时序要求严格

使用特权

评论回复
9
heenson| | 2011-9-7 22:38 | 只看该作者
有发帖的时间足够你理顺下时序了,时序对了就没问题

使用特权

评论回复
10
tianqinian0605| | 2011-10-29 15:15 | 只看该作者
刚刚开始自学,有点看不懂。。。

使用特权

评论回复
11
电击小子| | 2011-10-29 16:11 | 只看该作者
我现在也在自学单片机,A/D转换硬是看不懂,咋办?????

使用特权

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

本版积分规则

0

主题

3

帖子

1

粉丝