на елин ру за основами передачи протокола.
А если коротко - мк передает информацию на устройство, сажая на землю эту шину какое- то время (при передаче 1 -1-7 микросекунд, при передаче 0 -30 -60 микросекунд). Принимает - подает на землю 1 (пару микросекунд)и после передачи 1 смотрит, восстановился ли потенциал 1 на шине -если восстановился, то устройство передает 1, нет - (устройство зажало потенциал на земле еще на пару десятых микросекунд) - передает устройство 0.
Ну и начало обмена - импульс сброса шины (reset pulse)480-960 микросекунд, импульс (present pulse) подтвержление ответа устройства. Для примера - обмен с градусником ds1820
Код:
|
unsigned char t1,t2,t3;
unsigned char st;
//------------------------------------
void litl_del(unsigned char i)
{
do{
}while(--i);
}
//------------------------------------
void big_del(unsigned int i)
{
do{
}while(--i);
}
//-------------------------------------
void reset_()
{
out_ =1;
big_del(200); // reset pulse
out_=0;
litl_del(20);
out_=1;
out_=0;
big_del(200); // present pulse
}
//---------------------------------
//---------------------------------
void out_byte(unsigned char temp)
{
unsigned char st_b=8;
static bit inf;
do
{
inf=temp&0x01;
temp= temp ›› 1;
if (inf == 0)
{
out_=1;
litl_del(20);
out_=0;
}
else
{
out_=1;
litl_del(1);
out_=0;
}
litl_del(20);
}while(--st_b);
litl_del(20);
}
//-----------------------------------
unsigned char read_byte()
{
unsigned char temp=0;
unsigned char s_b=8;
do{
out_=1;
litl_del(1);// 5 микросекунд
out_=0;
litl_del(1);// 5 микросекунд
temp= temp ›› 1;
if (in_inf == 1)
{
temp=temp|0x80;
}
litl_del(40);
}while(--s_b);
return temp;
}
//----------------------------------
while (1)
{
reset_();
out_byte(0xcc);// пропуск выдачи серийного номера
out_byte(0x44);// команда на измерение, конвертирование выполняется за 100 милисекунд
delay_ms(100);// это время и даем
reset_();
out_byte(0xcc);// пропуск выдачи серийного номера
out_byte(0xbe);// запрашиваем чтение
delay_ms(1);
t1=read_byte(); // читаем 2 байта температуры, больше при точности полградуса не нужно
delay_ms(1);
t2=read_byte();
// делаем один байт
delay_ms(1);
t1=t1››3;
t3=t1+(t2*32); // в т3 - температура, умноженная на 2 (младший разряд - полградуса)
delay_ms(5);
}; |