ds18b20在数码管上显示,温度准确,但是数字有点闪烁,不知那里有问题,那位大神给看看!
时间:10-02
整理:3721RD
点击:
程序延迟可能有问题
#include "reg51.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar dspbuf[8] = {10,10,10,10,10,10,10,10};
uchar dspcom=0;
uchar temp;
sbit DQ=P1^4;
void delay(uint t);
void init_ds18b20();
void write_ds18b20(uchar dat);
uchar read_ds18b20();
uchar readtemperature();
void display();
void main()
{
TMOD|=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
temp=readtemperature();
dspbuf[6]=temp/10;
dspbuf[7]=temp%10;
}
}
void zhongduan () interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65336-2000)%256;
display();
}
void delay(uint t)
{
while(t--);
}
void init_ds18b20()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
void write_ds18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
DQ=1;
dat>>=1;
}
delay(4);
}
uchar read_ds18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
return value;
}
uchar readtemperature()
{
uchar a,b;
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
delay(300);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
a=read_ds18b20();
b=read_ds18b20();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void display()
{
XBYTE[0xE000]=0xff;
XBYTE[0XC000]=1<<dspcom;
XBYTE[0XE000]=table[dspbuf[dspcom]];
if(++dspcom==8)
dspcom=0;
}
#include "reg51.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar dspbuf[8] = {10,10,10,10,10,10,10,10};
uchar dspcom=0;
uchar temp;
sbit DQ=P1^4;
void delay(uint t);
void init_ds18b20();
void write_ds18b20(uchar dat);
uchar read_ds18b20();
uchar readtemperature();
void display();
void main()
{
TMOD|=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
temp=readtemperature();
dspbuf[6]=temp/10;
dspbuf[7]=temp%10;
}
}
void zhongduan () interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65336-2000)%256;
display();
}
void delay(uint t)
{
while(t--);
}
void init_ds18b20()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
void write_ds18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
DQ=1;
dat>>=1;
}
delay(4);
}
uchar read_ds18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
return value;
}
uchar readtemperature()
{
uchar a,b;
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
delay(300);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
a=read_ds18b20();
b=read_ds18b20();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void display()
{
XBYTE[0xE000]=0xff;
XBYTE[0XC000]=1<<dspcom;
XBYTE[0XE000]=table[dspbuf[dspcom]];
if(++dspcom==8)
dspcom=0;
}
错误是uchar dspbuf[8]写入和读出时序错误,一次读出的内容包含两次写入的部分拼接的结果,显示必然闪烁
readtemperature()应当也放入中断,display()可以跟在后面,最好用定时器中断
主函数中:
temp=readtemperature();
dspbuf[6]=temp/10;
dspbuf[7]=temp%10;
在
dspbuf[6]=temp/10;
dspbuf[7]=temp%10;
之前关中断,之后开中断,中断响应中调用的display()函数读取这两个字节时数据就是同步的
