?? 18b20._c
字號(hào):
#include <io8515v.h>
#include <macros.h>
#include "d12head.h"
#define TEMPTPORT PORTB
#define TEMPTDDR DDRB
#define TEMPTPIN PINB
#define TEMPTNUM 0 //定義B0口為18b20
/*void delay_us(int time)
{
do{
time--;
}while (time>1);
}
*/
/** /
void delay_ms(long time)
{
time=time*60;
do{
WDR(); //看門(mén)狗復(fù)位
time--;
}while (time>1);
}
/**/
/*********************************************
檢查DS18B20是否存在:
如果DS18B20不存在返回1,否則返回0
*********************************************/
/*///
unsigned char DS18B20_ack(void)
{
unsigned char ack;
TEMPTDDR|=1<<TEMPTNUM; //輸出
TEMPTPORT&=~(1<<TEMPTNUM); //輸出LOW
delay_us(500);//復(fù)位低電平,480us-960us
TEMPTPORT|=1<<TEMPTNUM; //輸出HIGH
TEMPTDDR&=~(1<<TEMPTNUM); //輸入
delay_us(45);//復(fù)位預(yù)計(jì)600us
ack=TEMPTPIN;
ack &= 1<<TEMPTNUM;
delay_us(500);//等待18B20的自動(dòng)上拉電阻拉高。
return ack;
}
*////
/*********************************************
寫(xiě)ROM或存貯器命令到DS18B20
*********************************************/
/*///
void DS18B20_write(unsigned char cmd)
{
unsigned char i,j;
TEMPTDDR |= 1<<TEMPTNUM; //輸出
for (j=0;j<=7;j++)//兩次數(shù)據(jù)之間的時(shí)間間隔大于1us。
{
i=cmd&0x01;
if (i==0x01)//輸出1
{
TEMPTPORT &= ~(1<<TEMPTNUM); //輸出LOW
delay_us(10);//保持低電平大于1us小于15us
TEMPTPORT |= 1<<TEMPTNUM; //輸出HIGH
delay_us(100);//要求持續(xù)時(shí)間大于60us,小于120us
}
else //輸出0
{
TEMPTPORT &= ~(1<<TEMPTNUM); //輸出LOW
delay_us(100);
TEMPTPORT |= 1<<TEMPTNUM; //輸出HIGH
delay_us(10);
}
cmd=cmd>>1;
}
}
*////
/*********************************************
從DS18B20讀溫度數(shù)據(jù)
*********************************************/
/*///
void DS18B20_read(void)
{
unsigned char byteH,byteL,i;
unsigned int tempt=0;
for (i=0;i<8;i++)
{
TEMPTDDR |= 1<<TEMPTNUM; //輸出
TEMPTPORT &= ~(1<<TEMPTNUM); //輸出LOW
delay_us(3);//發(fā)送0,保持大于1us以上時(shí)間。
TEMPTPORT |= 1<<TEMPTNUM; //輸出HIGH
TEMPTDDR &= ~(1<<TEMPTNUM); //輸入
delay_us(10);
if (TEMPTPIN&1<<TEMPTNUM)
byteL |= 0x80;
if (i<7)
byteL = byteL>>1;
delay_us(100);
TEMPTDDR |= 1<<TEMPTNUM; //輸出
delay_us(5);
}
for (i=0;i<8;i++)
{
TEMPTDDR |= 1<<TEMPTNUM; //輸出
TEMPTPORT &= ~(1<<TEMPTNUM); //輸出LOW
delay_us(3);//發(fā)送0,保持大于1us以上時(shí)間。
TEMPTPORT |= 1<<TEMPTNUM; //輸出HIGH
TEMPTDDR &= ~(1<<TEMPTNUM); //輸入
delay_us(10);
if (TEMPTPIN&1<<TEMPTNUM)
byteH |= 0x80;
if (i<7)
byteH = byteH>>1;
delay_us(100);
TEMPTDDR |= 1<<TEMPTNUM; //輸出
delay_us(5);
}
XmtBuff.msg[0] = byteL;//返回主機(jī)有符號(hào)的shor int 數(shù)
XmtBuff.msg[1] = byteH;//其除以16即為溫度值
XmtBuff.msgL = 2;
}
*////
/*///
void converT_command(void)
{
char i;
do{
/// i=DS18B20_ack();//對(duì)DS18B20進(jìn)行復(fù)位
} while (i == 1<<TEMPTNUM);
/// DS18B20_write(0xcc); //1100 1100 給18B20發(fā)啟動(dòng)命令
/// DS18B20_write(0x44); //0100 0100 給18B20發(fā)轉(zhuǎn)換溫度指令
}
*////
//delay_ms(900);//延時(shí)等轉(zhuǎn)換結(jié)束,12位格式約需750ms
/*///
void readT_command (void)
{
char i;
do{
/// i=DS18B20_ack();//對(duì)DS18B20進(jìn)行復(fù)位
} while (i == 1<<TEMPTNUM);
/// DS18B20_write(0xcc);//1100 1100 給18B20發(fā)啟動(dòng)命令
/// DS18B20_write(0xbe);//1011 1110 給18B20發(fā)讀溫度指令
/// DS18B20_read();
}
*////
void wendu (void)
{
/// converT_command();
/// readT_command();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -