Red de conocimiento informático - Conocimiento sistemático - Buscando un programa en lenguaje ensamblador de microcontrolador para un diseño simple de controlador de temperatura

Buscando un programa en lenguaje ensamblador de microcontrolador para un diseño simple de controlador de temperatura

Puedes probar este programa. Lo he hecho antes.

// 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{

?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-- )

?{

?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;

}