Necesitamos urgentemente un programa en lenguaje C para microcontrolador, con sensor de temperatura ds18b20, tubo digital para mostrar temperatura, usando microcontrolador 89c52, con diagrama de circuito adjunto, ¡gracias!
#includelt;reg52.hgt;?
#define?uchar?unsigned?char?
#define?uint?unsigned?int?
sbit?DQ=P1^4;?
#define?uint?
unsigned?char?code?str[]={0x3f, 0x06, 0x5b, 0x4f , 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x40}?;?//***Tabla de códigos de palabras de tubería digital negativa
unsigned?char?code?str1[]={0x0bf , 0x86, 0x0db, 0x0cf, 0x0e6, 0x0ed, 0x0fd, 0x87, 0x0ff, 0x0ef};?// Tabla de codificación de caracteres decimales de un solo dígito
unsigned?char?code?wei[]={0x0fe, 0x0fd, 0x0fb, 0x0f7};?
uchar?data?disdata[5];?
uint?tvalue; //valor de temperatura?
uchar?tflag; //temperatura positiva o negativa ¿bandera?
/**********programa ds1820************/?
void?delay_18B20(unsigned?int ?i)?// ¿Retraso de 1 microsegundo? {? while(i--);? }
void?ds1820rst() /* ds1820 reset*/? ¿sin firmar? 0; //¿Desplegable DQ? delay_18B20(100);? DQ?=?1 //DQ pull-up? delay_18B20(40); } ??
uchar?ds1820rd() /*Leer datos*/? {?
unsigned?
unsigned char dat= 0 ;?
for(i=8;igt;0;i--)
{
DQ?//Da una señal de pulso
datgt;gt;=1;
DQ?=?1 ?
datgt;gt;=1;
DQ?
p>if(DQ)?
delay_18B20(10); ?
}? return(dat}?
void? sin firmar para?(i=8;?igt;0;?i--)
{
DQ?
DQ?=?wdataamp;0x01 ?
delay_18B20(10); ?
DQ?=?1 ?
wdatagt;gt;=1;
} }?
read_temp() /* Leer el valor de temperatura y convertir */? { uchar?a, b;? ds1820rst();?
xcc);?//?Omitir lectura del número de serie ds1820wr(0x44);?//?¿Iniciar conversión de temperatura? ds1820rst();? ds1820wr(0xcc);? ds1820wr(0xcc);? ¿Omitir la lectura del número de serie? ds1820wr(0xbe);?//?Leer temperatura a=ds1820rd();? b=ds1820rd();? tvalue=b;? tvaluelt;=8;? tvalue=tvalue|a; > if(tvaluelt; 0x0fff)
tflag=0;
else
{
tvalue=~tvalue 2;?tflag = 1;?//¿Temperatura negativa?
} tvalue=tvalue*(0.625);?//El valor de temperatura se expande 10 veces, con una precisión de 1 decimal return(tvalue }
/**** * ******************************/
void?ds1820disp() // Visualización del valor de temperatura { uchar? i ; disdata[0]=tvalue/1000;?//Cientos de dígitos disdata[1]=tvalue1000/100;?//Decenas de dígitos? disdata[2]=tvalue100/10; // Número de decimales disdata[3]=tvalue10; // Número de decimales if(tflag==0)
{
if( disdata[0]==0x00)
?{
? disdata[0]=0; //¿No mostrar el dígito 0 de las decenas
? if( disdata[1]==0x00)?//No mostrar decenas de dígitos 0
?}
} else ?// ¿Temperatura negativa?
{
disdata[0]=0x0b;//Cientos de temperaturas negativas muestran un signo negativo: -
if(disdata[1]== 0x00 )?disdata[1]=0; //El dígito 0 de las decenas no se muestra
} for(i=0;ilt;150;i)
{
P2=wei[0];
P0=str[disdata[3]];
delay_18B20(20)
P2=wei [1 ];
P0=str1[disdata[2]];
retraso_18B20(20);
P2=wei[2]; >
P0=str[disdata[1]];
delay_18B20(20);
P2=wei[3];
P0=str [disdata [0]];
delay_18B20(20);
} }
/************ Programa principal ** ********
void?main() { ds1820rst() ?//inicializar visualización while(1)
{
read_temp (); //leer temperatura
ds1820disp(); //mostrar
} }?