微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC11F04E的18B20程序不能显示正确温度

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

时间:10-02 整理:3721RD 点击:

我自己精简了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());
}
}

无语了,刚发完帖子,随便改了几个延时竟然好使了。
小编可以帮我把帖子下了

汗‘问题了,我又改了时序延时,显示00.1,我又改回刚才有效的延时,可还是显示00.1,这是怎么回事啊?我用的是KEIL3

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top