#include<reg52.h>
sbit ds=P3^7;
//0-F数码管显示(共阴)
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-9数码管的显示,共阴带小数点
unsigned char code tabledot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef};
void delay(unsigned char i)//延时函数,I=10,延时10ms
{
unsigned char j,k;
for(j=i;j>0;j--)
{
for(k=125;k>0;k--);
}
}
void dsinit()//初始化ds1820
{
unsigned int i;
ds=0;
i=103;
while(i>0)i--; //延时大于480us
ds=1;
i=4;
while(i>0)i--;
}
void dswait()
{
unsigned int i;
while(ds);
while(~ds);
i=4;
while(i>0)i--;
}
bit readbit()//读取一位数据
{
unsigned int i;
bit b;
ds=0;
i++;
ds=1;
i++;i++;
b=ds;
i=8;
while(i>0)i--;
return b;
}
//读取一字节数据
unsigned char readbyte()
{
unsigned int i;
unsigned char j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readbit();
//最新读出的是最低位
dat=(j<<7)|(dat>>1);
}
return dat;
}
//向ds1820写入一字节数据
void writebyte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j=0;j<8;j++)
{
b=dat&0x01;
dat>>=1;
//写1,让低电平持续两个小延时,高电平持续8个小延时
if(b)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else//写0,相反
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
//向DS18B20发送温度转换命令
void sendchangecmd()
{
dsinit();//初始化ds1820
dswait();
delay(1);
writebyte(0xcc);//写ROM
writebyte(0x44);//写RAM
}
//向ds1820发送读取数据命令
void sendreadcmd()
{
dsinit();
dswait();
delay(1);
writebyte(0xcc);
writebyte(0xbe);//写入读取数据命令
}
//获取当前温度值
unsigned int gettmpvalue()
{
unsigned int value;//存放温度值
float t;
unsigned char low,high;
sendreadcmd();
//连续读取两个字节数据;
low=readbyte();
high=readbyte();
//将高低字节合成一个整型变量
value=high;
value<<=8;
value|=low;
//ds1820精确度为0.0625
t=value*0.0625;
value=t*10+0.5;//如t=11.0625,结果为111,即11.1
return value;
}
//显示当前温度值,精确到小数点后一位
void display(unsigned int v)
{
unsigned char count;
unsigned char datas[]={0,0,0};
datas[0]=v/100; //百位
datas[1]=(v%100)/10;//十位
datas[2]=v%10; //个位
for(count=0;count<3;count++)
{
//片选
P2=((0xfe<<count)|(0xfe>>(8-count)));//选择第(count+1)数码管
//段选
if(count!=1)
{
P0=table[datas[count]];//显示数字
delay(1); //延时1ms
P2=0xff;
}
else
{
P0=tabledot[datas[count]];//显示带小数点数字
delay(1);
P2=0xff;
}
}
}
void main()
{
unsigned char i;
unsigned int value;
while(1)
{
//启动温度转换
sendchangecmd();
value=gettmpvalue();
//显示3次
for(i=0;i<3;i++)
{
display(value);
}
}
}
温度值大于26就显示正确,小于26就闪烁,什么问题啊
此帖出自
小平头技术问答
一周热门 更多>