Đề Tài (Bài số 2): Thiết kế bộ đo nhiệt độ dùng vi điều khiển 8051 gồm:Cảm biến nhiệt độ dùng LM35Hiển thị bằng LED hiển thị 7 thanh, 3 chữ số, anot chung. Ghép nối trực tiếp với vi điều khiển.02 nút điều khiển chạydừng đoNội dung thiết kế:Vẽ sơ đồ nguyên lý toàn bộ mạch.Viết chương trình hợp ngữ để đếm và hiển thị nhiệt độ trên hiển thị.
Trang 1Đề Tài (Bài số 2): Thiết kế bộ đo nhiệt độ dùng vi điều khiển 8051 gồm:
- Cảm biến nhiệt độ dùng LM35
- Hiển thị bằng LED hiển thị 7 thanh, 3 chữ số, anot chung Ghép nối trực tiếp với
vi điều khiển
- 02 nút điều khiển chạy/dừng đo
Nội dung thiết kế:
- Vẽ sơ đồ nguyên lý toàn bộ mạch
- Viết chương trình hợp ngữ để đếm và hiển thị nhiệt độ trên hiển thị
Trang 21 Phân tích yêu cầu công nghệ và thiết kế sơ đồ nguyên lý.
1.1 Yêu cầu công nghệ
Thiết kế mạch đo nhiệt độ sử dụng vi điều khiển họ 8051 và hiển thị thông qua led
7 thanh Thiết bị đo được nhiệt độ hiển thị lên led 7 thanh 3 chữ số, với sai số của mạch
đo là 1˚C Gồm có 2 nút bấm điều khiển mạch dừng/đo
Lựa chọn linh kiện:
- Vi điều khiển họ 8051 chọn vi điều khiển 89S51 (với bộ dao động thạch anh ngoài, tần số 12MHz)
- Cảm biến nhiệt độ sử dụng LM35 (dải nhiệt độ -55˚C đến 150˚C)
- Bộ chuyển đổi tương tự số ADC0808
- Bộ hiển thị gồm một led 7segx4; với 3 led đầu tiên sử dụng để hiển thị 3 chữ
số của nhiệt độ đo được, led cuối cùng (led thứ 4) sử dụng để hiển thị chữ độ
‘˚’
- 3 nút bấm Trong đó: 1 nút sử dụng để tạo tín hiệu Reset cho vi điều khiển, 2 nút còn lại dùng để điều khiển mạch (Start/Stop)
- 4 transisor pnp dùng để cấp dòng cho 4 led 7 thanh
- IC NE555 dùng để tạo xung cho ADC
Kết nối các linh kiện:
- 8 đường tín hiệu của led 7segx4 được nối trực tiếp với cổng P0 của 89S52 thông qua một điện trở treo (ở đây sử dụng trở băng 10kΩ).)
- 4 transistor được nối với chân P2.0, P2.1, P2.2, P2.3 để lần lượt điều khiển led thứ 1, 2, 3, 4 ( mức 0 led sáng, mức 1 led tắt)
- Dữ liệu chuyển đổi của ADC0808 được nối với Port 1 của 89S52
1.2 Sơ đồ nguyên lý
Trang 4Chức năng và nguyên lý của các phần tử
1 Cảm biến LM35
Chức năng: Đo nhiệt độ và trả lại bằng tín hiệu điện áp vào chân IN0 của ADC0808
Nguyên lý: Cảm biến LM35 có độ phân giải của điện áp đầu ra là 10mV/˚C Kết hợp với điện áp tham chiếu của ADC0808 mà từ đó có thể tính ra tín hiệu số Ví dụ: điện
áp tham chiếu của ADC0808 là +2,56 V thì nếu ta đo với dải nhiệt độ 0˚C - 150˚C, tín hiệu điện áp trả về của LM35 sẽ là 0mV đến 1500mV
2 ADC0808
Chức năng: Chuyển đổi tín hiệu tương tự về dạng số để gửi đến vi điều khiển (Ở đây là chuyển tín hiệu điện áp dạng tương tự của LM35 đưa về để tính ra giá trị nhiệt độ chính xác)
Nguyên lý: Giá trị chuyển đổi của ADC0808 được tính theo công thức:
N=V¿−V REF¿¿¿
Trong đó:
- VIN là tín hiệu điện áp từ LM35 đưa về chân IN0 của ADC
- VREF(+) là giá trị điện áp tham chiếu đặt vào chân VREF(+)
- VREF(-) là giá trị điện áp tham chiếu âm đặt vào chẩn VREF(-) (trong bài này chân
VREF(-) nối đất)
Chọn VREF(+) = 2,56V và VREF(-) = 0V, ta được:
N=V¿−V REF¿¿¿
Tức là nếu tín hiệu điện áp đo được là 10mV thì N= 1 (˚C)
3 IC NE555
Chức năng: dùng để tạo xung có tần số 640kHz để đưa vào chân CLOCK của ADC
Nguyên lý: Mạch tạo đơn xung được mắc theo hình bên dưới
Trang 5Hình 1.1 Mạch tạo đơn xung Tần số của xung tạo ra phụ thuộc vào điện trở R1, R2 và tụ C1 Tần số của mạch được tính bằng công thức sau:
C1(R2+2 R1) ln 2 ( F )
Chọn C1 = 5pF Để tạo ra F = 640kHz
Thay số ta tính được (R2 + 2.R1) = 450,842 (kΩ).)
Chọn R2 = 51 kΩ)., R1=200 kΩ)
Trang 62 Lưu đồ thuật toán
2.1 Chương trình con đọc ADC:
Trang 72.2 Chương trình ngắt ngoài 1 tại chân P3.3:
Trang 82.3 Chương trình ngắt timer 0:
Trang 92.4 Chương trình chính
Trang 10#include "main.h"
#include "port.h"
#include " \Lib\delay.h"
#include " \Lib\ADC0808.h"
unsigned char cnt=20;
unsigned char adc_value = 0;
void main()
{
unsigned char code code7Seg[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x9C,0xC6};
ADC0808_Init();
//Cau hinh cho timer 0 hoat dong o muc mot
TMOD &= 0xF0;
TMOD |= 0x01; // chon timer 0, mode 1
TH0 = 0x3C; // 65536-50000 = 15536 = 3CB0
TL0 = 0xB0;
ET0 = 1; // Cho phep ngat timer 0
TR0 = 1; // Cho timer 0 hoat dong
IT1 = 1; // Ngat suon xuong
EX1 = 1; // Cho phep ngat ngoai 1
EA = 1; // Cho phep ngat toan cuc
Trang 11LED_PORT = code7Seg[adc_value/100];
LED1 = 0; //bat led 1 delay_ms(1);
LED1 = 1; //tat led 1 LED_PORT = code7Seg[(adc_value%100)/10];
LED2 = 0;
delay_ms(1);
LED2 = 1;
LED_PORT = code7Seg[(adc_value%100)%10];
LED3 = 0;
delay_ms(1);
LED3 = 1;
LED_PORT = code7Seg[10];
LED4 = 0;
delay_ms(1);
LED4 = 1;
}
}
3.2. Chương trình ngắt ngoài tại chân P3.3
void EX1_ISR (void) interrupt 2
{
Trang 12delay_ms(1);
LED1 = 1;
LED_PORT = code7Seg[0];
LED2 = 0;
delay_ms(1);
LED2 = 1;
LED_PORT = code7Seg[0];
LED3 = 0;
delay_ms(1);
LED3 = 1;
LED_PORT = code7Seg[0];
LED4 = 0;
delay_ms(1);
LED4 = 1;
}
}
3.3 Chương trình ngắt Timer0
void Timer0_ISR(void) interrupt 1 // 1 là ngat timer 0
{
TH0 = 0x3C;
TL0 = 0xB0;
cnt ;
Trang 133.4 Chương trình chuyển đổi ADC
#include "main.h"
#include "port.h"
void ADC0808_Init()
{
ADC0808_START = 0;
ADC0808_ALE = 0;
ADC0808_OE = 0;
}
unsigned char ADC0808_Read()
{
unsigned char kq;//Bat dau qua trinh chuyen doi
ADC0808_ALE = 1; //Bat dau qua trinh chuyen doi
ADC0808_START = 1;
ADC0808_ALE = 0;
ADC0808_START =0;
while(ADC0808_EOC); //Doi cho qua trinh chuyen doi ket thuc//cho het muc 1 while(!ADC0808_EOC);// cho het muc 0
ADC0808_OE = 1; //cho phep lay du lieu chuyen doi