?? 1wire.h
字號:
#ifndef __1WIRE_H__
#define __1WIRE_H__
#define monobus_1 DDRA_Bit0=0 //設置單片機IO為輸入,由于總線存在上拉電阻,所以此時電平是1
#define monobus_0 DDRA_Bit0=1 //設置單片機IO為輸出,配合默認的 PORTC.0=0 則輸出0電平
#define monobus_in PINA_Bit0 //檢測總線(從機)的電平狀態
extern void delay_ms(unsigned int mmss);
extern void delay_us(unsigned int uuss);
void monobus_init(void) //復位,不檢測從機設備是否存在(只要沒有虛焊就肯定存在的)
{
monobus_0;
delay_us(480);
monobus_1;
delay_us(480);
}
void write_monobus(unsigned char data) //向單總線的從機寫入數據(先寫低位再寫高位,與SPI相反)
{
unsigned char n=1;
while(n)
{
monobus_0;
delay_us(2); //拉低總線1-3us,通知從機準備收發數據
if(data&n) monobus_1; else monobus_0; //向總線寫數據的某一位(1或者0)
delay_us(75); //等待90us,保證從機有足夠的時間進行采樣(24-210us)
monobus_1; //釋放總線
delay_us(2); //釋放總線時間要大于1us
n<<=1;
}
}
unsigned char read_monobus(void) //讀單總線的從機數據(先傳輸低位后傳輸高位,與SPI相反)
{
unsigned char data_18b20=0;
unsigned char n=1;
while(n)
{
monobus_0;
delay_us(2); //拉低總線1-3us,通知從機準備收發數據
monobus_1; //釋放總線
delay_us(5); //從機在1-25us內會向總線輸出數據的某一位(1或者0)
if(monobus_in) data_18b20+=n; //讀取總線數據
delay_us(55); //等待從機釋放總線
n<<=1;
}
return data_18b20;
}
// unsigned char crc8(unsigned char *ptr, unsigned char len)
// {
// unsigned char i;
// unsigned char crc=0;
// while(len--!=0)
// {
// for(i=1; i!=0; i*=2)
// {
// if((crc&1)!=0) {crc/=2; crc^=0x8C;}
// else crc/=2;
// if((*ptr&i)!=0) crc^=0x8C;
// }
// ptr++;
// }
// return(crc);
// }
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -