BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
ĐỒ ÁN MÔN HỌC
ĐỀ TÀI: THIẾT KẾ BỘ ĐO TẦN SỐ
HIỂN THỊ MÀN HÌNH TINH THỂ LỎNG (LCD)
Giáo viên hướng dẫn:
Sinh viên thực hiện: LÊ VĂN DŨNG
NGUYỄN ĐÌNH SƠN
MAI HUY LỢI
Lớp: CĐ-CĐT-K9
Đồ án môn Vi điều khiển
Mục lục
Trang
Mục lục 2
Lời nói đầu 3
Chương I:Cơ sở lý thuyết 4
I: Vi điều khiển 8052 (AT89S52) 4
1, Giới thiệu tổng quan về AT89S52 4
2, Cấu tạo, chức năng các khối của AT89S52 được sử dụng 6
II: Màn hình tinh thể lỏng (LCD) 13
1, Cấu tạo 13
2, Nguyên lý hoạt động 13
Chương II:Nội dung thiết kế 15
I:Sơ đồ mạch 15
2, Sơ đồ khối 15
3, Sơ đồ nguyên lý 16
4, Sơ đồ mạch in 17
II:Cấu tạo và nguyên lý hoạt động 17
1, Cấu tạo 18
2, Nguyên lý hoạt động 18
3, Lập trình cho vi điều khiển 18
phí cho thiết kế hệ thống, đơn giản hóa việc thiết kế, nâng cao hiệu suất và tính linh
hoạt.
Mục đích của đề tài hướng đến: tạo ra bước đầu cho sinh viên thử nghiệm
những ứng dụng của vi điều khiển trong thực tiễn để rồi từ đó nghiên cứu, tìm tòi, phát
triển nhiều ứng dụng khác trong đời sống hằng ngày.
Việc thiết kế đồ án được tham khảo từ các nguồn tài liệu khác nhau, do đó có thể
chúng em có thể đưa ra một số nội dung chưa rõ ràng, thiếu chính xác. Vì vậy mong
nhận được ý kiến góp ý, phê bình của các thầy, các cô để kiến thức về vi điều khiển của
chúng em được hoàn thiện hơn. Chúng em xin cảm ơn các thầy, các cô.!
Trường Đại học Công Nghiệp Hà Nội
3
Đồ án môn Vi điều khiển
Chương I: Cơ sở lý thuyết
I. Vi điều khiển 8052 : AT89S52
1, Giới thiệu tổng quan về AT89S52
- Cấu trúc bên trong:
- Một số hình ảnh về AT89S52
• CPU(
CPU centra
lprocessing unit):
8- bit data bus; 16- bit address bus; không gian địa chỉ 64Kbyte
Thanh ghi tích lũy A;
Thanh ghi tích lũy phụ B;
Đơn vị logic học (ALU);
Thanh ghi từ trạng thái chương trình;
Bốn băng thanh ghi;
Con trỏ ngăn xếp;
• Bộ nhớ (Memory):
Bộ nhớ chương trình( ROM) gồm 8Kbyte Flash, ghi xóa hàng nghìn lần.
Bộ nhớ dữ liệu( dạng SRAM) gồm 256 byte (chứa ngăn xếp – Stack)
P3.2 INT0 Ngắt ngoài 0
P3.3 INT1 Ngắt ngoài 1
P3.4 T0 Ngõ vào của Timer/counter0
P3.5 T1 Ngõ vào của Timer/counter1
P3.6 /WR Xung ghi bộ nhớ dữ liệu ngoài.
P3.7 /RD Xung đọc bộ nhớ dữ liệu ngoài.
Chân /PSEN (pin 29): là chân điều khiển đọc chương trình ở bộ nhớ ngoài.
Chân ALE (pin 30): ALE là tín hiệu điều khiển chốt địa chỉ có tần số bằng
1/6 tần số dao động của vi điều khiển. Tín hiệu ALE được dùng để cho phép vi mạch
chốt bên ngoài như 7473.
Chân /EA (pin 31): Tín hiệu /EA cho phép chọn bộ nhớ chương trình là bộ
nhớ trong hay ngoài. EA=1 thì thực hiện chương trình trong ROM nội. EA=0 thực
hiện ở ROM ngoài.
RST( Reset: pin 9): Ngõ vào reset trên chân số 9. khi RST=1 thì bộ vi điều
khiển sẽ được khởi động lại thiết lập ban đầu.
XTAL1, XTAL2 (pin 18, 19): Hai chân này được nối song song với thạch
anh tần số max=33 Mhz. Để tạo dao động cho bộ vi điều khiển.
Vcc,GND: cung cấp nguồn nuôi cho bộ
vi điều khiển cấp qua chân 20 và 40.
* Phần cứng tối thiểu để một chip AT89S52
có thể hoạt động được gồm 4 yếu tố:
• Nguồn cung cấp (pin 20, pin 40).
• Mạch RESET (pin 9).
• Mạch dao động (pin 18 và pin 19).
• Trạng thái của chân EA (pin 31).
2, Cấu tạo và chức năng các khối của AT89S52 được sử dụng trong mạch.
Đơn vị xử lý trung tâm CPU:
Chức năng của CPU là tiến hành các thao tác tính toán xử lý, đưa ra các tín hiệu địa
chỉ, dữ liệu và điều khiển nhằm thực hiện một nhiệm vụ nào đó do người lập trình đưa
ra thông qua các lệnh (instrustions).
cổng.
Sau khi reset, tất cả các cổng đều là cổng vào.
Các thanh ghi SFR liên quan: mỗi cổng liên quan đến một thanh ghi chức năng đặc
biệt 8-bit (SFR) có tên trùng với tên của cổng, lần lượt là P0, P1, P2, P3.
Trước khi sử dụng cổng, phải cấu hình hướng vào/ra cho cổng.
Để cấu hình cổng vào (input port), người dùng phải ghi giá trị logic “1” lên bit
trong thanh ghi SFR tương ứng. Sau đó có thể đọc mức logic tại cổng bằng cách đọc
thanh ghi cổng (SFR) tương ứng.
Để cấu hình làm cổng ra (output port), người dùng không phải thực hiện them bất
kỳ thao tác nào. Đơn giản, chỉ cần ghi mức logic mong muốn vào thanh ghi cổng tương
ứng.
Đặc tính điện: Mức logic 0: U<= 0.45V; I= 1.6mA
Mức logic 1: U>= 2.4V; I= 60µA
Ngắt (Interrupts)
Ngắt là những yêu cầu do ngoại vi (là các phần cứng tích hợp trên IC hoặc các tác
động từ bên ngoài) gửi tới CPU nhằm đòi hỏi những đáp ứng nhất định. Mục đích của
việc thiết kế cơ chế ngắt trong vi xử lý nhằm tiết kiệm thời gian cho CPU. Trong hầu
hết các trường hợp, vi xử lý cần phải thực hiện nhiều nhiệm vụ trong thời gian rất ngắn
và liên tục. Để đáp ứng kịp thợi với các sự kiện cần xử lý, CPU có thể tiến hành thăm
dò (polling) liên tục các sự kiện để xem khi nào chúng xảy ra thì xử lý, đáp ứng lại.Tuy
nhiên nếu làm như vậy thì lãng phí rất nhiều thời gian của CPU trong khi còn có rất
nhiều nhiệm vụ khác đang chờ được thực hiện, ngoài ra CPU không thể thăm dò liên
tục nhiều sự kiện trong cùng một lúc được. Người ta tạo ra ngắt để CPU không phải
thăm dò liên tục một hay nhiều sự kiện đó. Bằng cách ghép các sự kiện cần đáp ứng với
các cơ chế ngắt khác nhau, khi một sự kiện nào đó xảy ra, phần cứng phụ trách ngắt
tích hợp trên CPU sẽ tự động báo cho CPU biết rằng sự kiện đã xảy ra. CPU dừng công
việc đang làm lại ( nhưng phải thực hiện xong lệnh đang thực hiện, dù mới chỉ ở giai
đoạn tìm nạp mã lệnh), và chuyển sang xử lý xong sự kiện gây ngắt, CPU sẽ tiếp tục
quay lại lam tiếp công việc đang dang dở (nhờ hoạt động của ngăn xếp). Nói đến ngắt
không thể không nói đến mức ưu tiên của các loại ngắt khác nhau. Có 2 loại mức ưu
timer/counter 1
Timer/Counter1 đếm tràn
trên
0x001B 4 TF1(TCON)
Ngắt cổng nối
tiếp
Cổng nối tiếp nhận được
hoặc truyền xong một
khung dữ liệu đầy đủ
0x0023 5
TI,RI
(SCON)
Ngắt
timer/counter2
Timer/Counter2 đếm tràn
trên hoặc tín hiệu T2EX
thay đổi mức logic 1→0
0x002B 6
TF2,EXF2
(T2CON)
Các cờ báo ngắt do INT0, INT1, Timer 0, Timer 1 bị xóa khi CPU xử lý chương
trình ngắt. Còn cờ ngắt của cổng nối tiếp và ngắt do Timer 2 không tự động xóa, người
dùng phải xóa bằng phần mềm.
Thanh ghi cho phép ngắt IE (Interrupt Enable):
EA: bít cho phép hoặc cấm tất cả các ngắt. Để cho phép một ngắt thì bít tương ứng
với ngắt đó và bít EA phải được đặt bằng 1. Nếu EA=0 tất cả các ngắt đều bị cấm.
ET2: bít cho phép ngắt do Timer 2.
ES: bít cho phép ngắt truyền thong nối tiếp.
ET1: bít cho phép ngắt do Timer 1.
EX1: bít cho phép ngắt ngoài INT1.
Các timer đều có ngắt:
Timer 0 có ngắt do tràn.
Timer 1 có ngắt do tràn.
Timer 2 có ngắt do tràn hoặc do sự kiện capture.
Các thanh ghi liên quan:
- Thanh ghi dữ liệu (hay thanh ghi giá trị đếm):TH0,TL0 (Timer0) TH1,TL1
(Timer1) TH2,TL2 (Timer2) đều là các thanh ghi 8 bit.
- Thanh ghi điều khiển TMOD(Sử dụng cho timer/counter 0 và timer/counter 1):
-
GATE: bit quy định yếu tố cho phép timer/counter đếm hay dừng. Nếu GATE=0,
timer/counter sẽ đếm hay dừng phụ thuộc vào trạng thái bit TRx (thanh ghi TCON).
Nếu GATE=1, timer/counter sẽ đếm nếu bit TRx=1 (thanh ghi TCON) và tín hiệu ngắt
ngoài INTx ở mức cao. Trong trường hợp này, nếu TRx-0 hoặc tín hiệu ngắt ngoài
INTx ở mức thấp, timer/counter sẽ dừng đếm.
C/T: bit lựa chọn xung nhịp đưa vào đếm. Nếu C/T = 0, xung nhịp đưa vào đếm
chính là xung nhịp của CPU (lúc này gọi là bộ định thời – timer). Nếu C/T = 1, xung
nhịp đưa vào đếm là xung nhịp lấy từ bên ngoài vào qua tín hiệu T0 và T1 (lúc này gọi
là bộ đếm sự kiện – counter).
M1:M0 0:0 = Mode 0: timer/counter 13bit ghép bởi <5bit thấp TL>:<thanh ghi TH>
0:1 = Mode 1: timer/counter 16bit ghép bởi <thanh ghi TH>:<thanh ghi TL>
1:0 = Mode 2: timer/counter 8bit, đếm bằng TL,khi tràn tự động nạp TH vào TL.
1:1 = Mode 3: TL0 là timer/counter 8bit, sử dụng các bit điều khiển của timer0.
TH0 là timer 8bit, sử dụng các bit điều khiển của timer 1. Timer 1
không hoạt động ở chế độ này.
- Thanh ghi TCON (Sử dụng cho timer/counter 0 và timer/counter 1):
TF1: Cờ ngắt của timer/countet 1, khi =1 báo hiệu rằng timer/counter 1 đã đếm
vượt quá trị lớn nhất mà nó có thể biểu diễn (255 đối với chế độ 8bit và 65535 đối với
chế độ 16bit).
TR1: bit cho phép timer/counter 1 hoạt động đếm hoặc dừng.
TF0: Cờ ngắt của timer/countet 0, khi =1 báo hiệu rằng timer/counter 0 đã đếm
* Trong đồ án, chúng em không sử dụng cổng nối tiếp vì vậy giao tiếp cổng nối
tiếp (UART) không được giới thiệu ở đây.
III, Bộ hiển thị màn hình tinh thể lỏng (LCD)
1., Cấu tạo:
Giới thiệu về LCD 1602:
Là thiết bị thong dụng dung để hiển thị thông tin, đặc biệt là chữ cái. LCD1602 là
LCD có 16 cột và 2 hàng, nó có thể hiển thị tối đa 32 kí tự cùng lúc (16 kí tự hang trên
và 16 kí tự hang dưới)
Hình ảnh LCD 16*2
Chức năng các chân LCD:
Chân số Ký hiệu Mức
logic
I/O Chức năng
1 Vss - - Nguồn cung cấp(GND)
2 Vdd - - Nguồn cung cấp(+5V)
3 Vee - I Điện áp để điều chỉnh độ tương phản
4 RS 0/1 I Lựa chọn thanh ghi:
0= thanh ghi lệnh
1=thanh ghi dữ liệu
5 R/W 0/1 I 0=ghi vào LCD module
1=đọc từ LCD module
6 E 1,1=>0 I Tín hiệu cho phép, tích cực mức cao
7 DB1 0/1 I/O Data bus line 0(LSB)
8 DB2 0/1 I/O Data bus line1
9 DB3 0/1 I/O Data bus line2
10 DB4 0/1 I/O Data bus line3
11 DB5 0/1 I/O Data bus line4
12 DB6 0/1 I/O Data bus line5
13 DB7 0/1 I/O Data bus line6
14 DB8 0/1 I/O Data bus line7(MSB)
THỊ: LCD
So do nguyen ly
3, Sơ đồ mạch in
Mạch CPU
Mạch tạo xung
I: Cấu tạo và nguyên lý hoạt động
1, Cấu tạo
Khối nhận tín hiệu: Khối này sẽ nhận xung từ mạch tạo dao động sử dụng
LM555. chân nhận tín hiệu xung này là chân T0.
Khối hiển thị LCD: căn cứ vào chức năng các
chân của LCD, LCD sẽ được nối với AT89S52 như sau:
Chân 1 nối GND
Chân 2 nối +5V
Chân Vef nối với biến trở 10K để chỉnh độ tương phản.
Chân RS, RW, EN được nối với 3 chân của vi điều khiển
để điều khiển LCD.
2 chân của đèn backlight được nối như sau:
2, Nguyên lý hoạt động của mạch
Nguyên lý hoạt động của mạch là đếm xem trong 1s thì có bao nhiêu xung ở chân
T0, số xung đó sẽ là tần số đang cần đo. Do sử dụng Timer 0 mode 1 nên số xung lớn
nhất mà A89S52 có thể đếm được là 65535, tương ứng với 65,535KHz, và sai số ở các
giá trị đo là như nhau, nhưng để đảm bảo yêu cầu đề tài đặt ra, mạch được thiết kế có 3
led đơn để báo tần số đang đo đang ở dải đo nào: 0-100Hz, 100Hz-500Hz; 1KHz-
5KHz. Khi mà giá trị tần số đo được thuộc dải tần số nào thì led tương ứng sẽ sáng, còn
nếu không thuộc dải tần số nào thì vẫn hiển thị giá trị tần số đo được ra LCD nhưng các
led sẽ không sáng.
Timer 0 được dùng ở chế độ counter, tức là sẽ đếm sự kiện ngoài mode 1, khi có 1
xung từ cao xuống thấp trên chân T0, thì giá trị đếm sẽ tự động tăng lên 1, giá trị đếm
sẽ được lưu vào 2 thanh ghi 8 bit, TH0 là thanh ghi 8 bit cao, và TL0 là thanh ghi 8 bit
void LCD_WriteCommand(unsigned char);
void LCD_WriteData(unsigned char);
void LCD_SendStringFlash(const unsigned char*);
void LCD_Gotoxy(unsigned char,unsigned char);
void hienthi();
//=============================================
// Định nghĩa các hàm
Void main()
{
EA=1;ET1=1;
TMOD=0x25;
TH1=TL1=-250;
// cam LCD
LCD_E = 0;
// khoi tao LCD
Delay(100);
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x01);
LCD_Gotoxy(1,2);
LCD_SendStringFlash("DO AN VDK!");
Delay(2000);
LCD_WriteCommand(0x01);
Delay(500);
LCD_Gotoxy(1,0);
LCD_SendStringFlash("Tan so: ");
TR0=1;
LCD_E = 1;
LCD_E = 0;
Delay(N2);
}
//=============================================
void LCD_SendStringFlash(const unsigned char* p)
{
unsigned char i;
i = 0;
while(p[i]!=0)
{
LCD_WriteData(p[i]);
i++;
}
}
//=============================================
void LCD_Gotoxy(unsigned char row,unsigned char column)
{
switch(row)
{
case 1:
LCD_WriteCommand(0x80+column);
break;
case 2:
LCD_WriteCommand(0x80+0x40+column);
break;
default:
break;
}
}
}
if(tanso>999&&tanso<5001)
{
LED3=0,LED2=LED1=1;
}
if((tanso<10)||(tanso>5000)||(tanso>500&&tanso<1000))
{
LED3=LED2=LED1=1;
}
}
Chương III: Đánh giá sản phẩm
1. Ưu điểm
Mạch được thiết kế đơn giản, nhanh chóng tạo điều kiện cho sinh viên dễ nắm bắt
được cấu tạo, nguyên lý hoạt động của mạch.
Mạch được thiết kế trên phần mềm chuyên dụng Orcad 9.2, đơn giản, dễ sử dụng.
Linh kiện lắp ráp mạch phổ biến, dễ tìm kiếm.
Mạch có thể đo được tần số từ 0- 65,535KHz.
2. Nhược điểm và hướng cải tiến, phát triển
Mạch được thiết kế với 1 đầu vào duy nhất nên không có khã năng chọn dải tần số,
mà đo được dải tần số như trên. Khắc phục băng cách dung các công tắc chuyền mạch
để chỉ có thể đo đuợc tần số nằm trong dải tần số nhất định. Nhưng việc đó là không
cần thiết, sẽ làm mạch phức tạp.