#include <reg51.h>
#include <intrins.h>
sbit led0=P3^4;
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;
sbit DQ=P2^4;
float data TMP[2]={0,0};
unsigned char data f[2]={0,0};
unsigned char data disp_buf[4]={0,0,0,0};
unsigned char data dot_position=0;
unsigned char data chno=0;
unsigned char code SN[2][8]={{16, 62,148,60,0,0,0, 247},{16,229,146,60,0,0,0, 87}};
unsigned char code seg_table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x6f,0x76};
unsigned char code CH[ ]={10,11,12,13,14,15,16,17};
// 將0.00~99.9之間的浮點數轉為單個數碼,并送顯示緩沖區和返回小數點位置
void ftochar(float valp)
{
if(valp<10.0)
{
dot_position=1;
valp*=100.0;
}
else if((valp>=10.0)&&(valp<100.0))
{
dot_position=2;
valp*=10.0;
}
else if((valp>=100.0)&&(valp<1000.0))
dot_position=3;
disp_buf[1]=(int)valp/100;
disp_buf[2]=((int)valp%100)/10;
disp_buf[3]=((int)valp%100)%10;
}
//延時15微秒的函數
void delay(unsigned char n)
{
do {
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
n--;
}while(n);
}
//DS18B20復位函數
void ow_reset(void)
{
DQ = 0;
delay(120);
DQ = 1;
delay(24);
}
//DS18B20讀位函數
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0;
DQ = 1;
for(i=0; i<5; i++);
return(DQ);
}
//DS18B20寫位函數
void write_bit(char bitval)
{
DQ = 0;
if(bitval==1) DQ =1;
delay(6);
DQ = 1;
}
//從DS18B20讀取字節函數
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for(i=0;i<8;i++)
{
if(read_bit()) value|=0x01<<i;
delay(11);
}
return(value);
}
//寫字節到DS18B20
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)
{
temp = val>>i;
temp &= 0x01;
write_bit(temp);
}
delay(10);
}
//讀溫度代碼
void read_temp()
{
unsigned char i,j;
unsigned char a,b;
int mr;
for(j=0;j<2;j++)
{
ow_reset();
delay(20);
write_byte (0x55);
for(i=0;i<8;i++)
{
write_byte(SN[j][i]);
}
write_byte (0xbe);
a = read_byte();
b = read_byte();
mr=b*256+a;
if((mr&0xf800)!=0)
mr=-mr+1;
TMP[j]=mr*0.5;
}
}
//定時器T0終端函數,每中斷一次,顯示一次數碼管
void Time_disp(void) interrupt 1
{
static unsigned char dispno=0;
TH0=0xee;
TL0=0x00;
P3|=0xf0;
P0=seg_table[disp_buf[dispno]];
if(dispno==dot_position) P0|=0x80;
switch(dispno)
{
case 0 : led0=0;
break; case 1 : led1=0;
break; case 2 : led2=0;
break; case 3 : led3=0;
break;
}
dispno++;
if(dispno==4) dispno=0;
}
//定時器T1中斷函數,每50ms中斷一次
void Timer1(void) interrupt 3
{
static unsigned int count;
TH1=0x4c;
TL1=0x00;
count++;
if(count>=20)
{
count=0;
ftochar(TMP[chno]);
disp_buf[0]=CH[chno];
chno++;
if(chno==2) chno=0;
}
}
//主函數
main( )
{
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH0=0xee;
TL0=0x00;
TH1=0x4c;
TL1=0x00;
TR0=1;
TR1=1;
do
{
ow_reset( );
write_byte(0xcc);
write_byte(0x44);
read_temp( );
}
while(1);
}
|