Chào mừng đến với Câu Lạc Bộ Sáng Tạo
Chia sẻ kinh nghiệm
Kết nối đam mê
Đang cập nhật thời gian...
BÀI VIẾT NỔI BẬT
Xin chào! Tôi là Ếch Sáng Tạo :-)
Chia sẻ trang




Chuyên mục
Bài mới
Xem nhiều
Thống kê
  • Bài viết: 334/334
  • Thành viên: 10.084
  • Đang online: 8
  • Khách hôm nay: 2.003
  • Khách hôm qua: 4.189
  • Tổng khách: 16.105.797
Bài viết
Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 - SangTaoClub.Net
Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051
Đăng bởi: Vũ Văn Thái - Thời gian: 22-08-2014, 22:18
Chuyên mục: Học lập trình 8051 - Lượt xem: 45.854

Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051

1, Giới thiệu chung

       IC ADC0808 là một vi mạch tích hợp có chức năng chuyển đổi tín hiệu tương tự sang kỹ thuật số (Analog to Digital Converters), độ phân giải của bộ ADC là 8bit tức nó sẽ chuyển đổi tín hiệu điện tương tự sang 256 mức điện áp so với Vref cấp vào bộ chuyển đổi. Các bạn có thể xem datasheet của nó trong tệp đính kèm. 

a) Sơ đồ chân:


Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 - SangTaoClub.Net

Ý nghĩa các chân:

  • Các chân từ IN0-IN7 là ngõ vào analog.
  • Vref+/Vref- là chân cấp áp so sánh.
  • ALE là chân cho phép giao tiếp
  • Từ 2ˆ-1 đến 2ˆ-8 là các ngõ ra song song 8bit
  • START là chân cho phép chuyển đổi
  • EOC là chân báo quá trình chuyển đổi hoàn tất, kiểu dạng cờ ngắt
  • ADD A, ADD B, ADD C là 3bit địa chỉ chọn kênh đầu vào từ IN0-IN7
  • VCC, GND là chân cấp nguồn dương 5V và nguồn âm (Mass)
  • CLOCK là chân cấp xung đồng hồ cho IC hoạt động, tốc độ lấy mẫu và chuyển đổi phụ thuộc vào cái này, tối đa 640khz
  • OUTPUT ENABLE (OE) là chân báo cho IC xuất data ra Port để vi điều khiển lấy đi.

b) Giản đồ xung giao tiếp IC ADC0808 (ADC0809)


Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 - SangTaoClub.Net

c) Cảm biến nhiệt độ

        LM35 là cảm biến nhiệt độ, đầu ra là tín hiệu điện áp biến đổi theo nhiệt độ, cứ 10mV tương ứng với 1 độ C và giải đo của IC này là -55 độ đến 150 độ C, điện áp cung cấp từ 4-20VDC. Để đo được nhiệt độ âm tức nhỏ hơn 0 ta phải cấp thêm nguồn âm -Vs cho IC này như sau:


Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 - SangTaoClub.Net

 2, Lập trình giao tiếp ADC0808

Tính năng: Tự động cập nhật giá trị ADC (giá trị nhiệt độ của LM35) từ IC ADC0808 rồi hiển thị lên LCD 16x2, tạo xung đồng hồ cho IC ADC0808 sử dụng ngắt timer.

Xây dựng: Xây dựng các hàm giao tiếp LCD và giao tiếp ADC0808 cụ thể như sau

* LCD16x2:

  • LCD_Init() Hàm khởi tạo LCD
  • LCD_Clear() Hàm xóa màn hình
  • LCD_Gotoxy(X,Y) Hàm trỏ tới vị trí trên màn hình. Trong đó X là vị trí 0-15, Y là dòng 0-1
  • LCD_PutChar(ký_tự_ascii)  Hàm gửi một ký tự ASCII lên LCD
  • LCD_Puts(“Nội dung”) Hàm gửi một chuỗi ký tự lên LCD

* ADC0808:

  • ADC0808_Read(channel) Hàm đọc ADC theo kênh từ 0-7

      Và một số hàm khác như delay, tính nhiệt độ, chuyển đổi hiển thị....

CODE:

//Khai báo chân giao tiếp ADC0808
#define ADC0808_DATA    P3 //PORT
#define ADC0808_A         P2_0 //PIN
#define ADC0808_B         P2_1
#define ADC0808_C         P2_2
#define ADC0808_ALE      P2_3
#define ADC0808_START  P2_4
#define ADC0808_EOC     P2_5
#define ADC0808_OE       P2_6
#define ADC0808_CLK     P2_7

/**********Hàm đọc ADC0808 theo kênh******/
unsigned char ADC0808_Read(unsigned char channel){
        unsigned char kq;
        ADC0808_A = channel & 0x01; //Chọn kênh
        ADC0808_B = channel & 0x02;
        ADC0808_C = channel & 0x04;
        ADC0808_ALE = 1; //Giao tiếp
        ADC0808_START = 1; //Bắt đầu chuyển đổi
        ADC0808_ALE = 0;
        ADC0808_START = 0;
        while(ADC0808_EOC); //Chờ chuyển đổi xong
        while(!ADC0808_EOC);
        ADC0808_OE = 1; //Đọc dữ liệu
        kq = ADC0808_DATA;
        ADC0808_OE = 0;
        return kq; //Trả về hàm dữ liệu ADC
}

Xem code đầy đủ trong file đính kèm cuối bài viết....!

3, Mô phỏng trên Proteus:

Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 - SangTaoClub.Net

Tại sao phải tạo áp Vref 2.56V xin được giải thích như sau:

      Công thức tính điện áp chuyển đổi: Vin = (Vref*ADC)⁄256

      Do độ phân giải của ADC0808 là 8bit lên sẽ có 256 mức điện áp so với Vref. Tức nếu ta cấp vào Vref là 5V và tín hiệu input vào là 2.5V chẳng hạn thì giá trị ADC = 256⁄2 = 128 (do Vin = 1⁄2 Vref) từ đó suy ra Vref = 2.56V thì để ADC=25 thì điện áp đầu vào input phải là 250mV => Cứ tăng/giảm 10mV là ADC tăng/giảm 1 giá trị. Mà cảm biến nhiệt độ LM35 lại có ngõ ra cứ 10mV là thay đổi 1 độ C như vậy suy ra ADC=25 thì LM35 đang ở 25 độ C. Với cách này ta không cần phải tính toán giá trị nhiệt độ sau khi chuyển đổi mà có thể xuất luôn giá trị ADC đó ra màn hình LCD.


Tải về đính kèm:
Do_Nhiet_Do_ADC0808_LM35.zip
Kích thước: 516.58 KB
  • Bạn chưa đăng nhập, không thể viết bình luận!
    Bấm vào đây để Đăng nhập hoặc Đăng ký!
  • hocdotnhuga_06 lúc 08-04-2017, 23:33
    anh giúp em với
  • hocdotnhuga_06 lúc 05-04-2017, 18:14
    anh giúp em lập trình chạy từ 00-59 trên lcd 16x2 với nhưng viết chương trình trêm kelic U với em không biết viết
       
  • tranxuanhung lúc 13-12-2016, 18:23
    ok, cam on nhe!!
  • Vũ Văn Thái lúc 13-12-2016, 08:37
    Muốn nhấp nháy dc phải code lại phần hiển thị, lúc này phải dùng tới delay dùng biến tick chứ không dùng delay_ms(500) nữa VD:
    unsigned int Time_Delay_1, Time_Delay_2; //Khai báo biến 16bit
    unsigned char ADC_Value; //Khai báo biến 8bit
    Trong main -> while(1):
    if(++Time_Delay_1 > 500){ //500ms cập nhật ADC một lần
          Time_Delay_1=0;
          //Code đọc ADC lưu vào biến ADC_Value, chuyển đổi nhiệt độ nếu có...
    }
    if(ADC_Value > 99){ //Lớn hơn 99oC
          if(++Time_Delay_2 < 200){
              Show_Temp_to_LCD(); //Hiển thị nhiệt độ
          }else if(Time_Delay_2 < 400){
              lcd_gotoxy(X, Y); //Tọa độ số
              lcd_puts("   "); //Gửi các ký tự khoảng trắng vào chỗ 100oC để nó tắt hiển thị
          }else Time_Delay_2 = 0;
    }else{ //Nhỏ hơn 100oC
          if(++Time_Delay_2 > 300){ //300ms cập nhật lên LCD
              Time_Delay_2 = 0;
              Show_Temp_to_LCD(); //Hiển thị nhiệt độ
          }
    }
    delay_ms(1); //Tạo trễ hệ thống 1ms
    //End code while(1)
  • tranxuanhung lúc 12-12-2016, 22:10
    vẫn cái code của admin mà muốn từ 100'C nó nhấp nháy thì phải sửa sao ạ?
  • Vũ Văn Thái lúc 12-12-2016, 19:36
    Khi mô phỏng thì không cần phải vẽ thạch anh vào, chỉ cần vẽ khi vẽ mạch in thôi bạn
    • tai1906 lúc 25-07-2020, 12:33
      nếu mình thêm thì thêm bn thạch anh và thêm ở đâu ạ anh

  • tranxuanhung lúc 11-12-2016, 18:42
    mình muốn hỏi thêm một vấn đề là mạch này mình thấy không có thạch anh để tạo xung clock cho 89c52 à bạn?
  • tranxuanhung lúc 11-12-2016, 16:16
    admin ơi, bây giờ mình muốn làm đơn giản là mô phỏng thôi chứ không thi công phần cứng, mình muốn cái LCD hiển thị từ 0-100 c rồi nhấp nháy thì phải thay đổi chỗ nào? thank
  • Vũ Văn Thái lúc 27-11-2016, 17:05
    Không có mật khẩu file bạn nha, down về giải nén bằng WinRAR là được.
  • tothimyngoc lúc 27-11-2016, 17:02
    admin ơi,mật khẩu file là gì vậy
  • Trang 1/2: 12Sau

    Bài viết cùng chuyên mục
    Điều khiển tốc độ động cơ Motor DC sử dụng PWM Điều khiển tốc độ động cơ Motor DC sử dụng PWM
    Đăng bởi: kienvuce - Thời gian: 04-11-2021, 22:40
    Chuyên mục: Học lập trình 8051 - Lượt xem: 3.032
    Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-02-2017, 14:54
    Chuyên mục: Học lập trình 8051 - Lượt xem: 6.594
    Led 7 thanh 4 số điều khiển bằng nút bấm Led 7 thanh 4 số điều khiển bằng nút bấm
    Đăng bởi: HoangQuan69 - Thời gian: 09-10-2016, 15:08
    Chuyên mục: Học lập trình 8051 - Lượt xem: 5.840
    Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307 Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
    Đăng bởi: Vũ Văn Thái - Thời gian: 13-05-2015, 09:00
    Chuyên mục: Học lập trình 8051 - Lượt xem: 28.576
    Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2 Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2
    Đăng bởi: Vũ Văn Thái - Thời gian: 20-11-2014, 08:57
    Chuyên mục: Học lập trình 8051 - Lượt xem: 31.512
    [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 22:06
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.207
    [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 09:02
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.494
    Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051 Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 19-10-2014, 10:11
    Chuyên mục: Học lập trình 8051 - Lượt xem: 25.310
    Bài 12: Tạo xung PWM dùng ngắt timer 8051 Bài 12: Tạo xung PWM dùng ngắt timer 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 02-03-2014, 20:45
    Chuyên mục: Học lập trình 8051 - Lượt xem: 23.994
    Bài 11: Lập trình quét LED 7 đoạn và nút nhấn Bài 11: Lập trình quét LED 7 đoạn và nút nhấn
    Đăng bởi: Vũ Văn Thái - Thời gian: 19-12-2013, 11:02
    Chuyên mục: Học lập trình 8051 - Lượt xem: 53.026
    
    Chào mừng Hungnguyen123 đã tham gia câu lạc bộ sáng tạo!
    Vũ Văn Thái - vuthai
    Hôm nay là sinh nhật của kudai93, ninhthuan85, huylak01, phamngocvinh117123, bboy_lovely, hieu123, thangcdt1, Tran_viettrung, elnino2803, zghieu, phikhanhk11, kuquyen, d9tam81, vannhan738, Truong_97, imagine_02, autobot413, prokiemrong0000, ← Gửi tin nhắn chúc mừng
    Múi giờ: UTC+07:00 - Asia/Ho Chi Minh ***** IP của bạn: 3.85.211.2 ***** Status: Cache Update thành công!