0
#include
#include
#define N0_DISPLAY 17
#define DISP_SIGN 16
***it ONE_WIRE_DQ=P1^0;
void delay_ms(unsigned int);
void delay_ms(register unsigned int);
void temp2str(signed int tmep,unsigned char *);
void display(unsigned char *);
void start_convert(void);
signed int read_temperature(void);
unsigned char OW_reset(void);
unsigned char OW_read_byte(void);
void OW_write_byte(unsigned char val);
void main()
{
unsigned char i;
unsigned char dispram[8];
for(i=0;i<8;i++)
dispram=N0_DISPLAY; //第21行
while (1)
{
start_convert();
for(i=0;i<120;i++) display(dispram);
temp2str(read_temperature(),dispram);
}
}
/**************************************************************/
//Start DS18B20 Temperature Convert
/**************************************************************/
void start_convert(void) //第32行
{
OW_reset();
OW_write_byte(0xCC);//Skip ROM
OW_write_byte(0x44);//Start Conversion
}
/**************************************************************/
//Read Temperature
//returns the Temperature
/**************************************************************/
signed int read_temperature(void) //42行
{
unsigned char get[9];
signed int temp;
unsigned char i;
OW_reset();
OW_write_byte(0xCC);
OW_write_byte(0xBE);
for(i=0;i<9;i++) get=_OW_write_byte(); //第50行
temp=(temp<<8)|get[0];
return temp;
}
/**************************************************************/
// OW_reset-per forms a reset on the one-write bus and
//returns the presence detect
/**************************************************************/
unsigned char OW_reset(void)
{
unsigned char presence;
ONE_WIRE_DQ=0;
delay_us(240);
ONE_WIRE_DQ=1;
delay_us(33);
presence=! ONE_WIRE_DQ;
delay_us(205);
return (presence );
}
/**************************************************************/
//READ_BYTE-reads a byte from the one-wire bus.
/**************************************************************/
Unsigned char OW_read_byte(void)
{
unsigned char I;
unsigned char value;
for(i=0;i<8;i++)
{
ONE_WIRE_DQ=0;
start timeslot
value>>=1;
ONE_WIRE_DQ=1;
delay_us(1);
timeslot
if(ONE_WIRE_DQ) value|=0x80;
delay_us(25);
}
return(value);
}
/**************************************************************/
//WRITE_BYTE-writes a byte from the one-wire bus.
/**************************************************************/
void OW_write_byte(char val)
{
unsigned char i;
for(i=0;i<8;i++)
{
ONE_WIRE_DQ=0;
delay_us(1);
ONE_WIRE_DQ=val&0x01;
if write 1
delay_us(30);
ONE_WIRE_DQ=1;
val>>=1;
}
}
/**************************************************************/
Temperature data to display string function
Parameter: int tem,pointer of string
/**************************************************************/
void temp2str(signed int temp,unsigned char * ch)
{
Unsigned char sign;
if(temp<0)
{
sign=1;
temp=(~temp )+1;
}
else sign=0;
ch[7]=((temp&0x0f)*10+8)/16;
temp>>=4;
ch[6]=(temp%10)|0x40;
temp/=10;
ch[5]=temp%10;
temp/=10;
ch[4]=temp%10;
ch[3]=NO_DISPLAY;
if (ch[4]==0)
{
ch[4]=NO_DISPLAY;
if(ch[5]==0) ch[5]= NO_DISPLAY;
}
If(sign)
{
If(ch[5]== NO_DISPLAY) ch[5]=DISP_GIGN;
else if(ch[4]== NO_DISPLAY) ch[4]=DISP_GIGN;
else ch[3]=DISP_GIGN;
}
}
/**************************************************************/
8 LED digital tubes display function
Parameter:string pointer to display
/**************************************************************/
void display(unsigned char * disp_ram)
{
static unsigned char disp_count;
unsigned char i;
unsigned char code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
disp_count=( disp_count+1)$0x7f;
for(i=0;i<8;i++)
{
if(disp_ram&0x80) P0=(disp_count>32)?table[disp_ram&0x3f]:0xff;
else P0=table[disp_ram&0x3f];
if (disp_ram&0x40) P0&0x7f;
P2=0x01<
delay_ms(1);
P0=0xff;
P2=0;
}
}
/**************************************************************/
Delay function
Parameter:unsigned char dt
Delay time=dt*2+5(us)
/**************************************************************/
void delay_us(register unsigned char dt)
{
while(--dt);
}
/**************************************************************/
Delay function
Parameter:unsigned int dt
Delay time=dt(ms)
/**************************************************************/
Void delay_ms(unsigned int dt)
{
register unsigned char bt,ct;
for(;dt;dt--)
for(ct=2;ct;ct--)
for(bt=250;--bt;)
}
以上为全部程序
|
|