Saturday, December 23, 2023

PIC16F887 LM35 and LCD Interfacing Example Using XC8

LM35 is an analog temperature sensor that can convert environment temperature between -55 to 150 degree Celsius. It need a stable DC supply voltage between 4 and 30V. It generates a linear analog output voltage that's 10mV per degree Celsius. We can interpret this analog signal with an ICL7107 analog to BCD seven-segment display converter, or even a micro-controller's analog to digital converter (ADC).

PIC16F887 LM35 and LCD Interfacing Example Using XC8
On-board LM35 16x2 LCD and PIC16F887 micro-controller

Using a micro-controller with ADC module is common we can select any output display type, a seven segment display or character or graphical LCD. In this example I use a PIC16F887 micro-controller and a 16x4 character LCD from Tinsharp.

I use the internal ADC module of PIC16F887. It has 10-bit resolution. Its voltage reference pins are wired internally by software to GND and VDD (+5VDC). LM35 connects to RA5(AN4) pin of PIC16F887.

The LCD operates in 4-bit data transfer mode. I connect the on-board LCD as follow,

  • RS -> RB5
  • RW-> RB6
  • EN -> RB7
  • DB4...DB7 -> RD0...RD3

PORTB has an alternative analog inputs function. So we have to clear ANSELH SFR first.

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on December 22, 2023, 2:59 PM
  6.  */
  7.  
  8.  
  9. #include <xc.h>
  10. #include "config.h"
  11.  
  12. #define _XTAL_FREQ 8000000UL
  13.  
  14. #include "lcd.h"
  15. #include <stdio.h>
  16.  
  17. void main(void) {
  18. /*8MHz Internal OSC*/
  19. OSCCONbits.IRCF=7;
  20. /*Internal ADC FOSC*/
  21. ADCON0bits.ADCS=3;
  22. /*Select AN4*/
  23. ADCON0bits.CHS=4;
  24. __delay_ms(10);
  25. /*Turn On ADC*/
  26. ADCON0bits.ADON=1;
  27. /*Right Justify*/
  28. ADCON1bits.ADFM=1;
  29. /*VDD and VSS VFRE*/
  30. ADCON1bits.VCFG1=0;
  31. ADCON1bits.VCFG0=0;
  32.  
  33. lcdInit();
  34. PORTA=0;
  35. TRISA5=1;
  36. lcdString("Temperature:");
  37. double temp=0;
  38. char message[16];
  39. lcdCommand(0x0C);
  40. __delay_ms(1000);
  41. while(1){
  42. ADCON0bits.GO=1;
  43. while(ADCON0bits.GO==0);
  44. temp=((ADRESH<<8)+ADRESL);
  45. temp=100*(5.0*temp/1023);
  46. sprintf(message,"%3.2f%cC ",temp,223);
  47. lcdXY(1,2); lcdString(message);
  48. lcdXY(1,3); lcdString("On-Board LM35DZ");
  49. lcdXY(1,4); lcdString("Connects To RA5");
  50. __delay_ms(250);
  51. }
  52. return;
  53. }
  54.   

I use MPLABX IDE v6.15 and XC8 C compiler v2.36 free edition without code optimization. So it requires a lot of program memory space up to 91% due to C floating point and sprintf function usage.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
MPLABX IDE v6.15 and XC8 v2.36 free edition resource usage

Proteus is popular for most of electronics hobbyist here but we have to pay for license.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
Proteus Simulation

Click here to download its source file.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
PIC16F887 Prototyping Board



No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)