?? ds18b20.c
字號:
#include <avr/io.h>
#include "ds18b20.h"
#define BIT(X) (1 << X)
/*************************************************************************
ds18b20頭文件
M16 內(nèi)部8M
*************************************************************************/
#define CLR_DIR_1WIRE DDRA&=~BIT(2) //只要修改這里的參數(shù)就可以了!呵呵!
#define SET_DIR_1WIRE DDRA|=BIT(2) //里面什么都不用該!
#define CLR_OP_1WIRE PORTA&=~BIT(2)
#define SET_OP_1WIRE PORTA|=BIT(2)
#define CHECK_IP_1WIRE (PINA & 0x04) //檢測
unsigned char wmh,wml;
//延時程序:
//delay.h
/*-----------------------------------------------------------------------
延時函數(shù)
系統(tǒng)時鐘:8M
-----------------------------------------------------------------------*/
static void delay_1us(void) //1us延時函數(shù)
{
asm("nop");
}
static void delay_nus(unsigned int n) //N us延時函數(shù)
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
static void delay_1ms(void) //1ms延時函數(shù)
{
unsigned int i;
for (i=0;i<1140;i++);
}
static void delay_nms(unsigned int n) //N ms延時函數(shù)
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void init_1820()
{
SET_DIR_1WIRE; //設置PA2 為輸出
SET_OP_1WIRE;
CLR_OP_1WIRE;
delay_nus(480); //480us以上
SET_OP_1WIRE;
CLR_DIR_1WIRE;
delay_nus(20); //15~60us
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
delay_nus(140); //60~240us
}
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_OP_1WIRE;
if(x&(1<<m)) //寫數(shù)據(jù)了,先寫低位的!
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
delay_nus(40); //15~60us
SET_OP_1WIRE;
}
SET_OP_1WIRE;
}
unsigned char read_1820()
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); //讀數(shù)據(jù),從低位開始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
SET_DIR_1WIRE;
}
return (temp);
}
unsigned char gettemp() //讀取溫度值
{
unsigned char temh,teml,wm0,wm1,wm2,wm3;
init_1820(); //復位18b20
write_1820(0xcc);
write_1820(0x44); // 發(fā)出轉換命令
delay_nms(800);
init_1820();
write_1820(0xcc);
write_1820(0xbe); //發(fā)出讀命令
teml=read_1820(); //讀數(shù)據(jù)
temh=read_1820();
wm0=teml>>4;
wm1=temh<<4;
wm2=wm1+wm0; //16進制轉10進制
wm3=wm2/100;
return wm2;
}
unsigned int get_temp(char num)
{
unsigned char temh,teml,wm0,wm1,wm2,wm3;
unsigned int temp = 0;
if(num & 1)
{
init_1820();
write_1820(0xcc); //發(fā)出讀命令
write_1820(0xbe);
teml=read_1820(); //讀數(shù)據(jù)
temh=read_1820();
wm0=teml>>4;
wm1=temh<<4;
wm2=wm1+wm0;
wm3=wm2/100;
temp = (10 * ((unsigned int)teml & 0x0f) / 16) << 8;
temp |= (unsigned int)(wm2 & 0xff);
return temp;
}
else
{
init_1820(); //復位18b20
write_1820(0xcc); // 發(fā)出轉換命令
write_1820(0x44);
return(0xffff);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -