本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
下面这个程序是我刚写的,不知道怎么回事,数码管上总显示000.0C
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^3;
sbit led=P1^0;
uchar flag_get;
uchar str[7];
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay_9us(uchar x)
{
while(x--);
}
void init_18b20(void)
{
DQ=0;
delay_9us(60);
DQ=1;
delay_9us(4);
if(DQ)
led=0;
}
void write_char(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
delay_9us(2);
DQ=dat&0x01;
delay_9us(5);
DQ=1;
dat>>=1;
}
// delay_6us(5);
}
uchar read_char()
{
uchar dat,i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
dat>>=1;
if(DQ)
dat|=0x80;
delay_9us(5);
DQ=1;
_nop_();
_nop_();
}
return(dat);
}
uint read_temperture()
{
float tt;
uchar templ;
uint bb,aa,temph;
init_18b20();
write_char(0xcc);
write_char(0x44);
delay_9us(150);
init_18b20();
write_char(0xcc);
write_char(0xbe);
templ=read_char();
temph=read_char();
temph<<=8;
aa=temph|templ;
// aa=257;
tt=aa*0.0625;
bb=tt*10+0.5;
return(bb);
}
void time0(void) interrupt 1 //中断,用于数码管扫描和温度检测间隔
{
uchar num,count;
TH0=0xef; //定时器重装值
TL0=0xf0;
num++;
if (num==50)
{
num=0;
flag_get=1;
}
count++;
if(count==1) //数码管扫描
{
P2=0;
P0=str[0];
}
if(count==2)
{
P2=1;
P0=str[1];
}
if(count==3)
{
P2=2;
P0=str[2];
}
if(count==4)
{
P2=3;
P0=str[3];
}
if(count==5)
{
P2=4;
P0=str[4];
}
if(count==6)
{
P2=5;
P0=str[5];
count=0;
}
}
void main()
{
uint temp;
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
while(1)
{
if(flag_get==1) //定时读取当前温度
{
flag_get=0;
temp=read_temperture();
if(temp&0x8000)
{
str[0]=0x40;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
str[1]=tab[temp/1000]; //百位温度
str[2]=tab[(temp%1000)/100]; //十位温度
str[3]=tab[((temp%1000)%100)/10]|0x80; //个位温度,带小数点
str[4]=tab[(((temp%1000)%100)%10)];//十分位
str[5]=0x39; //显示C符号
}
}
} |