#include <iom16v.h>//头文件
#include <macros.h>
#define uint unsigned int //宏定义
#define uchar unsigned char
uchar temp_value;
uchar flag1;
#pragma data:code
const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint ms) //延迟函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1141;j++);
}
void delayus(uint us)
{
do
{
us--;
}
while(us>1);
}
/*void delayus(uint us)
{
uint i,j,a,b;
j=us*5;
a=j/4;
for(i=0;i<a;i++)
{
for(b=0;b<1;b++);
}
}*/
void show(uchar j,uchar k)
{
PORTD=table[j];
// 位选
PORTC&=~BIT(k);
delay(10);
PORTC|=BIT(k);
}
void RST18B20()
{ unsigned char i=0;
DDRA|=BIT(0);
PORTA&=~BIT(0);
delayus(560); // 延时540 μs
PORTA|=BIT(0); //恢复
delayus(50); // 延时90 μs
DDRA&=~BIT(0);
i=PINA&0X01;//读存在脉冲 ?????
delayus(120); // 延时270 μs
}
void WR18B20(uchar com)
{
uchar i,j;
DDRA|=BIT(0);
for(i=8;i>0;i--)
{
j=com&0x01;
if(j==0x01)
{PORTA&=~BIT(0);
delayus(10);
PORTA=j;
PORTA|=BIT(0);
delayus(100);
}
else
{PORTA&=~BIT(0);
delayus(100);
PORTA=j;
PORTA|=BIT(0);
delayus(10);
}
com=com>>1;
}
}
uchar RD18B20()
{
uchar i,BYTE,d=0;
for (i = 0; i<8; i++)
{
DDRA|=BIT(0);
PORTA&=~BIT(0);
delayus(15);
PORTA|=BIT(0);
DDRA&=~BIT(0);
delayus(10);
BYTE=PINA&BIT(0);
delayus(45);
BYTE<<=i;
d|=BYTE;
}
return d;
}
void ConvertT()
{
RST18B20(); //初始化
WR18B20(0xcc); //Skip R O M ,跳过多传感器识别
WR18B20(0x44); //C onvert T ,启动温度转换
}
uchar ReadT()
{ uchar a;
uchar b;
RST18B20(); //初始化
WR18B20(0xcc); //skip R O M ,跳过多传感器识别
WR18B20(0xbe); //read scratchpad,读DS18B20暂存器
a=RD18B20(); //温度值低位
b=RD18B20();//温度值高位
flag1=b&0xf8;
if(flag1)
{
b=~b;
if(a==0)
b++; //若低8位全为0且温度为负,取补时就要向高位进1
a=~a+1;
}
temp_value=(b*256+a)/16;
return (temp_value); //返回读出的温度值,2 字节
}
void main()
{
DDRD=0XFF;//B口输出
DDRC=0X03;
RST18B20();
while(1)
{
show(temp_value/10,0);
show(temp_value%10,1);
ConvertT();
delay(10);
ReadT();
}
}