#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編輯過]
|