Lêi Nãi §Çu Ngµy nay,c¸c vi ®iÒu khiÓn ®• th©m nhËp vµo mäi lÜnh vùc vña ®êi sèng tõ d©n sù ,qu©n sù ®Õn an ninh quèc phßng,cã mÆt trong hÇu hÕt c¸c øng dông hµng ngµy tõ nh÷ng thiÕt bÞ nhá nh ®iÖn tho¹i di ®éng,m¸y nh¾n tin,trß ch¬i ®iÖn tö,c¸c thiÕt bÞ gia dông(m¸y giÆt,®iÒu hßa,tñ l¹nh….) ®Õn nh÷ng thiÕt bÞ lín nh «t«,tµu thñy,xe löa,m¸y bay,hÖ thèng m¹ng ®iÖn tho¹i,c¸c bé ®iÒu khiÓn tù ®éng trong nhµ m¸y,c¸c bé ®iÒu chØnh trong nhµ m¸y ®iÖn h¹t nh©n,trong c¸c hÖ thèng ®iÒu khiÓn ¸nh s¸ng… Víi mét lo¹t c¸c øng dông thó vÞ trªn,ë ®©y chóng em xin giíi thiÖu mét øng dông nhá dïng vi ®iÒu khiÓn 8051(cô thÓ lµ vi ®iÒu khiÓn AT89S52) ®Ó thiÕt kÕ v«n mÐt ®iÖn tö ®o ®iÖn ¸p mét chiÒu.§©y lµ mét øng dông nhá cña vi ®iÒu khiÓn nhng thùc tÕ sö dông rÊt nhiÒu trong c¸c hÖ thèng ®o lêng ®iÖn,®iÖn tö nh v«n mÐt, ampe mÐt ®iÖn tö…vv
Trang 1
Lời Nói Đầu
Ngày nay,các vi điều khiển đã thâm nhập vào mọi lĩnh vực vủa đời sống từ dân
sự ,quân sự đến an ninh quốc phòng,có mặt trong hầu hết các ứng dụng hàng ngày từ những thiết bị nhỏ nh điện thoại di động,máy nhắn tin,trò chơi điện tử,các thiết bị gia dụng(máy giặt,điều hòa,tủ lạnh….) đến những thiết bị lớn nh ôtô,tàu thủy,xe lửa,máy bay,hệ thống mạng điện thoại,các bộ điều khiển tự động trong nhà máy,các bộ điều chỉnh trong nhà máy điện hạt nhân,trong các hệ thống điều khiển ánh sáng…
Với một loạt các ứng dụng thú vị trên,ở đây chúng em xin giới thiệu một ứng dụng nhỏ dùng vi điều khiển 8051(cụ thể là vi điều khiển AT89S52) để thiết kế vôn mét điện
tử đo điện áp một chiều.Đây là một ứng dụng nhỏ của vi điều khiển nhng thực tế sử dụng rất nhiều trong các hệ thống đo lờng điện,điện tử nh vôn mét, ampe mét điện tử…vv
Đề tài gồm 2 phần:
Phần 1:Cấu trúc vi điều khiển 8051
Phần 2: Thiết kế vôn mét điện tử dùng AT89S52
Trang 2
phần 1
cấu trúc vi điều khiển 8051
I-Giới thiệu tổng quan về họ 8051( AT 89S52)
Họ vi điều khiển 8051(còn gọi là C51) là một trong những họ vi điều khiển thông
dụng nhất Đây là các bộ vi điều khiển 8 bít đợc sản xuất theo công nghệ CMOS Một
số loại vi điều khiển thuộc họ 8051 thông dụng nhất:
AT89C2051,AT89C4051,AT89C51,AT89S52 …Trong đó AT89S52 là một bộ vi điều khiển thông dụng giá rẻ có nhiều chức năng và đặc biệt có tích hợp sẵn bộ nạp trên chíp
Bộ vi điều khiển AT89S52 gồm các khối chức năng chính sau đây:
CPU( Central Processing Unit) bao gồm:
- Thanh ghi tích luỹ A
- Thanh ghi tích luỹ phụ B, dùng cho phép nhân và phép chia
- Đơn vị logic học( ALU: Arithmetic Logical Unit)
- Từ trạng thái chơng trình( PSW: Progam Status Word)
- Bốn băng thanh ghi
- Con trỏ ngăn xếp
Bộ nhớ chơng trình( Bộ nhớ ROM) gồm 8Kb Flash.
Bộ nhớ dữ liệu( Bôn nhớ RAM) gồm 256 bytes.
Bộ UART( Universal Ansynchronous Receiver and Tranmitter) làm chức năng
truyền nhận nối tiếp, nhờ khối này, AT89S52 có thể giao tiếp với máy tính qua cổng COM
3 bộ Timer /Counter 16 bít thực hiện các chức năng định thời và đếm sự kiện WDM( Watch Dog Timer) đợc dùng để phục hồi lại hoạt động của CPU khi nó bị treo
bởi một nguyên nhân nào đó WDM ở AT89S52 gồm một bộ Timer 14 bít, một bộ Timer 7 bít, thanh ghi WDTPRG( WDT programable) điều khiển Timer 7 bit và một thanh ghi chớc năng WDTRST( WDM register) Bình thờng WDT không hoạt
động( bị cấm), để cho phép WDT, các giá trị 1EH và E1H cần phải đợc ghi liên tiếp vào thanh ghi WDTRST Timer 14 bit của WDT sẽ đếm tăng dần sau mỗi chu kỳ đồng
hồ cho đến giá trị 16383 thì xảy ra tràn Khi xảy ra tràn, chân RTS sẽ đợc đặt ở mức cao trong thời gian 96.Tosc (Tossc=1/Fosc) và AT89S52 sẽ đợc reset Khi WDT hoạt
động, ngoại trừ reset phần cứng và reset do WDT tràn thì không có cách nào cấm đợc WDT, vì vậy khi sử dụng WDT thì các đoạn mã chơng trình phải đợc đặt trong các khe thời gian từ khi giữa các lần WDT đợc khởi tạo lại.
II- Sơ đồ các chân và chức năng
2
Trang 31.Port 0(P0.0-P0.7 hay từ chân 32 đến chân 39): Gồm 8 chân, ngoài chức
năng xuất nhập ra, Port 0 còn là Bus đa hợp dữ liệu và địa chỉ( AD0-AD7), chức năng này sẽ đợc sử dụng khi AT89S52 giao tiếp với thiết bị ngoài có kiến trúc Bus
2.Port 1( P1.0-P1,7 hay từ chân 1 đến chân 8) : Có chức năng xuất nhập theo bit
và byte Ngoài ra, 3 chân P1.5, P1.6, P1.7 đợc dùng để nạp ROM theo chuẩn ISP, 2 chân P1.0 và P1.1 đợc dùng cho bộ Timer 2
Trang 4
3.Port 2( P2.0- P2.7 hay từ chân 21 đến chân 28): Là một port có công dụng
kép: là đờng xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ mở rộng
4.Port 3( P3.0- P3.7 hay từ chân 10 đến chân 17): Mỗi chân trên port 3 ngoài
chức năng xuất nhập ra còn có một chức năng riêng:
Bit Tên Chức năng
P3.0 RXD Dữ liệu nhận cho port nối tiếp
P3.1 TXD Dữ liệu phát cho port nối tiếp
P3.2 INT0 Ngắt 0 bên ngoài
P3.3 INT1 Ngắt 1 bên ngoài
P3.4 T 0 Ngõ vào của Timer/Counter 0
P3.5 T 1 Ngõ vào của Timer/Counter 1
P3.6 WR Xung ghi bộ nhớ dữ liệu bên ngoài
P3.7 RD Xung đọc bộ nhớ dữ liệu bên ngoài
4
Trang 5
5 RST( Reset- chân 9):
Mức tích cực của chân này là mức 1, để reset ta phải đa mức 1(5V) đến chân này với thời gian tối thiểu 2 chu kỳ máy( tơng đơng 2uS đối với thạch anh 12MHz
6.XTAL1, XTAL2:
AT89S52 có một bộ dao động trên chip, nó thờng đợc nồi với một bộ dao
động thạch anh có tần số lớn nhất là 33MHz, thông thờng là 12MHz
7 EA( External Access):
EA thờng đợc mắc lên mức cao(+5V) hoặc mức thấp( GND) Nếu ở mức cao, bộ vi điều khiển thi hành chơng trình từ ROM nội Nếu ở mức thấp, chơng trinh chỉ đợc thi hành từ bộ nhớ mở rộng
8.ALE( Address Latch Enable):
ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nửa
đầu của chu kỳ bộ nhớ Sau đó các đờng port 0 dùng để xuất hoặc nhập dữ liệu trong nửa chu kỳ sau của bộ nhớ
9.PSEN( Program Store Enable):
PSEN là điều khiển để cho phép bộ nhớ chơng trình mở rộng và trờng
đ-ợc nối đến chân /OE ( Output Enable) của một EPROM để cho phép đọc các bytes mã lệnh
PSEN sẽ ở mức thấp trong thừi gian đọc lệnh Các mã nhị phân của chơng trình đợc đọc từ EPROM qua Bus và đợc chốt vào thanh ghi lệnh của bộ vi điều khiển
để giải mã lệnh Khi thi hành chơng trình trong ROM nội, PSEN sẽ ở mức thụ
động( mức cao)
10.Vcc, GND:
AT89S52 dùng nguồn một chiều có dải điện áp từ 4V-5.5V đợc cấp qua chân 40(+) và chân 20(-)
Phần 2 THIẾT KẾ MẠCH ĐO ÁP
I Giới thiệu về ADC0804:
1- Các thiết bị ADC.:
Trang 6Các bộ chuyển đổi ADC thuộc trong những thiết bị đợc sử dụng rộng rãi nhất để thu dữ liệu Các máy tính số sử dụng các giá trị nhị phân, nhng trong thế giới vật lý thì mọi đại lợng ở dạng tơng tự (liên tục) Nhiệt độ, áp suất (khí hoặc chất lỏng), độ ẩm
và vận tốc và một số ít trọng những đại lợng vật lý của thế giới thực mà ta gặp hàng ngày Một đại lợng vật lý đợc chuyển về dòng điện hoặc điện áp qua một thiết bị đợc gọi là các bộ biến đổi Các bộ biến đổi cũng có thể đợc coi nh các bộ cảm biến Mặc
dù chỉ có các bộ cảm biến nhiệt, tốc độ, áp suất, ánh sáng và nhiều đại lợng tự nhiên khác nhng chúng đều cho ra các tín hiệu dạng dòng điện hoặc điện áp ở dạng liên tục
Do vậy, ta cần một bộ chuyển đổi tơng tự số sao cho bộ vi điều khiển có thể đọc đợc chúng Một chíp ADC đợc sử dụng rộng rãi là ADC0804
2- Chíp ADC0804.
Chíp ADC0804 là bộ chuyển đổi tơng tự số trong họ các loạt ADC800 từ hãng National Semiconductor Nó cũng đợc nhiều hãng khác sản xuất, nó làm việc với +5v
và có độ phân giải là 8 bít Ngoài độ phân giải thì thời gian chuyển đổi cũng là một yếu tố quan trọng khác khi đánh giá một bộ ADC Thời gian chuyển đổi đợc định nghĩa nh là thời gian mà bộ ADC cần để chuyển một đầu vào tơng tự thành một số nhị phân Trong ADC0804 thời gian chuyển đổi thay đổi phụ thuộc vào tần số đồng hồ
đ-ợc cấp tới chân CLK R và CLK IN nhng không thể nhanh hơn 110s Các chân của ADC0804 đợc mô tả nh sau:
1 Chân CS- chọn chíp: Là một đầu vào tích cực mức thấp đợc sử dụng để kích hoạt chíp ADC0804 Để truy cập ADC0804 thì chân này phải ở mức thấp
2 Chân RD(cho phép vi điều khiển đọc): Đây là một tín hiệu đầu vào đợc tích cực mức thấp Các bộ ADC chuyển đổi đầu vào tơng tự thành số nhị phân tơng đơng với nó và giữ nó trong một thanh ghi trong RDđợc sử dụng để nhận dữ liệu đợc chuyển đổi ở đầu ra của ADC0804 Khi CS = 0 nếu một xung cao - xuống - thấp
đ-ợc áp đến chân RDthì đầu ra số 8 bít đợc hiển diện ở các chân dữ liệu D0 - D7 Chân RD cũng đợc coi nh cho phép đầu ra
3 Chân ghi WR(thực ra tên chính xác là “Bắt đầu chuyển đổi”) Đây là chân đầu vào tích cực mức thấp đợc dùng để báo cho ADC0804 bắt đầu quá trình chuyển đổi Nếu CS = 0 khi WRtạo ra xung thấp - lên - cao thì bộ ADC0804 bắt đầu chuyển
đổi giá trị đầu vào tơng tự Vin về số nhị phân 8 bít Lợng thời gian cần thiết để chuyển đổi thay đổi phụ thuộc vào tần số đa đến chân CLK IN và CLK R Khi việc chuyển đổi dữ liệu đợc hoàn tất thì chân INTR đợc ép xuống thấp bởi ADC 0804
4 Chân CLK IN và CLK R
Chân CLK IN là một chân đầu vào đợc nối tới một nguồn đồng hồ ngoài khi
đồng hồ ngoài đợc sử dụng để tạo ra thời gian Tuy nhiên ADC0804 cũng có một máy tạo xung đồng hồ Để sử dụng máy tạo xung đồng hồ trong (cũng còn đợc gọi là máy tạo đồng hồ riêng) của ADC0804 thì các chân CLK IN và CLK R đợc nối tới một tụ
điện và một điện trở nh chỉ ra trên hình 3 Trong trờng hợp này tần số đồng hồ đợc xác
định bằng biểu thức:
RC 1 , 1
1
f
giá trị tiêu biểu của các đại lợng trên là R = 10k và C= 150pF và tần số nhận
đợc là f = 606kHz và thời gian chuyển đổi sẽ mất là 110s
6
ADC0804
+5V
1 1 1
4 1 2 10
9 19
10k
150p
F
11 12 13 14 15 16 17 18
3 5
to
LE Ds
Nomally
Open STAR T
D0 D1 D2 D3 D4 D5 D6 D7
WR INTR
D GND RD CS CLK in CLK R
A GND Vref/2
Vin(-) Vin(+)
20 Vcc
10k
PO T
Trang 7Hình 3: Kiểm tra ADC0804 ở chế độ chạy tự do.
5 Chân ngắt INTR(ngắt hay gọi chính xác hơn là “kết thúc chuyển đổi’)
Đây là chân đầu ra tích cực mức thấp Bình thờng nó ở trạng thái cao và khi việc chuyển đổi hoàn tất thì nó xuống thấp để báo cho CPU biết là dữ liệu đợc chuyển đổi sẵn sàng để lấy đi Sau khi INTR xuống thấp, ta đặt CS = 0 và gửi một xung cao -xuống - thấp tới chân RDlấy dữ liệu ra của ADC0804
6 Chân Vin (+) và Vin (-)
Đây là các đầu vào tơng tự vi sai mà Vin = Vin (+) - Vin (-) Thông thờng Vin (-)
đợc nối xuống đất và Vin (+) đợc dùng nh đầu vào tơng tự đợc chuyển đổi về dạng số
7 Chân VCC
Đây là chân nguồn nuối +5v, nó cũng đợc dùng nh điện áp tham chiếu khi đầu vào Vref/2 (chân 9) để hở
8 Chân Vref/2
Chân 9 là một điện áp đầu vào đợc dùng cho điện áp tham chiếu Nếu chân này
hở (không đợc nối) thì điện áp đầu vào tơng tự cho ADC0804 nằm trong dải 0 đến +5v (giống nh chân VCC) Tuy nhiên, có nhiều ứng dụng mà đầu vào tơng tự áp đến Vin cần phải khác ngoài dải 0 đến 5v Chân Vref/2 đợcdùng để thực thi các điện áp đầu vào khác ngoài dải 0 - 5v Ví dụ, nếu dải đầu vào tơng tự cần phải là 0 đến 4v thì Vref/2 đợc nối với +2v
Bảng 12.5 biểu diễn dải điện áp Vin đối với các đầu vào Vref/2 khác nhau
Bảng 12.5: Điện áp Vref/2 liên hệ với dải Vin
V ref / 2(V) V in (V) Step Size (mV)
Ghi chú: - VCC = 5V
- * Khi Vref/2 hở thì đo đợc ở đó khoảng 2,5V
- Kích thớc bớc (độ phân dải) là sự thay đổi nhỏ nhất mà ADC có thể phân biệt đợc
Trang 89 Các chân dữ liệu D0 - D7.
Các chân dữ liệu D0 - D7 (D7 là bít cao nhất MSB và D0 là bít thấp nhất LSB)
là các chân đầu ra dữ liệu số Đây là những chân đợc đệm ba trạng thái và dữ liệu đợc chuyển đổi chỉ đợc truy cập khi chân CS = 0 và chân RDbị đa xuống thấp Để tính
điện áp đầu ra ta có thể sử dụng công thức sau:
buoc thuoc kich
V
out
Với Dout là đầu ra dữ liệu số (dạng thập phân) Vin là điện áp đầu vào tơng tự và
độ phân dải là sự thay đổi nhỏ nhất đợc tính nh là (2 Vref/2) chia cho 255 đối với ADC 8 bít
10.Chân đất t ơng tự và chân đất số
Đây là những chân đầu vào cấp đất chung cho cả tín hiệu số và tơng tự Đất
t-ơng tự đợc nối tới đất của chân Vin tơng tự, còn đất số đợc nối tới đất của chân Vcc Lý
do mà ta phải có hai đất là để cách ly tín hiệu tơng tự Vin từ các điện áp ký sinh tạo ra việc chuyển mạch số đợc chính xác Trong phần trình bày của chúng ta thì các chân này đợc nối chung với một đất Tuy nhiên, trong thực tế thu đo dữ liệu các chân đất này đợc nối tách biệt
Từ những điều trên ta kết luận rằng các bớc cần phải thực hiện khi chuyển đổi dữ liệu bởi ADC0804 là:
a) Bật CS = 0 và gửi một xung thấp lên cao tới chân WRđể bắt đầu chuyển đổi
b) Duy trì hiển thị chân INTR Nếu INTRxuống thấp thì việc chuyển đổi đợc hoàn tất
và ta có thể sang bớc kế tiếp Nếu INTRcao tiếp tục thăm dò cho đến khi nó xuống thấp
c) Sau khi chân INTRxuống thấp, ta bật CS = 0 và gửi một xung cao - xuống - thấp
đến chân RDđể lấy dữ liệu ra khỏi chíp ADC0804 Phân chia thời gian cho quá trình này đợc trình bày trên hình 4
Hình 4: Phân chia thời gian đọc và ghi của ADC0804.
8
CS
D0 –
Read it
End conversion
Start conversion
WR INTR
RD
Trang 9II Thiết kế phần cứng:
1.Lu đồ thuật toán :
Bắt đầu
Kiểm tra thang đo
Chuyển đổi A-D Tát led
Thang đo x đ ợc chọn (x ứng với thang đo
1,2,3)
Không có thang đo
nào đ ơc chọn
Tính giá trị đo đ ợc
Hiển thị led 7 thanh
Trang 102.Khối nguồn và khối chọn thang đo:
Nguồn vào đợc ổn áp qua IC LM7805 ,điện áp ra ổn định ở mức 5V.Que đo
d-ơng (+) đợc nối vào chuyển mạch để qua các điện trở (220k,16k,3.3k,4,7k) và biến trở (R9,R10) nhằm phân áp cho đầu vào của IC 0804 chuyển đổi giá trị điện
áp ở dạng tơng tự sang dạng số.Chọn IC 0804 đo giá trị cao nhất là 5V vậy nên các điện trở phân áp đợc tính để cho điện áp vào lớn nhất với thang đo tơng ứng
đợc cấp vào IC 0804 là 5V.Chuyển mạch có 2 tiếp điểm đối xng nhau nhằm chọn mức phân áp và báo cho vi điều khiển biết phần cứng đang chọn thang đo nào (thang đo 250v,25v,5v), nhờ đó vi điều khiển có thể tính đợc giá trị đo đợc thực tế ứng với giá trị từ ADC 0804 gửi lên.Ví dụ:chọn thang đo 25 volt mà giá trị ADC
0804 gửi lên là 100volt thì giá trị thực tế cần đo là (100/255)*25=9.803volt
3.Khối hiển thị :
10
Trang 11Khối hiển thị gồm led 7 thanh để hiển thị kết quả và 3 led đơn để hiển thị thang
đo đợc chọn Các loại led đợc chọn là led A chung vì nếu chọn led K chung khi led sáng dòng điện sẽ đi từ vi điều khiển đi ra gây sụt áp trên vi điều khiển dẫn
đến vi điều khiển hoạt động không chính xác Mạch điện phần cứng cũng đợc thêm công tắc reset nhằm khởi động lại hệ thống khi hoạt động bị lỗi, công tắc cấp nguồn 5V để hiểu chỉnh cầu phân áp đầu vào Các transistor đợc dùng để kích dòng cho led 7 thanh, tín hiệu từ vi điều khiển tác động vào cực B của tran
để điều khiển các led 7 thanh hiển thị
4.Mạch nguyên lý :
Trang 12III Ch¬ng tr×nh ®iÒu khiÓn :
/*khai bao cac thu vien can dung*/
#include<reg52.h>
#include<math.h>
#include<stdio.h>
//khai bao cac chan dieu khien ADC 0804
sbit adc_intr=P1^2; //chan INTR cua adc0804 noi voi P1.2 sbit adc_rd=P1^0; //chan RD cua adc0804 noi voi P1.0
sbit adc_rw=P1^1; //chan RW cua adc0804 noi voi P1.1
//khai bao cac chan dieu khien led 7 thanh
sbit led1=P2^4; //hien thi dien ap do duoc bang 4 led 7 thanh, sbit led2=P2^5; //led1 noi voi P2.4;led2 noi voi P2.5
//khai bao cac chan xac dinh thang do
sbit thang_do1=P2^0;//thang do 250v
sbit thang_do2=P2^1;//thang do 25v
sbit thang_do3=P2^2;//thang do 5v
sbit den1 = P1^4;
sbit den2 =P1^5;
sbit den3 =P1^6;
//khai bao cac bien
unsigned int x;
12
Trang 13unsigned char
tram,chuc,donvi,phan1,phan2,phan3,phan_nguyen,phan_phan,i;
float volt,giatri;
//khai bao mang cac so hien thi tren led 7 thanh
unsigned char
font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //mang chu so khong chua dau cham dp
unsigned char
font1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //mang chu so chua dau cham dp
/*cac ham con*/
//ham tao tre voi thoi gian j us
void delay_us(unsigned int j)
{
unsigned int n;
for(n=0;n<j;n++);
//lap j lan de tao tre
}
//ham dieu khien ADC0804
/* adc_rw=P1^1, de bat dau chuyen doi can 1 xung thap len cao
adc_rd=P1^2, tao xung cao xuong thap se doc du lieu tu ADC */
void dieu_khien_adc(void)
{
adc_rd=0;
adc_rw=0; // dat P1.1=0
delay_us(2);
adc_rw=1; //dat P1.1=1 de bat dau chuyen doi
while(!adc_intr);//cho bien doi xong
//ket thuc chuyen doi cho phep doc ADC
x=P3;//doc gia tri tu ADC vao bien x
}
/*ham hien thi len led 7 thanh*/
void hien_thi(void)
{
volt=giatri*1000; //gia tri - dien ap do duoc duoi dang so thap phan,can chuyen doi thanh so nguyen de hien thi
volt=(long int)(volt);
phan_nguyen=volt/1000; //tach lay phan nguyen
phan_phan=(long int)(volt)%1000; //tach lay phan phan //quet led hien thi
//hien thi mot so phan nguyen,ba so phan thap phan
if(phan_nguyen<10)
{ donvi=phan_nguyen;