¿Puede escribir un programa en lenguaje C que utilice el microcontrolador at89c52 y requiera el uso de una pantalla LCD 1602 para mostrar la programación actual de hora y temperatura?
#include?
#include?
#include?"LCD1602.h"
#include?"DS1302.h"
sbit?DQ=P3^0;//ds18b20?Port
unsigned?int?ReadTemperature(void);
bit?Init_DS18B20(void);
unsigned?char?ReadOneChar(void);
void?WriteOneChar(unsigned?char?dat);
void?DelayUs2x(unsigned?char);
void?Delay1ms(unsigned?int);
/*--------------- -------------------------------- Nombre: sensor de temperatura 18B20 Sitio web: www.doflye.net Escrito por: shifang Fecha: Modificación 2009.5: Sin contenido: Programa de muestra de aplicación para la detección de temperatura de una sola línea 18B20
--------------------- ----- ------------------*/
/***-- ---------- --------------------------
Inicialización 18b20
------- ----------------------------------------- ---------*/
bit?Init_DS18B20(void)
{ bit?dat=0; DQ?=?1;//DQ reset DelayUs2x( 5);//Retraso leve DQ?=?0;?// El microcontrolador baja el DQ DelayUs2x(200);?//¿Retraso preciso mayor que?480us? Menos de 960us DelayUs2x(200); ;//Sube el bus DelayUs2x(50);?//15~60us ?Después?Recibir el pulso de existencia de 60-240us dat=DQ;//Si x=0, la inicialización es exitosa,?x=1, la inicialización falla DelayUs2x(25);?//Regreso después de un ligero retraso return?dat; p>
}
void?DelayUs2x(unsigned?char?t)
{ mientras(--t);
}
/*----------------------- ------------------------- ---
Leer un byte
----- ----------------------------------------*/ p>
unsigned?char?ReadOneChar(void)
{
unsigned?char?i=0;
unsigned?char?dat?= ?0;
for?(i=8;i>0;i--) { DQ?=?0;?//?Dar señal de pulso dat>>=1; ;?//?Dar señal de pulso if(DQ)
dat|=0x80; DelayUs2x( } return(dat);
}
/*----------------------------------------------------- --- ---
Escribir un byte
--------------------------- - ---------------------*/
void?WriteOneChar(unsigned?char?dat)
{ unsigned? char ?i=0; para?(i=8;?i>0;?i--) { DQ?=?0; DQ?=?dat&0x01; = 1; }
DelayUs2x(25);
}
/*----------------- - -------------------------------
Leer temperatura
-- -------------------------------------------------* /
unsigned?int?ReadTemperature(void)
{
unsigned?char?a=0;
unsigned?int? b=0;
unsigned?int?t=0;
Init_DS18B20();
WriteOneChar(0xCC);?//?Omitir la operación de leyendo el número de columna del número de serie
WriteOneChar(0x44);?//?Iniciar conversión de temperatura
Delay1ms(10);
Init_DS18B20(); p>
WriteOneChar (0xCC);?//¿Omitir la operación de lectura del número de serie?
WriteOneChar(0xBE);?//Leer el registro de temperatura, etc. (***9 registros ¿Se puede leer)? Los dos primeros es la temperatura
a=ReadOneChar();//bit bajo
b=ReadOneChar();//bit alto
b<<=8;
t=a+b;
return(t);
}
¿nulo? Retraso1ms(unsigned?int?count)
{
unsigned?int?i,j;
for(i=0;i for(j= 0;j<120;j++); } main() { SYSTEMTIME?CurrentTime; int?temp; float?temperatura; unsigned?char?dist[4]; LCD_Initial(); Inicial_DS1302(); Init_DS18B20(); GotoXY(14,0); Imprimir ("."); GotoXY(15,1); Imprimir("C"); while(1) { DS1302_GetTime (&CurrentTime); TimeToStr(&CurrentTime); DateToStr(&CurrentTime); GotoXY(0, 0);Pri nt("20"); GotoXY(2,0); Print(CurrentTime.DateString); GotoXY(0,1); Imprimir(CurrentTime.TimeString); temp=ReadTemperature(); temperatura=(float)temp*0.0625; sprintf (dist,"%4f",temperatura); GotoXY(9,1); Imprimir(dist); Retraso1ms(400); } }