#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f}; //不带小数点
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; //带小数点
uchar Ds;
uint temp;
sbit ds=P1^7;
sbit du=P2^6;
sbit we=P2^7;
sbit beep=P2^2;
sbit jd=P2^3;
sbit key_up=P3^2;
sbit key_down=P3^4;
float futemp;
/************ 延时函数 ************/
void delay(uint z) //ms延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************ DS18B20函数 ***********/
dsreset(void) //DS18B20复位 初始化函数
{
uint i;
ds=0;
i=103;
while(i>0) i--;
ds=1;
i=4;
while(i>0) i--;
Ds=ds;
i=4;
while(i>0) i--;
return Ds;
}
bit tempreadbit(void) //读一位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0) i--;
return(dat);
}
uchar tempread(void) //读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat) //写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
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++;
}
}
}
/************ 获取温度并转换 ***********/
void tempchange(void) //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
futemp=temp*0.0625;
temp=futemp*10+0.5;
futemp=futemp+0.05;
return temp;
}
/************ 按键扫描函数 ************/
/************ 显示子函数 ***********/
void play(uint xs)
{
uchar bai,shi,ge;
bai=xs/100;
shi=xs%100/10;
ge=xs%10;
du=1;
P0=table[bai];
du=0;
P0=0xff;
we=1;
P0=0xdf;
we=0;
delay(1);
du=1;
P0=table1[shi];
du=0;
P0=0xff;
we=1;
P0=0xbf;
we=0;
delay(1);
du=1;
P0=table[ge];
du=0;
P0=0xff;
we=1;
P0=0x7f;
we=0;
delay(1);
}
/************ 主函数 ***********/
void main()
{
while(1)
{
tempchange();
play(get_temp());
}
}
[此贴子已经被作者于2012-6-13 12:34:02编辑过]
|