[求助] DS18B20采集温度

daisy0038   2012-3-28 13:53 楼主

 

请大侠门看看,写得不好,只显示已个数字,这个是我试验的程序,就是调试不出来,那些地方错误请大侠门指出来,我学习学习,刚学单片机,希望得到大侠门的帮助

问题:只显示一个数字,图片在后面,请大侠门分析分析

 

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;
uchar code table[]={"0123456789"};
uchar rom[4][8]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e,
     0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9,
     0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0,
     0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7,};
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
uchar c;
void delay1602(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

void write_com(uchar com)//写命令
{
 rs=0;
 lcden=0;
 P0=com;
 delay1602(5);
 lcden=1;
 delay1602(5);
 lcden=0;
}

void write_date(uchar date)
{
 rs=1;
 lcden=0;
 P0=date;
 delay1602(5);
 lcden=1;
 delay1602(5);
 lcden=0;
}

void init_lcd()
{
 lcden=0;
 rw=0;
 write_com(0x38);
 write_com(0x0c);
 write_com(0x06);
 write_com(0x01);
 write_com(0x80);
}
void delay_18b20(uchar count)
{
 while(count--);
}
void init_18b20()
{
 uchar x=0;
 DQ=1;
 delay_18b20(8);
 DQ=0;
 delay_18b20(80);
 DQ=1;
 delay_18b20(14);
 x=DQ;
 delay_18b20(20);
}
uchar read_18b20()
{
 uchar i=0;
 uchar date=0;
 for (i=8;i>0;i--)
  {
    DQ=0;
    date>>=1;
    DQ=1;
    if(DQ)
    date=date|0x80;
    delay_18b20(4);
  }
  return(date);
}
void write_18b20(uchar date)
{
 uchar i;
 for(i=8;i>0;i--)
 {
  DQ=0;
  date=date&0x01;
  delay_18b20(5);
  DQ=1;
  date>>=1;
 }
}
void read_temp()
{
 uchar temp,num,a,b,temp_value,shi,ge,xiaoshu;
 uint value;
 init_18b20();
 delay1602(5);
 write_18b20(0xcc);
 write_18b20(0x44);
 delay1602(5);
 for(temp=4;temp>0;temp--)
 {
  init_18b20();
  delay1602(5);
  write_18b20(0x55); 
  for(num=8;num>0;num--)
   write_18b20(rom[1][num]);
 write_18b20(0xbe);  
 a=read_18b20();
 b=read_18b20();
 value=b;
 value<<=8;
 value=value|a;
 temp_value=value*0.0625;
 value=temp_value*10+0.5;
 shi=value/100;
 ge=value/10%10;
 xiaoshu=value%10;
 write_com(0x80);
 write_date(table[shi]);
 write_com(0x80+1+c);
 write_date(table[ge]);
 write_com(0x80+2+c);
 write_date(table[xiaoshu]);
 c=c+3;
 delay1602(10);
 }
 c=0;
}
void main()
{
 init_lcd();
 while(1)
 {
  read_temp();
  delay1602(10);      
 }
}

  • 未命名.jpg

回复评论 (1)

write_18b20(rom[1][num]);
原来应该是:write_18b20(rom[temp][num]);
是我调试修改过
点赞  2012-3-28 14:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复