打印

求助ds18b20程序问题

[复制链接]
2961|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zydlyq|  楼主 | 2009-11-4 23:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟编了一个单个18b20的程序,但是显示不出来,求助!!!谢谢
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 };
//uchar code temp1[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
sbit D1=P1^7;
void delay(uint x)//延时
{
while(x) x--;
}
void init()//初始化18b20
{
uchar ready=0;
D1=1;
delay(100);
D1=0;//拉低总线
delay(80);//延时805um
D1=1;//释放总线
delay(25);//等待210um
ready=D1;
}
uchar readbit()//读一个字节
{
uchar i=0,temp=0;
D1=1;
for(i=0;i<8;i++)//循环8次
{
  D1=0;  //拉低电平准备产生读时序
  temp=temp>>1; //先移位,方便i=7时接到最后移位
  D1=1;  //拉高电平进入读时序   
  if(D1)  //取18b20传送的数据(先送低位)
  {
   temp=temp|0x80;
  }
  D1=1;//拉高电平完成读时序
  delay(10);   
}
return(temp);
}
void writebit(uchar date)//写一个字节
{
uchar i=0;
D1=1;
for(i=0;i<8;i++)
{
  D1=0;//产生下降沿,进入写时序(15us内送上数据)
  D1=date&0x01; //从低位开始送数
  delay(5); //延时50um保证18b20采样到数据
  D1=1;
  delay(5);  //拉高电平完成送数
  date=date>>1;  //移位
}
}
uchar readtemp()
{
uchar datal=0,datah=0,dataall=0;
init(); //    初始化
writebit(0xCC);  //跳过检测rom(总线上有多个18b20时才检测序列号)
writebit(0x44);  //写入温度转换指令
delay(100);
init(); //    重新初始化
writebit(0xCC);  //跳过检测rom(总线上有多个18b20时才检测序列号)
writebit(0xBE); //写入读取温度值指令(之后18b20发送两个字节,温度值的低位和高位)
datal=readbit(); //接收温度低位值
datah=readbit();//接受温度高位值(高5位为符号位)
datah=datah<<8;
dataall=datal|datah;
return(dataall);;
}
void play(uchar a)
{
uchar count=0;
P2=0x00;
if(count==0)
{
  P2=0xff;
  P0=0x39;
}
   if(count==1)
{
  P2=0xfe;
  P0=tab[a];
}
  if(count==2)
{
  P2=0xfd;
  P0=tab[a];
}
    if(count==3)
{
  P2=0xfc;
  P0=tab[a];
}
   if(count==4)
{
  P2=0xfb;
  P0=tab[a];
}
count++;
if(count==5)
{
  count=0;
}
}
void main()
{
uint data1=0,data2=0,data3=0,data4=0;//数码管显示变量
float dataform=0;//温度处理变量
while(1)
{
  dataform=readtemp();
  dataform=dataform*0.0625*100; //精度出厂默认为0.0625,*100为了好分数据  
  data1 = ((uint)dataform)/1000;
  data2 = ((uint)dataform)%1000/100;
  data3 = ((uint)dataform)%1000%100/10;
  data4 = ((uint)dataform)%1000%100%10;
  play(0);
  play(data4); //显示部分  0.01度
  play(data3); //0.1度
  play(data2); //个位
  play(data1); //十位
}
}

相关帖子

沙发
踢球老越位| | 2009-11-4 23:59 | 只看该作者
显示不出来有两层含义:没读到数据;读到数据但是无法在显示器件显示.楼主先搞清楚是怎么回事。。。

使用特权

评论回复
板凳
zydlyq|  楼主 | 2009-11-5 07:38 | 只看该作者
2# 踢球老越位
我找了一晚上也没找出来啊!!帮我看看是什么地方的错误吧!!!初学实在是找不出来啊!!!

使用特权

评论回复
地板
lhj200304| | 2009-11-5 09:51 | 只看该作者
1# zydlyq
先把显示弄好再说了

使用特权

评论回复
5
xulong431| | 2009-11-5 11:13 | 只看该作者
理清头绪,一步步往下找,主要是把问题定位

使用特权

评论回复
6
gzmtr| | 2009-11-5 21:31 | 只看该作者
是不是delay函数用的是uint?迟时太长了?我是初学者,讲错了大虾们不要见怪。大家共同交流。

使用特权

评论回复
7
暮然| | 2009-11-5 21:34 | 只看该作者
有条件试着输出一个模拟读取或写入的信号,用示波器看看。
1820的时序是关键

使用特权

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

本版积分规则

32

主题

313

帖子

1

粉丝