El papel basado en el termómetro digital DS18B20 necesita que las luces LED estén encendidas y al menos 4 tubos digitales escritos en lenguaje C. Al menos el software puede mostrarlo. Gracias.
//WDTDIS: deshabilitar el temporizador de vigilancia
//LVPDIS: programación de bajo voltaje deshabilitada
//HS: alto -speed crystal /Resonator
//PWRTDIS: Desactivar el temporizador de encendido
//BORDIS: Desactivar el reinicio de apagado
Bit volátil estático dat @( sin firmar )PORTC * 8 2;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
const uint8 disp[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x 90}; //* * *Tabla de códigos de segmento de tubo digital Yang
temperatura volátil uint8 _ data _ int//La parte entera de la temperatura
temperatura flotante volátil _ data _ fla//La parte decimal de la temperatura
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void ShowTemper(void); //Mostrar temperatura
void Get _ temper(void); //Obtener datos de temperatura
void Reset _ ds 18b 20(void); //Restablecer DS18B20
uint 8 Read _ Temp _ Data(void);
void retraso us(uint 8 retraso);//Retraso sutil
void retraso ms(uint 16 retraso);//Retraso de milisegundos
void Write _ 18b 20 _ Comd( uint 8 Comd); //Escribir comando DS18B20
pantalla nula (uint8 chosebit, uint 8 datos); //Pantalla de tubo digital único de 8 bits
/ ****** ********************************************** ******* *************************
*Nombre de función: DelayUS(retraso uint8) p>
*Función: Retraso de microsegundos de 20MHZ.
*Parámetro de entrada: Retraso
*Retorno: Ninguno
********************* ** ************************************************* *** *********/
Retraso no válido (retraso uint8)
{
while(-delay);
}
/*************************************** ***** ****************************************
*Nombre de la función: delaymas (retardo uint16)
*Función: retardo de milisegundos de 20 MHZ.
*Parámetro de entrada: Retraso
*Retorno: Ninguno
******************** ** ************************************************* *** *********/
Retraso no válido (retraso uint16)
{
uint 16 I;
for (;retraso gt0;retraso-)
for(I = 0;ilt453;i);
}
/***** ** ************************************************* *** **********************
*Nombre de función: visualización (uint8chosebit, uint8data)
*Función : Pantalla de tubo de número único
* Parámetros de entrada: bit de selección de bit, fuente de datos.
*Devoluciones: Ninguna
********************************* ************************************************* */ p>
Pantalla vacía (bit de selección uint8, datos uint8)
{
adcon 1 = 0x8E //Establece PORTA0 como entrada analógica y las demás; como puertos IO.
TRISA amp= 0xc 1;
TRISD=0x00 //Línea de datos configurada como salida.
PORTA = 0xFF
PORTA amp= ~(0x 02 lt; ltchose bit);
PORTD = datos; p>Drayus(200); //Retraso
PORTD = 0xFF //Apaga la pantalla
}
/******* * ************************************************** *********************
*Nombre de función: Reset_DS18B20(void)
*Función: Restablecer DS18B20.
*Parámetros de entrada: Ninguno
*Devolución: Ninguno
********************* ************************************************** * *********/
Reset_DS18B20 no válido (obsoleto)
{
uint8 flag = 0 //Restablecer indicador
while(1)
{
dat = 0; //La línea de datos se establece en 0
Drayus(250); p>
Drayus(250); //Retraso 500us
dat = 1; //La línea de datos se establece en 1.
Drayus(60); //Retraso 60us
tris C2 = 1;
While(dat == 0) //Si la línea de datos es 0
{
Drayus(240); //Retraso 240us
If(dat) //Si la línea de datos es 1
{
flag = 1; //Restablecer correctamente, establecer indicador de éxito.
Break; //Saltar de la declaración while(dat==0).
}
Otro
Romper
}
si (bandera)
{//Si el reinicio es exitoso,
Drayus(240);
Drayus(240);//Retraso 480us
Pausa //Saltar; de toda la declaración while(1).
}
tris C2 = 0
}
}
/******; ************************************************** * **********************
*Nombre de función: escribir _ 18b 20 _ comd(uint 8 comd)
*Función: comando de escritura DS18B20
*Parámetro de entrada: comando comd
*Retorno: Ninguno
*********** * ************************************************* ** *****************/
void Write _ 18b 20 _ Comd(uint 8 Comd)
{
uint8 i, temp
tris C2 = 0;
for(I = 0;ilt8;I) //Recorre un byte 8 veces.
{
temp = comd amp0x 01; //Lee el bit inferior de la instrucción
comd gt gt= 1 //Desplaza los datos de la instrucción hacia la derecha; por un poco.
dat = 0; //línea de datos establecida en 0
drayos(4); //retraso 8us
if (temperatura == 0 ) p>
{
dat = 0
}
Otro
{
dat = 1;
}
Drayus(60); //Retraso 40us
dat = 1; //La línea de datos está configurada en 1.
}
}
/*************************** ************************************************** * **
*Nombre de la función: Leer datos temporales (nulo)
*Función: Leer los datos de muestreo de temperatura de DS18B20.
*Parámetro de entrada: Ninguno
*Retorno: Datos leídos.
********************************************* *** *************************************/
uint8 lee temporalmente datos ( void)
{
uint8 i, datos
tris C2 = 0
for(I = 0; i lt8; I ) //Leer un byte 8 veces.
{
Datos gt gt= 1; //Los datos se mueven un bit hacia la derecha.
dat = 0; // Línea de datos establecida en 0
Drayus(2); //Retraso 2us
dat = 1; se establece en 1.
Drayus(8); //Retraso 8us
tris C2 = 1;
Drayus(8); //Retraso 8us
If(dat) //Si los datos leídos son 1
data | = 0x80 //La posición más alta de los datos es 1
Drayus (40 );
tris C2 = 0;
}
Return (data); //Devuelve los datos leídos.
}
/************************************ **********************************************
*Nombre de la función: Obtener _ temple(void)
*Función: Leer datos de temperatura.
*Parámetros de entrada: Ninguno
*Devolución: Ninguno
********************* ************************************************** * *********/
void Get_temper(void)
{
uint8 temp, temp 1;
write _ 18b 20 _ Comd(0x cc); //Escribe la instrucción de omisión de ROM
write _ 18b 20 _ Comd(0x 44); //Escribe la instrucción de conversión de temperatura
dat = 1; //La línea de datos se establece en 1.
Drayus(200);
Drayus(200);
reset _ ds 18b 20() //Llamar a la función de reinicio de inicialización
write _ 18b 20 _ Comd(0x cc);
write _ 18b 20 _ Comd(0x be); //Escribe y lee instrucciones
temp = Read_Temp_Data(). //Leer la temperatura de almacenamiento baja.
temp amp0x0f//Toma la parte decimal y guárdala en temp_data_Fla.
temp gt gt= 4; //Obtiene el mordisco alto del byte bajo
temp1 = Read_Temp_Data(). //Los bits altos leídos se almacenan en temp1.
temp 1 lt; lt= 4; //Obtener el mordisco bajo del byte alto
temp _ data _ int = temp 1 | el byte alto O temp_data_int
Tempering_data_fla = Tempering_data_Fla * 100/16 //Toma la parte decimal y guárdala en temp1.
}
/************************************ **********************************************
*Nombre de la función: mostrar templo(vacío)
*Función: Muestra la temperatura detectada.
*Parámetros de entrada: Ninguno
*Devolución: Ninguno
********************* ************************************************** * *********/
Estado de visualización no válido (no válido)
{
Pantalla(0, disp[temple_data_int/ 10]) ;
disp[temple_data_int 10] amp;0x7F);
Disp[(uint 8)tempent_data_Fla/10]
Disp(2); 3, disp[(uint 8)tempent _ data _ Fla 10]
}
/****** *********** **************************************** ********** **************
*Número de letras: main()
*Función: detección en tiempo real y visualización de la temperatura ambiente.
*Parámetros de entrada: Ninguno
*Devolución: Ninguno
********************* ************************************************** * *********/
void main()
{
tris C2 = 0;
mientras ( 1)
{
reset _ ds 18b 20(); //Restablecer DS18B20
get _ temple() //Obtener el valor de temperatura< /p >
mostrar templo(); //Mostrar temperatura
}
}