📄 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 + -