Home » » Mạch đo nhiệt độ ds18b20 - hiển thị LCD 16x2

Mạch đo nhiệt độ ds18b20 - hiển thị LCD 16x2

Written By Điện Tử ChipKool on June 23, 2020 | 3:55 PM



Chia sẻ đến các bạn File Mô phỏng + Code C chip Atmega 16 full. Do bạn CTV Dao Nguyen viết chia sẻ. 

Các bạn sinh viên có thể download về phát triển thêm ứng dụng:
- Mô phỏng Protues 8.6
- Code C Codevision AVR

#include <mega16.h>
#include <delay.h>
#include <stdio.h>

#define LCD_RS  PORTC.2    
#define LCD_RW  PORTC.1   
#define LCD_EN  PORTC.0       
#define LCD_D4  PORTB.4   
#define LCD_D5  PORTB.3  
#define LCD_D6  PORTB.2  
#define LCD_D7  PORTB.1  


#define SENSOR_DATA_IN     PINC.5
#define SENSOR_DATA_OUT    PORTC.5
#define SENSOR_DDR_DATA    DDRC.5

unsigned int nhietdo;
unsigned char mang[20];

//----------------------------Chuong trinh doc nhiet do -------  ---------//
unsigned char reset_ds18b20(){
    unsigned char result=1;
    SENSOR_DATA_OUT=1;
    SENSOR_DATA_OUT=0;
    delay_us(480);
    SENSOR_DATA_OUT=1;
    SENSOR_DDR_DATA=0;
    delay_us(70);
    result=SENSOR_DATA_IN;
    delay_us(400);
    SENSOR_DDR_DATA=1;
    return result;
}

void write_bit_ds18b20(unsigned char b){
    SENSOR_DATA_OUT=0;
    delay_us(6);
    SENSOR_DATA_OUT=b;
    delay_us(54);
    SENSOR_DATA_OUT=1;
    delay_us(10);
}

unsigned char read_bit_ds18b20(){
    unsigned char result;
    SENSOR_DATA_OUT=0;
    delay_us(6);
    SENSOR_DATA_OUT=1;
    SENSOR_DDR_DATA=0;
    delay_us(9);
    result=SENSOR_DATA_IN;
    delay_us(55);
    SENSOR_DDR_DATA=1;
    return result;
}

void write_byte_ds18b20(unsigned char byte){
    unsigned char i;
    for(i=0;i<8;i++){
        write_bit_ds18b20(byte & 0x01);
        byte>>=1;
    }
}

unsigned char read_byte_ds18b20(){
    unsigned char i, result=0;
    for(i=0;i<8;i++){
        result>>=1;
        result|=(read_bit_ds18b20()<<7);
    }
    return result;
}

void int_ds18b20(){
    while(reset_ds18b20());
    write_byte_ds18b20(0xCC);
    write_byte_ds18b20(0x44);
}

void laynhietdo()
{
    unsigned char a=0;
    unsigned char b=0;
    SENSOR_DDR_DATA=1;
    while(reset_ds18b20());
    write_byte_ds18b20(0xCC);
    write_byte_ds18b20(0xBE);
    a=read_byte_ds18b20();
    b=read_byte_ds18b20();
    nhietdo=((b*256+a)>>4);   
    int_ds18b20();
}                       
void khoitaocambien()
{
   int_ds18b20();  
   laynhietdo();   
   delay_ms(1000);
   laynhietdo();
}

// Ham cho phep hien thi len LCD
void LCD_Enable(void)
{
    LCD_EN = 1;
    delay_us(3);
    LCD_EN = 0;
    delay_us(50); 
}
// Ham gui 4 bit
void LCD_Send4Bit(unsigned char Data)
{
    LCD_D4 = Data & 0x01;
    LCD_D5 = (Data>>1)&1;
    LCD_D6 = (Data>>2)&1;
    LCD_D7 = (Data>>3)&1;
}
// Ham gui 1 Byte du lieu
void LCD_Send1Byte(unsigned char byte)
{
    LCD_Send4Bit(byte >>4);/* Gui 4 bit cao */
    LCD_Enable();
    LCD_Send4Bit(byte); /* Gui 4 bit thap*/
    LCD_Enable();
}
// Ham di chuyen con tro: row=0-1; col=0-15 (2 hang + 16 cot)
void LCD_chonvitri(unsigned char row, unsigned char col)
{
    unsigned char address;   
    if (row == 0) address = (0x80 + col);     // row=0 - hang 1
    else address = (0xC0 + col);             // row=1 - hang 2
    delay_us(1000);
    LCD_Send1Byte(address);
    delay_us(50);
}
// Ham hien thi ra man hinh chuoi ki tu
void LCD_guichuoi(char *s)
{
    while (*s)
    {
        LCD_RS=1;
        LCD_Send1Byte(*s);
        LCD_RS=0;
        s++;
    }
}
void LCD_guikitu(int s)
{
        LCD_RS=1;
        LCD_Send1Byte(s);
        LCD_RS=0;    
    
}
// Ham xoa man hinh
void LCD_xoamanhinh()
{
    LCD_chonvitri(0,0);
    LCD_guichuoi("                ");
    LCD_chonvitri(1,0);
    LCD_guichuoi("                ");
    LCD_chonvitri(0,0);
}
// Ham khoi tao LCD
void LCD_khoitao()
{
    LCD_Send4Bit(0x00);
    delay_ms(20);
    LCD_RS = 0;
    LCD_Send4Bit(0x03);     // 
    LCD_Enable();
    delay_ms(5);
    LCD_Enable();
    delay_ms(100);
    LCD_Enable();
    LCD_Send4Bit(0x02); // dua con tro ve dau man hinh
LCD_Enable();
LCD_Send1Byte(0x28);
LCD_Send1Byte(0x0C); // Bat hien thi, bat con tro 0x0C neu muon tat con tro
LCD_Send1Byte(0x06);     
LCD_xoamanhinh();           
delay_ms(20);
}
void main(void)
{

PORTB=0xff;
DDRB=0xff;

PORTC=0xff; PORTC.5=0;
DDRC=0xff;

PORTD=0xff;
DDRD=0x00;

LCD_RW=0;
LCD_khoitao();
khoitaocambien();
while (1)
      {
           laynhietdo();    
           sprintf(mang,"Nhiet do:%i%cC",nhietdo,0xDF);
           LCD_chonvitri(0,0);LCD_guichuoi(mang);
      }
}


( Nguyên lý + Code chuẩn) Link Mediafire
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút  hiện ra ở góc phải phía trên, nhấn vào để đến trang download
------------------------------------------------------------------------------------
DV1 - Nhận vẽ mạch thuê ONLINE Altium Designer/ Orcad 9.2/ Protues nhanh trong ngày



-----------------------------------------------------------------------------------

DV2 - Mua linh kiện về làm mạch nhanh - Miễn phí Ship





DV3 - Kênh youtube chia sẻ kiến thức điện tử thực hành ngay


DV4 - Kênh cộng đồng Facebook Điện Tử ChipKool




eChipKool - Chia sẻ kiến thức Kết Nối đam mê điện tử

0 comments :

Post a Comment

Bạn đọc hãy giúp chúng tôi xây dựng cộng đồng bằng cách để lại bình luận, chúng tôi luôn đón nhận mọi ý kiến của các bạn:
» Bình luận nghiêm túc và không chứa các liên kết quảng cáo.
» Vui lòng không Spam nhận xét với mọi hình thức.
» Rất mong bạn đề tên cho nhận xét của chính mình - Bằng cách chọn vào Tên/URL và điền tên bạn vào (Phần URL có thể bỏ trống ).

- Bạn có thể chèn Link nhạc (NCT), video(Youtube),Hình ảnh vào comment bằng cú pháp:
+ [youtube] Link video Youtube [/youtube].
+ [img] Link ảnh( định dạng PNG, JPG,GIF) [/img]
+Chèn link liên kết: <a href="LINK" rel="nofollow">Name</a>
-Bạn copy mã bên cạnh biểu tượng chèn vào nhận xét để bày tỏ cảm xúc!!

Search This Blog