STC11F04E的18B20程序不能显示正确温度

2019-07-15 16:44发布

本帖最后由 dwangqiang 于 2015-6-30 16:07 编辑

我自己精简了STC89C52单片机的18B20温度显示程序(使用后有效)。
修改后给同样使用12Mhz晶振的STC11F04E电路使用,数码管可以正常显示,可无法显示正确的温度,考虑到应该是时序的问题在网上查资料,查到89C52是12T单片机,11F04E是1T的,于是我增加延时变量,可还是无法显示正确的温度,偶尔会出现变化的乱码,现在也不确定到底是哪儿出了问题

我是初学者,请哪位高手指点一下,帮我找出问题,谢谢!

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^7;
uint num;
bit flag;//定义总线电平位变量
//无小数点0-9数组
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//带小数点0-9数组
uchar code dtable[]={
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
//延时函数
void delay(uint z)
{
while(z--);
}
//温度显示函数
void display(uint num)
{
uchar bai,shi,ge;
bai=num/100;
shi=num%100/10;
ge=num%10;

P3=0xf7;
P1=table[bai];
delay(20);
P3=0xff;

P3=0xef;
P1=dtable[shi];
delay(20);
P3=0xff;

P3=0xdf;
P1=table[ge];
delay(20);
P3=0xff;
}
//总线初始化函数
void init()
{
ds=1;
ds=0;
delay(460);
ds=1;
delay(30);
flag=ds;
delay(100);
ds=1;
}
//主控器向18B20写一个字节
void wbyte(uchar wdate)
{
uchar i;//定义次数参数
for(i=8;i>0;i--)//一个字节需写入八次
{
ds=1;
  ds=0;
  delay(1);
  ds=wdate&0x01;
  delay(100);
  ds=1;
  delay(1);
  wdate>>=1;
}
}
//主控器从18B20读一个字节
uchar rbyte()
{
uchar i,date;
for(i=8;i>0;i--)
{
ds=1;
  delay(1);
  ds=0;
  delay(1);
  date>>=1;
  ds=1;
  delay(1);
  if(ds)
   date|=0x80;
  delay(1);
}
return date;//返回读取字节
}
//显示数据产出函数
//每个温度数据由16个字节构成,并由最低位开始送出
uint temperature()
{
uchar db,hb;
float wendu;
init();
wbyte(0xcc);
wbyte(0x44);
init();
wbyte(0xcc);
wbyte(0xbe);
db=rbyte();
hb=rbyte();
num=hb;
num<<=8;
num|=db;
if(num&0xfc00)
{
  num=((~num)+1);
  P1=0X40;
  P3=0xfb;
  delay(20);
  P3=0xff;  
}
wendu=num*0.0625;
num=wendu*10+0.5;
return num;
}
void main()
{
while(1)
{
  display(temperature());
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
dwangqiang
1楼-- · 2019-07-15 20:41
 精彩回答 2  元偷偷看……
dwangqiang
2楼-- · 2019-07-16 00:38
汗‘问题了,我又改了时序延时,显示00.1,我又改回刚才有效的延时,可还是显示00.1,这是怎么回事啊?我用的是KEIL3

一周热门 更多>