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
1
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.
2
II- Sơ đồ các chân và chức năng
1.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
3
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
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(-)
5
Phần 2
THIT K MCH O P
I. Giới thiệu về ADC0804:
1- Các thiết bị ADC.:
Cá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 nh-
ng 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 110às. 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
RD
thì đầ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
WR
tạ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ự V
in
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.
6
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:
RC1,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à 110às.
Hì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
RD
lấy dữ liệu ra của ADC0804.
6. Chân V
in
(+) và V
in
(-).
7
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
Đây là các đầu vào tơng tự vi sai mà V
in
= V
in
(+) - V
in
(-). Thông thờng V
in
(-)
đợc nối xuống đất và V
in
(+) đợc dùng nh đầu vào tơng tự đợc chuyển đổi về dạng số.
7. Chân V
CC
.
Đâ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 V
ref/2
(chân 9) để hở.
8. Chân V
ref/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 V
CC
). Tuy nhiên, có nhiều ứng dụng mà đầu vào tơng tự áp đến V
in
cần
phải khác ngoài dải 0 đến 5v. Chân V
ref/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ì V
ref/2
đợc nối
với +2v.
Bảng 12.5 biểu diễn dải điện áp V
in
đối với các đầu vào V
ref/2
khác nhau.
Bảng 12.5: Điện áp V
ref/2
liên hệ với dải V
in
.
V
ref
/ 2(V) V
in
(V) Step Size (mV)
Hở * 0 đến 5 5/256 = 19.53
2.0 0 đến 4 4/255 = 15.62
1.5 0 đến 3 3/256 = 11.71
1.28 0 đến 2.56 2.56/256 = 10
1.0 0 đến 2 2/256 = 7.81
0.5 0 đến 1 1/256 = 3.90
Ghi chú: - V
CC
= 5V
- * Khi V
ref
/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.
9. 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
RD
bị đa xuống thấp. Để tính
điện áp đầu ra ta có thể sử dụng công thức sau:
buocthuockich
V
D
in
out
=
Với D
out
là đầu ra dữ liệu số (dạng thập phân). V
in
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 ì V
ref
/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 V
in
tơng tự, còn đất số đợc nối tới đất của chân V
cc
. Lý
do mà ta phải có hai đất là để cách ly tín hiệu tơng tự V
in
từ các điện áp ký sinh tạo ra
8
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
INTR
xuố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
INTR
cao tiếp tục thăm dò cho đến khi nó xuống
thấp.
c) Sau khi chân
INTR
xuố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.
II. Thiết kế phần cứng:
9
CS
D0
D7
Data out
Read it
End
conversion
Start
conversion
WR
INTR
RD
1.Lu đồ thuật toán :
2.Khối nguồn và khối chọn thang đo:
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
10
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.
11
3.Khối hiển thị :
Khố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ý :
12
III. 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
sbit led3=P2^6; //led3 noi voi P2.6
sbit led4=P2^7; //led4 noi voi P2.7
//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;
13
sbit den2 =P1^5;
sbit den3 =P1^6;
//khai bao cac bien
unsigned int x;
unsigned 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)
14
{
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;
phan1=phan_phan/100;
phan2=(phan_phan%100)/10;
phan3=(phan_phan%100)%10;
//hien thi tren led7
for(i=0;i<50;i++)
{
led1=1;
led2=led3=led4=0;
P0=font1[donvi];//font co dau cham dp
delay_us(100);
led2=1;
led1=led3=led4=0;
P0=font[phan1];//font khong co dau dp
delay_us(100);
led3=1;
led1=led2=led4=0;
P0=font[phan2];//font khong co dau dp
delay_us(100);
led4=1;
led1=led2=led3=0;
P0=font[phan3];
delay_us(100);
}
15
}
//hien thi hai so phan nguyen , hai so phan thap phan
if((phan_nguyen>=10)&&(phan_nguyen<100))
{
chuc=phan_nguyen/10;
donvi=phan_nguyen%10;
phan1=phan_phan/100;
phan2=(phan_phan%100)/10;
for(i=0;i<50;i++)
{
led1=1;
led2=led3=led4=0;
P0=font[chuc];//font khong co dau dp
delay_us(100);
led2=1;
led1=led3=led4=0;
P0=font1[donvi];//font co dau dp
delay_us(100);
led3=1;
led1=led2=led4=0;
P0=font[phan1];//font khong co dau dp
delay_us(100);
led4=1;
led1=led2=led3=0;
P0=font[phan2];
delay_us(100);
}
}
//hien thi ba so phan nguyen, mot so phan phan
if((phan_nguyen>=100)&&(phan_nguyen<=250))
{
tram=phan_nguyen/100;
chuc=(phan_nguyen%100)/10;
16
donvi=(phan_nguyen%100)%10;
phan1=phan_phan/100;
for(i=0;i<50;i++)
{
led1=1;
led2=led3=led4=0;
P0=font[tram];//font khong co dau dp
delay_us(100);
led2=1;
led1=led3=led4=0;
P0=font[chuc];//font khong co dau dp
delay_us(100);
led3=1;
led1=led2=led4=0;
P0=font1[donvi];//font khong co dau dp
delay_us(100);
led4=1;
led1=led2=led3=0;
P0=font[phan1];
delay_us(100);
}
}
}
//ham tat led
void tat_led(void)
{
led1=led2=led3=led4=0;
P0=0xff;
}
/*ham chinh */
void main(void)
{
while(1)
{
17
//thang 250V
while(thang_do1==0)
{
den1=0;
den2=den3=1;
dieu_khien_adc();
giatri = (float)(250*x)/255;
if(giatri<=250)
hien_thi();
}
//thang 25V
while(thang_do2==0)
{
den2=0;
den1=den3=1;
dieu_khien_adc();
giatri=(float)(25*x)/255;
if(giatri<=25)
hien_thi();
}
//thanh 5V
while(thang_do3==0)
{
den3=0;
den1=den2=1;
dieu_khien_adc();
giatri=(float)(5*x)/255;
if(giatri<=5)
hien_thi();
}
while((thang_do1==1)&&(thang_do2==1)&&(thang_do3==1))
{
den1=den2=den3=1;
tat_led(); //khi cong tac thang off thi tat led
}
}
}
18
19
IV.kết luận :
1.Ưu điểm:
-Mạch có khả năng đo dải điện áp rộng
-Mạch có 3 thang đo nhằm tăng độ chính xác giá trị đo
-Mạch có tốc độ đo nhanh , chính xác v ổn định
-Mạch hiển thị thang đo và kết quả rõ ràng
-Mạch đợc thiết kế nhỏ gọn dễ sử dụng
20