Buscando un programa en lenguaje ensamblador de microcontrolador para un diseño simple de controlador de temperatura
// Programa de control del sistema de control de temperatura
// Sensor de temperatura: DS18B20
// Modo de visualización:
#include?< reg51.h>
#define?uchar?unsigned?char
sbit?keyup=P1^0;
sbit?keydn=P1^1;
sbit?keymd=P1^2;
sbit?out=P3^7;//Conectar al relé de control
sbit?DQ?=?P3 ^ 4; //Conectar al sensor de temperatura 18B20
uchar?t[2],number=0,*pt; //Valor de temperatura
uchar?TempBuffer1[4]={ 0 ,0,0,0};
uchar?Tmax=18,Tmin=8;
uchar?distab[]={0xc0,0xf9 ,0xa4,0xb0,0x99, 0x92 ,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};
uchar?dismod=0,xiaodou1=0,xiaodou2=0 , actualtemp ;
bit?
{
TH0=(65536-5000)/256;
TL0=(65536-5000) % 256;
switch(número)
{
case?P0=distab[TempBuffer1[0]];
?break ;
caso?1:
P2=0x04;
?P0=distab[TempBuffer1[1]];
?break
caso?2:
P2=0x02;
?P0=distab[TempBuffer1[2]]&0x7f;
? romper ;
caso?3:
P2=0x01;
?P0=distab[TempBuffer1[3]];
? romper ;
predeterminado:
romper;
}
número++;
if(número>3) número =0;
}
void?delay_18B20(unsigned?int?i)
{
while(i--)
}
/* *********función de inicialización ds18b20 ******************** * */
¿void?Init_DS18B20(void)?
{
?bit?x=0;
hacer{ p >
?DQ=1;
?delay_18B20(8);
?DQ?=?0;?//El microcontrolador baja el DQ
?delay_18B20(90);?//El retraso exacto es superior a 480us
?DQ?=?1;?//Detén el autobús
?delay_18B20(14) ;
?x=DQ;//¿después de un ligero retraso?Si x=0, ¿la inicialización es exitosa? x = 1, la inicialización falla, continúe con la inicialización <
/p>
}mientras(x);
?delay_18B20(20);
}
/******** * *ds18b20 Leer un byte***************/?
unsigned?char?ReadOneChar(void)
{
unsigned?char?i=0;
unsigned?char?dat?=?0;
para?(i=8;i>0;i-- ) p>
?{
?DQ?=?0;?//?Da una señal de pulso
?dat>>=1;
?DQ?=?1;?//?Da una señal de pulso
?if(DQ)
?dat|=0x80;
?delay_18B20( 4);
?}
? return(dat);
}
/****** *** ****ds18b20 Escribir bytes******************/?
void?WriteOneChar(unsigned?char?dat)
{ unsigned?char?i=0; para?(i=8;?i>0;?i--) { DQ?=?0; retraso_18B20(5); DQ?=?1;
dat>>=1;
}
}
/ ** **************Leer la temperatura actual de ds18b20************/
unsigned?char?*ReadTemperature(unsigned?char ? rs)
{
sin firmar?char?tt[2]; retraso_18B20(80);?
Init_DS18B20(); > WriteOneChar(0xCC);//Omitir la operación de lectura del número de columna del número de serie
WriteOneChar(0x44);?//Iniciar la conversión de temperatura delay_18B20(80);?
Init_DS18B20 ( );
WriteOneChar(0xCC);?//Omitir la operación de leer el número de columna del número de serie
WriteOneChar(0xBE);?//Leer el registro de temperatura, etc. (** *Se pueden leer 9 registros), los dos primeros son temperatura
tt[0]=ReadOneChar();?//Leer el bit bajo del valor de temperatura
tt[1]= ReadOneChar();?//Leer el bit alto del valor de temperatura
return(tt);
}
void?covert1 (void) //Convertir la temperatura Mostrar datos para LED
{
uchar?x=0x00,y=0x00;
t[0]=* pt;
pt++;
t[1]=*pt;
if(t[1]&0x080)?
{
TempBuffer1 [0]=0x0c; ?//c representa temperatura negativa
t[1]=~t[1] ?/* Las siguientes oraciones son el complemento de negativo; números*/
t[0]=~t[0]; ??/* Convertir a valor absoluto *********/
x=t[ 0]+1;
t[0]=x;
si(x==0x00)t[1]++;
} else?TempBuffer1[0]=0; //A es positivo t[1]<<=4 //El byte alto se desplaza 4 bits a la izquierda t[1]=t[1]&0xf0; x=t [0]; //Almacena temporalmente t[0] hasta los cuatro primeros de t[0] y=t[1]<<=0; //A para positivo else?p> y=t[1] ]|x; //Convierte los valores válidos del byte alto y del byte bajo. La parte entera se fusiona en un byte TempBuffer1[1]=(y%100)/10; [0]=t[0]&0x0f; //La parte decimal TempBuffer1 [3]=t[0]*10/16;
?//El siguiente segmento del programa elimina los errores de cálculo causados por false aleatorio detecciones y solo detecta que la temperatura excede el límite 12 veces seguidas Cambiar dispositivo de calefacción
if(currtemp>.Tmin)xiaodou1[3]=t[0]*10/16;
?Tmin)xiaodou1=0;
if(y { xiaodou1++; currtemp=y; xiaodou2=0; } if(xiaodou1>12) { out=0 ; flag=1; xiaodou1=0; } if(currtemp if(y>Tmax) { xiaodou2++; currtemp=y; xiaodou1=0; } if(xiaodou2> 12) { out=1; flag=0; xiaodou2=0; } out=flag; } void?convert(char? tmp) { uchar?a; if(tmp<0) { TempBuffer1[0 ]=0x0c; a=~tmp +1; } ¿otra cosa? { TempBuffer1[0] =0; a=tmp; } TempBuffer1[1]=(a%100)/10; TempBuffer1 [2]=(a%100)%10; }