Tải bản đầy đủ (.docx) (13 trang)

Thiết kế bộ đo nhiệt độ sử dụng vi điều khiển 8051

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (315.8 KB, 13 trang )

Đề 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ị.

1

Bài tập lớn Vi điều khiển & Ứng dụng


1. 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:
-

1.2.

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.


Sơ đồ nguyên lý

2

Bài tập lớn Vi điều khiển & Ứng dụng


3

Bài tập lớn Vi điều khiển & Ứng dụng


Chứ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:

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 V REF(-) (trong bài này chân
VREF(-) nối đất).

Chọn VREF(+) = 2,56V và VREF(-) = 0V, ta được:

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.

4

Bài tập lớn Vi điều khiển & Ứng dụng


Hì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:

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Ω.

5

Bài tập lớn Vi điều khiển & Ứng dụng



2. Lưu đồ thuật toán
2.1. Chương trình con đọc ADC:

6

Bài tập lớn Vi điều khiển & Ứng dụng


2.2.

Chương trình ngắt ngoài 1 tại chân P3.3:

7

Bài tập lớn Vi điều khiển & Ứng dụng


2.3.

Chương trình ngắt timer 0:

8

Bài tập lớn Vi điều khiển & Ứng dụng


2.4.

Chương trình chính


3. Chương trình điều khiển cho 89S52
3.1. Chương trình chính
9

Bài tập lớn Vi điều khiển & Ứng dụng


#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

while(1)
{
//adc_value = ADC0808_Read();
10

Bài tập lớn Vi điều khiển & Ứng dụng


LED_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
{
unsigned char code code7Seg[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x9C};
while(BT0)
{
LED_PORT = code7Seg[0];
LED1 = 0;
11


Bài tập lớn Vi điều khiển & Ứng dụng


delay_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--;
if(cnt==0)
{
adc_value = ADC0808_Read();
cnt = 20;
}
12

Bài tập lớn Vi điều khiển & Ứng dụng


}

3.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
kq = ADC0808_DATA;
ADC0808_OE = 0;

return kq;
}

13

Bài tập lớn Vi điều khiển & Ứng dụng



×