?? ds1820._c
字號:
/*
DS18B20操作模塊
1、DS18B20的電源腳接到VCC及GND上面,數據線接到PA7口。
2、晶振頻率為內部1MHz。
3、DS18B20由PA7口實現單總線訪問,實現讀取溫度。
4、函數中有對中斷的保護處理,更具有實用價值。
5、此文件可以直接嵌入到項目中使用。
AVR mega16學習板
AVR_AFA
www.iccavr.com
11:48 2007-6-30
*/
#include <iom16v.h>
#include <macros.h>
#define DQ_IN DDRA &= ~(1 << PA3) /*設置輸入*/
#define DQ_OUT DDRA |= (1 << PA3) /*設置輸出*/
#define DQ_CLR PORTA &= ~(1 << PA3) /*置低電平*/
#define DQ_SET PORTA |= (1 << PA3) /*置高電平*/
#define DQ_R PINA & (1 << PA3) /*讀了電平*/
#define delay4us {NOP();NOP();NOP();NOP();}
#define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
unsigned char flag; /*中斷標志緩存*/
/*
延時函數
延時時間:i X 10 + 16uS。
CPU頻率為:1MHz。
*/
void delay_10us(unsigned char i) {
if (i == 0) {
return ;
}
while (i--) {
delay4us;
}
}
/*DS18B20復位函數*/
unsigned char ds1820_reset(void) {
unsigned char i;
flag = SREG; /*中斷保護*/
CLI(); /*關中斷*/
DQ_OUT;
DQ_CLR;
delay_10us(49); /*延時500uS(480-960)*/
DQ_SET;
DQ_IN;
delay_10us(7); /*延時80uS*/
i = DQ_R;
delay_10us(49); /*延時500uS(保持>480uS)*/
if (flag & 0x80) { /*恢復中斷狀態*/
SEI();
}
if (i) {
return 0x00;
}
else {
return 0x01;
}
}
/*DS18B20字節讀取函數*/
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0;
flag = SREG; /*中斷保護*/
CLI(); /*關中斷*/
for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT;
DQ_CLR;
delay4us; /*延時4uS*/
DQ_SET;
DQ_IN;
delay10us; /*延時10uS*/
if (DQ_R) {
value|=0x80;
}
delay_10us(5); /*延時60uS*/
}
if (flag & 0x80) { /*恢復中斷狀態*/
SEI();
}
return(value);
}
/*DS18B20字節寫入函數*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
flag = SREG; /*中斷保護*/
CLI(); /*關中斷*/
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_CLR;
delay4us; /*延時4uS*/
if (value & 0x01) {DQ_SET;}
//每次都只寫最低位,如果最低位是1的話輸出高電平作為寫1信號,否則無動作即為0
delay_10us(7); /*延時80uS*/
DQ_SET; /*位結束*/
value >>= 1;
}
if (flag & 0x80) { /*恢復中斷狀態*/
SEI();
}
}
/*啟動ds1820轉換*/
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*啟動轉換*/
}
/*DS8B20讀取溫度信息*/
unsigned int ds1820_read_temp(void) {
unsigned int i;
unsigned char buf[9];
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0xBE); /*讀取溫度*/
for (i = 0; i < 9; i++)
{
buf[i] = ds1820_read_byte();
}
i = buf[1];
i <<= 8;
i |= buf[0];
return i;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -