Friday, January 1, 2016

BÀI 24 : ĐO NHIỆT ĐỘ LM335 HIỂN THỊ LCD PIC16F877A XC8

1. Giới thiệu.
- Là cảm biến nhiệt độ cho ra các mức điện áp tương ứng với độ Kelvin
- Sai số +/- 1 độ C
- Hoạt động trong dải từ 400uA - 5 mA 
- Trở kháng nội < 1 Ω 
- Dải nhiệt độ đo được -55˚C đến 150˚C 
2 .Sơ đồ chân. 


ADJ - Chân hiệu chuẩn 
V+ - Chân cấp nguồn 5V 
V- - Chân GND 
Ảnh mô phỏng protues.
đo nhiệt độ lm335 hiển thị lcd pic16f877a xc8
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000 // ADC chon tan so thach anh = 4Mhz
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "lcd.h"
// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
void ADCinit (void); // ADC chon tan so thach anh = 4Mhz
unsigned int ReadADC (void);
unsigned int ADCvalue = 0;
float f;
unsigned int voltage;
void main(void)
{
  ADCinit();
  char s[20];
  TRISD = 0x00;
  TRISA0 = 1;
  Lcd_Init();
  while(1)
  {
    ADCvalue = ReadADC();
    voltage = (5000.0f / 1023) * ADCvalue;
    //f= 34765.46392/voltage - 4.793814433; //GP2D12 cam bien khoang cach
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("  Demo LM335");
    f = (voltage / 10) - 273;
    sprintf(s,"Temp is = %g ",f);
    Lcd_Set_Cursor(2,1);
    Lcd_Write_String(s);
    Lcd_Write_Char(223);// ky tu
    Lcd_Write_String("C");
  }
}
void ADCinit (void)// adc
{
    // chon tan so clock cho bo adc
    ADCON1bits.ADCS2 = 0, ADCON0bits.ADCS1 = 0,ADCON0bits.ADCS0 = 1;
    // chon kenh adc la kenh an0
    ADCON0bits.CHS2 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS0 = 0;
    // chon cach luu data
    ADCON1bits.ADFM = 1;
    // cau hinh cong vao
    ADCON1bits.PCFG3 = 1,  ADCON1bits.PCFG2 = 1,  ADCON1bits.PCFG1 = 1,  ADCON1bits.PCFG0 = 0;
    // cap nguon cho khoi adc
    ADCON0bits.ADON = 1;
}
unsigned int ReadADC (void)// doc len 7 doan
{
    unsigned int TempValue = 0;
    ADCON0bits.GO_nDONE = 1;
    while(ADCON0bits.GO_nDONE);
    TempValue = ADRESH*256 + ADRESL;
    return (TempValue);
}
Link download project. Click here

2 comments:

  1. cho em hỏi cái giá trị điện trở 1.5k là có tính toán gì để ra được số đó không ,nếu có tính như thế nào vậy anh, hay là có cách chọn trực tiếp từ điện áp nó luôn vậy, thanks !

    ReplyDelete
  2. - Dòng cấp cho LM335 là từ 400uA - 5mA.
    - Dùng nguồn 5V và điện áp trên LM335 thay đổi từ 2.73 - 3.73V, nên điện áp rơi trên điện trở từ 1.27(5V - 3.73V) - 2.27V(5V - 2.73V). Vậy nên chọn điện trở là 1,5k.
    - Chọn trở là 1,5k -> I = 0,85(1.27/1.5) -> 1.51mA (thõa yêu cầu).

    ReplyDelete