求大神们看看我的数字温度计哪有问题,谢谢了
#include<reg51.h>#include<absacc.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
sbit DQ=P3^3 ;
unsignedchar tempL=0 ;
unsigned char tempH=0;
unsigned char flag=0;
float temperature;
void delay(unsigned int time)
{
while( time--);
}
void delay1(void)
{
int k;
for(k=0;k<600;k++);
}
void display(int k)
{
P2=0xfe;
P1=tab;
delay1();
P2=0xfd;
P1=tab;
delay1();
P2=0xfb;
P1=tab;
delay1();
P2=0xf7;
P1=tab;
delay1();
P2=0xff;
}
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;
delay(8);
DQ=0;
delay(55);
x=DQ;
delay(100);
return x;
}
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
unsigned char n;
for(i=8;i>0;i--)
{
DQ=0;
n=2;
while(n--);
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
ReadTemperature(void)
{
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delay(12500);
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
tempL=ReadOneChar();
tempH=ReadOneChar();
temperature=((tempH*256)+tempL)*0.0625;
/*if(tempH&0xfc)
{
flag=1;
temperature=((tempH<<8)|tempL);
temperature=((!temperature)+1);
temperature*=0.0625;
}
else
{
flag=0;
temperature=((tempH<<8)|tempL)*0.0625;
} */
delay(20000);
return(temperature);
}
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(i);
}
}
电路仿真一直出不来结果,请大家看下程序哪有问题,很急,谢谢了! 18b20 关键看时序,用仿真看一下DQ脚时序,和要求的一样么 {:shocked:} 找个正常能用的一套,再改到你的硬件条件查找差异所在,, lihw2@ 发表于 2012-9-21 22:31 static/image/common/back.gif
18b20 关键看时序,用仿真看一下DQ脚时序,和要求的一样么
时序花了老半天改了 ,感觉也对了,可是还是不显示温度值,困惑死了 ,哎 jetli 发表于 2012-9-21 22:36 static/image/common/back.gif
找个正常能用的一套,再改到你的硬件条件查找差异所在,,
硬件还没弄呢,想在电脑上仿真一下,可是一直不出结果,哎,眼瞅着就要交作品了,啊啊啊{:sad:} 先测试显示是不是正常 然后在一级级往后测 把仿真工程代码和C51 工程打压缩包传上来,帮你调试一下吧 仿真不出结果也是正常的,仿真不能全信。我以前的程序仿真不能通过,硬件可以。 ksws0482846 发表于 2012-9-22 20:59 static/image/common/back.gif
仿真不出结果也是正常的,仿真不能全信。我以前的程序仿真不能通过,硬件可以。 ...
哦 可是 仿真不过关 不敢弄硬件呀 而且 还要弄个电子时钟呢 还没开始弄呢 hujian2288 发表于 2012-9-22 20:44 static/image/common/back.gif
把仿真工程代码和C51 工程打压缩包传上来,帮你调试一下吧
谢谢了 全靠你了 我们是初学者 弄了好长时间都没结果 Garbage614 发表于 2012-9-22 20:38 static/image/common/back.gif
先测试显示是不是正常 然后在一级级往后测
没听明白,你可以说的具体点吗? lihw2@ 发表于 2012-9-21 22:31 static/image/common/back.gif
18b20 关键看时序,用仿真看一下DQ脚时序,和要求的一样么
初始化的时序应该没问题吧,用传回来的值检验了下对着呢,可是用kell调试的时候温度高八节和低八节的传回来的都是0xff,然后电路仿真数码管就显示全零,这是什么问题? 本帖最后由 hujian2288 于 2012-9-23 01:41 编辑
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(0x0011);
}
}
你试试,好像这个显示都不对,是不是数码管类型选错了
这个是修改过的,你看一下吧 hujian2288 发表于 2012-9-23 04:38 static/image/common/back.gif
这个是修改过的,你看一下吧
刚试了一下,当温度超过一百度的时候百位的数不显示,还有三极管可以不用了是吧? hujian2288 发表于 2012-9-23 00:50 static/image/common/back.gif
void main()
{
float i;
刚把我的电路图改了下,连得是P33口,把你给的主函数输进去,仿真的时候确实还是有问题,对了,问你一下,我们到底哪里出问题了,你的程序看不太懂,给仔细说说吧,是时序问题吗?还是还有别的什么问题?谢谢你啊! 我的程序没有什么看不懂的,首先P33你接到P32上这是个绝对的错误,其次,显示的延时(视觉的延时)和去读温度的延时要有一定的比例。超过百位显示有点乱,这个我已经努力试过了,我想,你也得做点事情吧,呵呵 hujian2288 发表于 2012-9-23 23:49 static/image/common/back.gif
我的程序没有什么看不懂的,首先P33你接到P32上这是个绝对的错误,其次,显示的延时(视觉的延时)和去读温 ...
哦谢谢!
页:
[1]