Requiere el programa maestro para programar el microcontrolador 52
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
sbit DQ = P3^5 //Definir puerto de comunicación DS18B20
sbit LED_EN_PORT = P2^5;
sbit DAC_ADC_EN_PORT = P3^7; /*define define la relación entre el carácter de visualización y la matriz digital correspondiente*/
Código de muestra sled_mun_to_char[ ] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* Definir el tubo digital que necesita ser iluminado*/
uchar código sled_bit_table[]={0xfe,0xfd,0xfb,0xf7} ;
p>datos de uchar sled_bit_table[4]={0xfe,0xfd,0xfb,0xf7};
datos de uchar[4]={0xff,0xff,0xff,0xff} ; /*Valor del área del búfer SLED 0-7
uchar data led_lighten_bit=0; /*Bit de indicador de iluminación LED 0-7**
//////// ///// ///// Siguiente controlador DS18B20///////////////////////////////////// /////////////////////////////////////////////////// /////////////////////////////////////////////////// ////////////
retraso void(unsigned int i)
{
while(i--); p>
}
//Función de inicialización
Init_DS18B20 (void)
{
unsigned char x=0;
DQ = 1; //Reinicio de DQ
retraso(8); //Retraso leve
DQ = 0 //El microcontrolador baja el DQ
delay(80); //Retraso preciso>480us<
DQ = 1; //Tira el bus alto
delay(14);
x=DQ; // Después de un ligero retraso, si x=0 la inicialización es exitosa, si x=1 la inicialización falla
delay(20 );
} p>
/ReadOneChar (void)
{
char unsigned i=0;
char dat unsigned = 0;
for (i=8;i>0;i--){
DQ = 0; // dar señal de pulso
dat>>=1;<
DQ = 1; // da señal de pulso
if(DQ) dat|=0x80;
retardo(4 );
} p>
return(dat);
}
//Escribe un byte
WriteOneChar( unsig
ned char dat)
{
char unsigned i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
retraso(5);
DQ = 1;
dat>>=1 ;
}
}
/ReadTemperature(void)
{
unsigned char a=0;
char sin signo b=0;
int sin signo t=0;
float tt=0
Init_DS18B20(); /p>
WriteOneChar(0xCC); // Saltar la lectura del número de columna del número de serie
WriteOneChar(0x44); // Iniciar la conversión de temperatura
Init_DS18B20() ; p>
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 registros de temperatura
a=ReadOneChar();
b=ReadOneChar();
t=b ;
t<<=8;
t=t|a;
tt=t*0.0625 //Fusiona las temperaturas altas y bajas
>tt=t fusión de orden inferior
t= tt*10.5; // redondea el resultado a 4
return(t);
}
/////////////////// Lo anterior es el controlador DS18B20////////////// ///
//*1MS se utiliza para el programa de retraso*/
void delay_1ms(uchar x)
{
uchar j;
p>while(x--){
for(j=0;j<125;j++)
{;}
}
}
main()
{
uint temp_buff;
uchar i ;
LED_EN_PORT = 0; /* Apagar la pantalla LED*/
DAC_ADC_EN_PORT = 0 /* Apagar todos los canales que el tubo digital cree que están abiertos*/
while( 1)
{
temp_buff=ReadTemperature() /* Leer la temperatura actual*/
sled_data[ 1] = sled_mun_to_char[temp_buff/100];
sled_data[2] = sled_mun_to_char[temp_buff%100/10];
sled_data[3] = sled_mun_too_char[temp_buff%10] ;
for( i=0;i<4;i++)
{
sled_wm_port = 0xff /* Apagar pantalla**
_Nop();
_Nop();
_Nop()
_Nop(); > sled_dm_port = sled_data[i]; /*Salir datos del segmento al digitalizador*
if (i==2) sled_dm_port = sled_dm_port&0x7f; sled_wm_port = sled_bit_table[i]; /*A datos del código de bits de salida del tubo digital*/
delay_1ms(2);
}
}
}
Este programa pasó la depuración
.