本帖最后由 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());
}
}
一周热门 更多>