top of page

Модули цифровых термометров

DS1621

//Модуль для работы с термометром DS1621
unit ds1621;
{$O-}
{$xdata}
{$idata}
interface
procedure SetCR1621;
procedure ConvertTemp1621;
procedure ReadTemp1621;
procedure Start1621;
procedure Stop1621;
procedure Read1621;
var
temperature:real xdata;  //вещественное значение температуры
tl,th:byte;        //буферы чтения байтов, содержащих
                    //значение температуры
implementation
uses i2c,declare;
const
adrgt=%10010000;   //групповой адрес измерителей температуры
                    //(такой же, что и у АЦП)
adrgtu=%10011110;  //конкретный адрес DS1621 --> 7, для исключения
                    //путаницы с АЦП.
//===============================================
//Процедура преобразования считанной температуры
//в вещественное число
procedure ConvertTemp1621;
begin
asm
  mov vali,tl
  mov vali+1,th
end;
vali:=vali shr 7;
if (vali and %0000000100000000)<>0 then vali:=vali or %1111111100000000;
temperature:=vali/2;
end;
//===============================================
//Процедура выдачи адреса устройства
procedure OutAdr1621(readu:boolean);
begin
acc:=adrgtu;
//if readu then acc:=acc or 1;
//if readu then cy:=true else cy:=false;
cy:=readu;
I2CADR;
end;
//===============================================
//Процедура установки контрольного регистра
procedure SetCR1621;
begin
OutAdr1621(false);
acc:=$AC;
I2CWB;
I2CANS;
acc:=1;       //прерывный режим работы
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура чтения температуры из DS1621
procedure ReadTemp1621;
begin
OutAdr1621(false);
acc:=$AA;
I2CWB;
I2CANS;
//i2cstop;
OutAdr1621(true);
i2crb;
I2CANSM;
th:=acc;
i2crb;
//I2CANSM;
tl:=acc;
I2CNOANSM;
i2cstop;
end;
//===============================================
//Процедура запуска измерения температуры
procedure Start1621;
begin
OutAdr1621(false);
acc:=$EE;
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура остановки измерения температуры
procedure Stop1621;
begin
OutAdr1621(false);
acc:=$22;
I2CWB;
I2CANS;
i2cstop;
end;
//===============================================
//Процедура чтения и преобразования температуры
procedure Read1621;
begin
ReadTemp1621;
ConvertTemp1621;
end;
//===============================================
end.
{
Работа с термометром:
1. Выполняется процедура SetCR1621 - инициализация.
2. Выполняется процедура Start1621 - запуск измерения.
   После этого в любом случае пауза не менее 750 мс
   для завершения процесса преобразования.
3. В нужный момент выполняется Read1621, получаем значение температуры.
}

DS1820-12

unit ds1820_12;
{$O-}
{$xdata}
{$idata}
interface

procedure start20;
procedure Read20;

implementation
uses ports;
//===============================================
procedure TReset;assembler;
label treset0,waitl1,wh1,hl1,short1;
asm
          //ПОДПРОГРАММА СБРОСА МИКРОСХЕМЫ

          CLR DATA20
          MOV B,#120
TRESET0:  NOP
          NOP
          DJNZ B,TRESET0
          SETB DATA20
          MOV B,#120
          CLR C
WAITL1:   JB DATA20,WH1
          DJNZ B,WAITL1
          sjmp SHORT1
WH1:      MOV B,#120
HL1:      ORL C,/DATA20
          DJNZ B,HL1
SHORT1:   RET
end;
//===============================================
procedure Touchby1;assembler;
label tb10;
asm
          //ПОДПРОГРАММА ОБМЕНА БИТОМ
          CLR EA
          CLR DATA20
          NOP
          NOP
          NOP
          NOP
          MOV DATA20,C
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          MOV C,DATA20
          SETB EA
          PUSH B
          MOV B,#20
TB10:     DJNZ B,TB10
          POP B
          SETB DATA20
          RET
end;

//===============================================
procedure TouchBy;assembler;
label b_loop1;
asm
          //ПОДПРОГРАММА ОБМЕНА БАЙТОМ
          PUSH B
          MOV B,#8
B_LOOP1:  RRC A
          LCALL TOUCHBY1
          DJNZ B,B_LOOP1
          RRC A
          POP B
          RET
end;
//===============================================
procedure For18b20;assembler;
label FOR18B200,FOR18B20R;
asm
          MOV A,R4
          JB ACC.7,FOR18B20R
          MOV R0,#3
FOR18B200:
          CLR C
          MOV A,R3
          RRC A
          MOV R3,A
          MOV A,R2
          RRC A
          MOV R2,A
          DJNZ R0,FOR18B200
FOR18B20R:MOV C,F0
          RET
end;
//===============================================
procedure start20;assembler;
label STR20;
asm
          //ПОДПРОГРАММА ПЕРЕДАЧИ КОДА НА ПРЕОБРАЗОВАНИЕ
          //ТЕМПЕРАТУРЫ
          LCALL TRESET
          JNC STR20
          MOV A,#0CCH
          LCALL TOUCHBY
          MOV A,#44H
          LCALL TOUCHBY
          SETB C
STR20:    RET
end;
//===============================================
procedure Read20;assembler;
label RDR20;
asm
          //ПОДПРОГРАММА СЧИТЫВАНИЯ ТЕМПЕРАТУРЫ
          MOV R2,#0
          MOV R3,#0
          LCALL TRESET
          JNC RDR20
          MOV A,#0CCH
          LCALL TOUCHBY
          //MOV A,#44H
          //LCALL TOUCHBY
          MOV A,#0BEH
          LCALL TOUCHBY

          MOV A,#0FFH
          LCALL TOUCHBY
          MOV R2,A
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV R3,A
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV R4,A
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV A,#0FFH
          LCALL TOUCHBY
          //MOV R4,A
          MOV A,#0FFH
          LCALL TOUCHBY
          //MOV R5,A
          SETB C
          MOV F0,C
          LCALL FOR18B20
RDR20:    RET
end;
//===============================================
end.

DS1820-24

unit ds1820_24;
{$O-}
{$xdata}
{$idata}
interface

procedure start20;
procedure Read20;
procedure RT;
implementation
uses ports,declare;
//===============================================
procedure TReset;assembler;
label treset0,waitl1,wh1,hl1,short1;
asm
          //ПОДПРОГРАММА СБРОСА МИКРОСХЕМЫ
          CLR DATA20
          MOV B,#240
TRESET0:  NOP
          NOP
          DJNZ B,TRESET0
          SETB DATA20
          MOV B,#240
          CLR C
WAITL1:   JB DATA20,WH1
          DJNZ B,WAITL1
          sjmp SHORT1
WH1:      MOV B,#240
HL1:      ORL C,/DATA20
          DJNZ B,HL1
SHORT1:  
end;
//===============================================
procedure Touchby1;assembler;
label tb10;
asm
          //ПОДПРОГРАММА ОБМЕНА БИТОМ
          CLR EA
          CLR DATA20
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          MOV DATA20,C
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          MOV C,DATA20
          SETB EA
          PUSH B
          MOV B,#40
TB10:     DJNZ B,TB10
          POP B
          SETB DATA20
end;

//===============================================
procedure TouchBy;assembler;
label b_loop1;
asm
          //ПОДПРОГРАММА ОБМЕНА БАЙТОМ
          PUSH B
          MOV B,#8
B_LOOP1:  RRC A
          LCALL TOUCHBY1
          DJNZ B,B_LOOP1
          RRC A
          POP B
end;
//===============================================
procedure For18b20;assembler;
label FOR18B200,FOR18B20R;
asm
          MOV A,R4
          JB ACC.7,FOR18B20R
          MOV R0,#3
FOR18B200:
          CLR C
          MOV A,R3
          RRC A
          MOV R3,A
          MOV A,R2
          RRC A
          MOV R2,A
          DJNZ R0,FOR18B200
FOR18B20R:MOV C,varbit
end;
//===============================================
procedure start20;assembler;
label STR20;
asm
          //ПОДПРОГРАММА ПЕРЕДАЧИ КОДА НА ПРЕОБРАЗОВАНИЕ
          //ТЕМПЕРАТУРЫ
          LCALL TRESET
          JNC STR20
          MOV A,#0CCH
          LCALL TOUCHBY
          MOV A,#44H
          LCALL TOUCHBY
          SETB C
STR20:   
end;
//===============================================
procedure Read20;assembler;
label RDR20;
asm
          //ПОДПРОГРАММА СЧИТЫВАНИЯ ТЕМПЕРАТУРЫ
          MOV R2,#0
          MOV R3,#0
          LCALL TRESET
          JNC RDR20
          MOV A,#0CCH
          LCALL TOUCHBY
          //MOV A,#44H
          //LCALL TOUCHBY
          MOV A,#0BEH
          LCALL TOUCHBY

          MOV A,#0FFH
          LCALL TOUCHBY
          MOV R2,A       //0
          MOV A,#0FFH
          LCALL TOUCHBY
          MOV R3,A       //1
          MOV A,#0FFH
          LCALL TOUCHBY  //2
          MOV A,#0FFH
          LCALL TOUCHBY  //3
          MOV A,#0FFH
          LCALL TOUCHBY  //4
          MOV R4,A
          MOV A,#0FFH
          LCALL TOUCHBY  //5
          MOV A,#0FFH
          LCALL TOUCHBY 
          //MOV R4,A       //6
          MOV A,#0FFH
          LCALL TOUCHBY
          //MOV R5,A       //7
          SETB C
          MOV varbit,C
          LCALL FOR18B20
RDR20:   
end;
//===============================================
procedure RT;
begin
bar2:=ar2;
bar3:=ar3;
if not cy then
  valr:=127
   else
    begin
     if bar3<>0 then
      begin
       asm
          MOV A,baR2
          CLR C
          SUBB A,#1
          CPL A               //ПРЕОБРАЗОВАНИЕ ДОПОЛНИТЕЛЬНОГО КОДА
          mov bar2,a
       end;
       valr:=bar2;
       valr:=-valr/2;
      end
       else
        begin
         valr:=bar2;
         valr:=valr/2;
        end;
   end;
temp0:=valr;
end;
//===============================================
end.

bottom of page