Utilice el microcontrolador 8051 para la adquisición y visualización de la temperatura (tubo digital LED). Cómo escribirlo en lenguaje C.
Dame una rutina
#include
#include #include "18b20.h" #include "1602.h" #include "delay.h" bit ReadTempFlag; //Definir marca de tiempo de lectura void Init_Timer0(void); //Inicialización del temporizador /*--------------- ---------------------------------- Inicialización de comunicación serie -- ------------------------------------------------------ -----*/ p> void UART_Init(void) { SCON = 0x50 // SCON: Modo 1, UART de 8 bits, habilitar recepción TMOD |= 0x20; // TMOD: temporizador 1, modo 2, reinstalación de 8 bits TH1 = 0xFD; // TH1: valor de reinstalación del oscilador de cristal de velocidad de 9600 baudios 11.0592MHz TR1 = 1; // TR1: temporizador 1 activado //EA = 1 //Activar interrupción total //ES = 1; //Activar interrupción del puerto serie TI=1; } /*------------- --------- -------------------------- Función principal -------- ----------------------------------------* / void main (void) { int temp; temperatura de flotación; char displaytemp [16];//definir el área de visualización Matriz de almacenamiento temporal LCD_Init(); //Inicializar LCD DelayMs(20); //El retraso ayuda a la estabilidad LCD_Clear(); / /Borrar pantalla Init_Timer0(); UART_Init(); Lcd_User_Chr() //Escribir caracteres personalizados LCD_Write_String(0,0," www.doflye.net "); LCD_Write_Char(13,1,0x01);//Escribe la temperatura en el punto de la esquina superior derecha LCD_Write_Char(14, 1,'C'); //Escribe el carácter C while (1) // Bucle principal { si(ReadTempFlag==1) { ReadTempFlag=0; temp=ReadTemperature(); temperatura=(float)temp*0.0625; sprintf(displaytemp,"Temp % 7.3f",temperature);//Imprimir el valor de temperatura LCD_Write_String(0,1,displaytemp);//Mostrar la segunda línea } } } /*------------------------ - ----------------------- Subrutina de inicialización del temporizador -------- - ---------------------------------------*/ void Init_Timer0 (void) { TMOD |= 0x01; //Usa el modo 1, temporizador de 16 bits, el uso del símbolo "|" no puede verse afectado cuando se usan múltiples temporizadores Impacto //TH0=0x00; //Valor inicial dado //TL0=0x00; EA=1; //La interrupción total está activada ET0=1; //La interrupción del temporizador está activada TR0=1; //El interruptor del temporizador está activado } / * ---------------------------------------- p> Interrupción del temporizador subrutina --------------------------------- --------- ------*/ void Timer0_isr(void) interrupción 1 { static unsigned int num ; TH0 =(65536-2000)/256; //Reasignar 2ms TL0=(65536-2000)%256; num++; if(num= =300) // { num=0; ReadTempFlag=1; //Leer la posición del indicador 1 } } /*------------------------ ---------- ------------- Nombre: LCD1602 Foro: www.doflye.net Escrito por: shifang p> Fecha: 2009.5 Modificación: Ninguna Contenido: La definición de pin es la siguiente: 1- VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-NEGRO ------------- ------- ----------------------*/ #include "1602.h " #include "delay.h" sbit RS = P2^4; //Definir puerto sbit RW = P2^5; sbit EN = P2 ^6;< /p> #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW= 1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /*--- ------------------------------------------------ p> Función de evaluación de ocupado ----------------------------------- ------ -*/ bit LCD_Check_Busy(void) { DataPort= 0xFF <; /p> RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; retorno (bit )(DataPort & 0x80); } /*-------------------- ------ ----------------------- Función de comando de escritura ---- ------ -------------------------------------------- ---*/ void LCD_Write_Com( unsigned char com) { // while(LCD_Check_Busy()); //Espera si está ocupado p> DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= _nop_(); EN_CLR; } /*-------------- ------------------ ------------------ Función de escritura de datos -------------- --------------------------------- -*/ void LCD_Write_Data(unsigned char Data) { // while(LCD_Check_Busy() //Espera si está ocupado DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort=Datos; _nop_(); EN_CLR; } /*----------------- ----------------- --------------- Función de borrar pantalla - ----------------- -----------------------*/ p> void LCD_Clear(void) { LCD_Write_Com(0x01 DelayMs(5); } < /p> /*------------------------------------------ --- ------ Función de escritura de cadena ------------------------ -----------------------*/ void LCD_Write_String(carácter x sin firmar, carbón y sin firmar, carbón sin firmar *s) p> { if (y == 0) { LCD_Write_Com(0x80 + x); //Indica la primera línea p> } else { LCD_Write_Com(0xC0 + x); //Indica la segunda línea } mientras (*s) { LCD_Write_Data( *s) s ++; > } } /*------------------------------- --- ------------------ Función de escritura de caracteres ------------ --- ----------------------------------*/ void LCD_Write_Char(sin firmar char x,char sin firmar y,char sin firmar Datos) { if (y == 0) { LCD_Write_Com( 0x80 + x) ; } más { LCD_Write_Com(0xC0 + x ); } LCD_Write_Data( Datos } /*--------------------); ---- --------------------- Función de inicialización --------- -----------------------------------------------*/ void LCD_Init( void) { LCD_Write_Com(0x38); /*Configuración del modo de visualización*/ DelayMs(5) LCD_Write_Com( 0x38); RetrasoMs(5); LCD_Write_Com(0x38); RetrasoMs(5); /p> LCD_Write_Com(0x38) LCD_Write_Com(0x08); /*pantalla apagada*/ LCD_Write_Com(0x01); > LCD_Write_Com(0x06); /*Mostrar configuración de movimiento del cursor*/ DelayM s(5); LCD_Write_Com(0x0C); /*Visualización activada y configuración del cursor*/ } /*------- ----------------------------------------- Configuración Dos caracteres personalizados La dirección de los caracteres personalizados en LCD1602 es 0x00--0x07. Puede definir 8 caracteres Aquí configuramos un carácter personalizado en Posición. 0x00 (000), El otro se coloca en la posición 0x01 (001) -------------------- - ---------------------*/ void Lcd_User_Chr(void) { / /El primer carácter personalizado LCD_Write_Com(0x40); //"01 000 000" Dirección de la línea 1 (¿D7D6 es el formulario de comando de configuración de dirección? D5D4D3 es la ubicación de almacenamiento de caracteres (0--7), D2D1D0 es la dirección de la fila de caracteres (0--7)) LCD_Write_Data(0x00); //"XXX 11111" Primera fila de datos (D7D6D5 es XXX, expresado como cualquier número (generalmente 000), D4D3D2D1D0 es datos de línea de caracteres (1 activado, 0 desactivado) LCD_Write_Com(0x41); //"01 000 001" dirección de línea 2 LCD_Write_Data(0x04); 10001" Datos de la línea 2 LCD_Write_Com(0x42); //"01 000 010" Dirección de la línea 3 LCD_Write_Data(0x0e); //"XXX 10101 " Datos de la línea 3 p> LCD_Write_Com(0x43); //"01 000 011" Dirección de la línea 4 LCD_Write_Data(0x0e); //"XXX 10001" Datos de la línea 4 LCD_Write_Com( 0x44); //"01 000 100" dirección de la quinta línea LCD_Write_Data(0x0e); //"XXX 11111" datos de la quinta línea LCD_Write_Com(0x45); 000 101" Dirección de la sexta línea LCD_Write_Data(0x1f); //"XXX 01010" Datos de la sexta línea LCD_Write_Com(0x46); //"01 000 110" Dirección de la séptima línea LCD_Write_Data(0x04); //"XXX 11111" datos de la séptima línea LCD_Write_Com(0x47); //" 01 000 111" dirección de la octava línea LCD_Write_Data (0x00); //"XXX 00000" datos de la octava línea //Segundo carácter personalizado LCD_Write_Com(0x48); //"01 001 000" dirección de la línea 1 LCD_Write_Data(0x03); //"XXX 00001" datos de la línea 1 LCD_Write_Com(0x49); //"01 001 001" dirección de la segunda línea LCD_Write_Data(0x03); ); //"XXX 11011" datos de la segunda línea LCD_Write_Com(0x4a); /"01 001 010" Dirección de la tercera línea LCD_Write_Data(0x00); //"XXX 11101" Datos de la tercera línea LCD_Write_Com(0x4b); //"01 001 011 " Línea 4 dirección LCD_Write_Data(0x00); //"XXX 11001" Datos de la línea 4 LCD_Write_Com(0x4c); //"01 001 100" Dirección de la línea 5 LCD_Write_Data(0x00); //"XXX 11101" datos de la línea 5 LCD_Write_Com(0x4d); //"01 001 101" dirección de la línea 6 LCD_Write_Data(0x00); //"XXX 11011" línea 6 datos LCD_Write_Com(0x4e); //"01 001 110" línea 7 dirección LCD_Write_Data(0x00 ); 7 datos LCD_Write_Com(0x4f); //"01 001 111" dirección de línea 8 LCD_Write_Data(0x00); //" XXX 00000" datos de línea 8 } #include "delay.h" #include "18b20.h" /*---------- -------------------------------------- Inicialización 18b20 ---------------------------------- ------------ --*/ bit Init_DS18B20(void) { bit dat=0; p> DQ = 1; reset DelayUs2x(5); //Ligero retraso DQ = 0; //MCU baja el DQ DelayUs2x(200); el retraso es mayor que 480us y menor que 960us DelayUs2x(200); DQ = 1; // Tire del autobús alto p> DelayUs2x(50); //Recibimos un pulso de presencia de 60-240us después de 15~60us dat=DQ; //Si x=0, la inicialización es exitosa, si x=1, la inicialización falla DelayUs2x(25); //Regreso con un ligero retraso return dat; } /*---- - ---------------------------------------------- Leer un byte ------------------------------------- --*/ carácter sin firmar ReadOneChar(void) { carácter sin firmar i=0; dat de carácter sin firmar = 0; for (i=8;i>0;i--) { DQ = 0; //Da señal de pulso dat>>=1; DQ = 1; //Da señal de pulso if(DQ) dat|=0x80; DelayUs2x(25) ; } return(dat); } /*------------ ------------------------------------ Escribe un byte --------------------------------------------- ---*/ void WriteOneChar(unsigned char dat) { unsigned char i=0; para (i =8; i>0; i--) { DQ = 0; DQ = dat&0x01; DelayUs2x( 25); DQ = 1; dat>>=1; } DelayUs2x(25); } /*------------------------------------ ------------ Leer temperatura --------------------- - -------------------------*/ unsigned int ReadTemperature(void) { p> unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); p> WriteOneChar(0xCC); // Saltar lectura del número de serie WriteOneChar(0x44); // Iniciar conversión de temperatura DelayMs(10) ; Init_DS18B20(); WriteOneChar(0xCC); //Omitir la operación de lectura del número de serie WriteOneChar(0xBE); //Leer registros de temperatura, etc. ***9 registros legibles) Los dos primeros son temperatura a=ReadOneChar(); //bits bajos b=ReadOneChar() //bits altos b<<=8; t=a+b; retorno(t); }