+ PSEN (Program Store Enable): AT89C51 có 4 tín hiệu điều khiển. PSEN là tín hiệu ra trên chân 29, nó là tín hiệu điều khiển cho phép bộ nhớ chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các byte mã lệnh. PSEN sẽ ở mức thấp trong thời gian lấy 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 AT89C51 để 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).
+ ALE (Address Latch Enable): tín hiệu ra ALE trên chân 30. AT89C51dùng ALE để giải các bus địa chỉ và dữ liệu đa hợp. Khi port 0 vừa là bus dữ liệu vừa là byte thấp của địa chỉ, 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 đó, port 0 dùng để xuất hoặc nhập dữ liệu trong nữa sau chu kỳ của bộ nhớ.
+ EA (External Access): Tín hiệu vào EA trên chân 31 thường được mắc lên mức cao (+5V) hoặc mức thấp (GND). Nếu ở mức cao, AT89C51 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng. Nếu EA được nối mức thấp, bộ nhớ bên trong chương trình AT89C51 sẽ bị cấm và chương trình thi hành từ EPROM mở rộng. Người ta còn dùng chân EA làm chân cấp điện áp 21V khi lập trình cho EPROM trong AT89C51.
28 trang |
Chia sẻ: lynhelie | Lượt xem: 1096 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Đo và ổn định độ sáng phòng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Đề tài: Đo và ổn định độ sáng phịng
NéI DUNG B¸O C¸O :
I.Mục đích yêu cầu
II.S¬ ®å khèi tỉng qu¸t.
III.M¹ch nguyªn lý,tÝnh to¸n vµ m¹ch in.
IV.Lu ®å thuËt to¸n.
V.PhÇn mỊm ®iỊu khiĨn.
I. Mục đích yêu cầu
Trong thực tế, nhiều khi ta cần đo và ổn định độ sáng của một phịng, một tồ nhà...Mục đích của bài tốn này là thiết kế hệ thống đo và ổn định độ sáng phịng một cách tự động. Khoảng ánh sáng cần ổn định đựơc nhập vào theo yêu cầu sử dụng, hệ thống điều khiển sẽ đo và thay đổi độ sáng phịng theo yêu càu bằng cơ cấu rèm cửa và bĩng đèn.
II. Sơ đồ khối tổng quát
1.S¬ ®å khèi :
S¬ ®å khèi tỉng qu¸t cđa hƯ thèng ®o lêng vµ ®iỊu khiĨn lµ:
§èi tỵng cÇn ®o bÊt kú
SENSOR
BiÕn ®ỉi chuÈn ho¸
C¬ cÊu chÊp hµnh
M¹ch ®iỊu khiĨn
Ph¸t hiƯn sai
Møc chuÈn
I/O
So s¸nh
mP/mC/PC
A/D
ChØ thÞ kÕt qu¶
Tõ s¬ ®å khèi tỉng qu¸t, dùa theo yªu cÇu bµi to¸n ta cã s¬ ®å khèi cơ thĨ cđa m¹ch ®o vµ ®iỊu khiĨn ¸nh s¸ng lµ:
¸nh s¸ng
SENSOR
BiÕn ®ỉi chuÈn ho¸
C¬ cÊu chÊp hµnh
®iỊu khiĨn
MC
A/D
2.Giíi thiƯu c¸c linh kiƯn chÝnh:
a.Quang trë:
§Ỉc trng cđa c¸c c¶m biÕn ®iƯn trë lµ sù phơ thuéc cđa ®iƯn trë vµo th«ng lỵng bøc x¹ vµ phỉ cđa bøc x¹ ®ã.C¸c tÕ bµo quang dÉn lµ mét trong nh÷ng c¶m biÕn quang cã ®é nh¹y cao.C¬ së vËt lý cđa tÕ bµo quang dÉn lµ hiƯn tỵng quang dÉn do kÕt qu¶ cđa hiƯu øng quang ®iƯn néi:hiƯn tỵng gi¶i phãng h¹t t¶i ®iƯn trong vËt liƯu díi t¸c dơng cđa ¸nh s¸ng lµm t¨ng ®é dÉn cđa vËt liƯu.
Trong ®Ị tµi nµy ta dïng quang trë RCdS chÕ t¹o b»ng b¸n dÉn ®a tinh thĨ ®ång nhÊt.§é nh¹y cđa quang trë rÊt cao vµ cßn phơ thuéc vµo nhiƯt ®é lµm viƯc.§iƯn trë tèi cđa nã kho¶ng 104-109 «m ë 270c.§iƯn trë gi¶m rÊt nhanh khi ®é räi t¨ng,®¬n vÞ cđa ®é räi lµ:LUX.
b. Bộ chuyển đổi tương tự/số
Bộ chuyển đổi tương tự – số được sử dụng trong hệ thống là ADC 0809. Đây là IC được chế tạo theo công nghệ CMOS gồm một bộ chuyển đổi tươngtự - số 8 bit, bộ chọn 8 kênh và một bộ logic điều khiển tương thích.Bộ chuyển đổi AD 8 bit này dùng phương pháp chuyển đổi xấp xỉ liên tiếp. Bộ chọn kênh có thể truy xuất bất kỳ kênh nào trong các ngõ vào tương tự một cách độc lập.
Phương pháp ADC xấp xỉ liên tiếp (Successive- Approximation ADC) là một trong những phương pháp được sử dụng rộng rãi. Tuy mạch điện phức tạp nhưng thời gian chuyển đổi lại ngắn hơn. Phương pháp
chuyển đổi ADC xấp xỉ liên tiếp có thời gian chuyển đổi cố định không phụ thuộc vào điện áp ngõ vào.
VA
Clock
Start
EOC
V’A
+
-
DAC
Thanh ghi điều khiển
Logic điều khiển
MSB LSB
Sơ đồ khối chuyển đổi ADC dùng phương pháp xấp xỉ liên tiếp.
- Hoạt động:Khi tác động cạnh xuống của xung start thì ADC bắt đầu chuyển đổi. Mạch logic điều khiển set bit có nghĩa lớn nhất (MSB) của thanh ghi điều khiển lên mức cao và tất cả các bit còn lại ở mức thấp. Số nhị phân ra ở mạch thanh ghi điều khiển được qua mạch DAC để tạo ra điện áp tham chiếu V’a.
+ Nếu V’a >Va thì ngõ ra bộ so sánh xuống mức thấp, làm cho mạch logic điều khiển xóa bit MSB xuống mức thấp.
+ Nếu V’a<Va thì ngõ ra của bộ so sánh vẫn ở mức cao và làm cho mạch logic điều khiển giữ bit MSB ở mức cao.
Tiếp theo mạch logic điều khiển đưa bit có nghĩa kế bit MSB lên mức cao và tạo ở ngõ ra khối DAC một điện áp tham chiếu V’a rồi đem so sánh tương tự như bit MSB ở trên. Quá trình này cứ tiếp tục cho đến bit cuối cùng trong thanh ghi điều khiển. Lúc đó V’a gần bằng Va ngõ ra của mạch logic điều khiển báo kết thúc chuyển đổi.
Như vậy mạch đổi ra n bit chỉ mất n chu kỳ xung clock nên có thể đạt tốc độ rất cao. Tuy nhiên nhược điểm của phương pháp ADC xấp xỉ liên tiếp là không thể đáp ứng với tín hiệu tương tự vào biến đổi cực nhanh .
- Sơ đồ chân ADC 0809:
ADC0809
28 15
1 14
IN2 IN1 IN0 A B C ALE 2-1 2-2 2-3 2-4 2-8 REF 2-6
START
IN3 IN4 IN5 IN6 IN7
EOC 2-5 OE CLK VCC REF GND 2-7
- Chức năng các chân:
+ IN0 đến IN7 : 8 ngõ vào tương tự.
+ A, B, C : giải mã chọn 1 trong 8 ngõ vào
+ Z-1 đến Z-8 : ngõ ra song song 8 bit
+ ALE : cho phép chốt địa chỉ
+ START : xung bắt đầu chuyển đổi
+ CLK : xung đồng hồ
+ REF (+) : điện thế tham chiếu (+)
+ REF (-) : điện thế tham chiếu (-)
+ VCC : nguồn cung cấp
- Các đặc điểm của ADC 0809:
+ Độ phân giải 8 bit
+ Tổng sai số chưa chỉnh định ± ½ LSB; ± 1 LSB
+ Thời gian chuyển đổi: 100ms ở tần số 640 kHz
+ Nguồn cung cấp + 5V
+ Điện áp ngõ vào 0 – 5V
+ Tần số xung clock 10kHz – 1280 kHz
+ Nhiệt độ hoạt động - 40oC đến 85oC
+ Dễ dàng giao tiếp với vi xử lý hoặc dùng riêng
+ Không cần điều chỉnh zero hoặc đầy thang
- Nguyên lý hoạt động: ADC 0809 có 8 ngõ vào tương tự, 8 ngõ ra 8 bit có thể chọn 1 trong 8 ngõ vào tương tự để chuyển đổi sang số 8 bit.
Các ngõ vào được chọn bằng cách giải mã. Chọn 1 trong 8 ngõ vào tương tự được thực hiện nhờ 3 chân ADDA , ADDB , ADDC như bảng trạng thái sau:
A
B
C
Ngõ vào được chọn
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
Sau khi kích xung start thì bộ chuyển đổi bắt đầu hoạt động ở cạnh xuống của xung start, ngõ ra EOC sẽ xuống mức thấp sau khoảng 8 xung clock (tính từ cạnh xuống của xung start). Lúc này bit có trọng số lớn nhất (MSB) được đặt lên mức 1, tất cả các bit còn lại ở mức 0, đồng thời tạo ra điện áp có giá trị Vref/2, điện thế này được so sánh với điện thế vào Vin.
+ Nếu Vin > Vref/2 thì bit MSB vẫn ở mức 1.
+ Nếu Vin < Vref/2 thì bit MSB vẫn ở mức 0.
Tương tự như vậy bit kế tiếp MSB được đặt lên 1 và tạo ra điện thế có giá trị Vref/4 và cũng so sánh với điện áp ngõ vào Vin. Quá trình cứ tiếp tục như vậy cho đến khi xác định được bit cuối cùng. Khi đó chân EOC lên mức 1 báo cho biết đã kết thúc chuyển đổi.
Trong suốt quá trình chuyển đổi chân OE được đặt ở mức 1, muốn đọc dữ liệu ra chân OE xuống mức 0, nếu có 1 xung start tác động thì ADC sẽ ngưng chuyển đổi. Mã ra N cho một ngõ vào tùy ý là một số nguyên.
Trong đó: Vin : điện áp ngõ vào hệ so sánh.
Vref(+) : điện áp tại chân REF(+).
Vref(-) : điện áp tại chân REF(-).
Nếu chọn Vref(-) = 0 thì N = 256.
Vref(+) = Vcc = 5V thì đầy thang là 256.
Giá trị bước nhỏ nhất: 1 LSB = = 0,0196 V/byte
Vậy với 256 bước điện áp vào lớn nhất của ADC0809 là Vin = 5V.
- Mạch tạo xung clock cho ADC 0809: Sử dụng mạch dao động dùng các cổng NOT để tạo dao động cho ADC như sau:
Vcc
500 pF
10K
IK
IK
Tần số dao động của mạch là f =
Tần số dao động chuẩn là 600 kHz
Suy ra 640 =
Với R từ 100W đến vài kW. Ta chọn R =1 kW Þ C = 500 pF.
c.Bộ vi điều khiển
Hệ thống sử dụng bộ vi điều khiển AT89C51 có các đặc điểm sau :
+ 4 kbyte ROM, 128 bit RAM.
+ 4 port vào ra 8 bit.
+ 2 bộ định thời 16 bit.
+ 1 port nối tiếp.
+ 64 KB không gian bộ nhớ chương trình mở rộng.
+ 64 KB không gian bộ nhớ dữ liệu mở rộng.
- Sơ đồ khối bộ vi điều khiển AT89C51
TXD RXD
P0 P1 P2 P3
EA\ RST PSEN ALE
C¸c thanh ghi
RAM / ROM
§iỊu khiĨn ng¾t
§iỊu khiĨn Bus
CPU
Port nèi tiÕp
C¸c port I/O
T¹o dao ®éng
§Õm / §Þnh thêi
XTAL
Ng¾t ngoµi
Timer
- Sơ đồ chân bộ vi điều khiển AT89C51
AT89C51
EA/VP
31
X1
19
X2
18
RESET
9
P3.2
12
P3.3
13
P3.4
14
P3.5
15
P1.0
1
P1.1
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
P1.7
8
P0.0
39
P0.1
38
P0.2
37
P0.3
36
P0.4
35
P0.5
34
P0.6
33
P0.7
32
P2.0
21
P2.1
22
P2.2
23
P2.3
24
P2.4
25
P2.5
26
P2.6
27
P2.7
28
P3.7
17
P3.6
16
PSEN
29
ALE/P
30
P3.1
11
P3.0
10
VCC
40
VSS
20
Sơ đồ chân AT89C51
- Chức năng các chân:
+ Port0: là port đa hợp từ chân 32 đến 39. Nếu không dùng bộ nhớ mở rộng nó có chức năng như các đường vào ra. Đối với các thiết kế sử dụng bộ nhớ mở rộng nó còn được sử dụng làm các đường địa chỉ.
+ Port1: là một port vào ra từ chân 1 đến 8. Các chân được ký hiệu P1.0, P1.1, P1.2 P1.8 có thể dùng cho các thiết bị ngoài nếu cần. Port1 chỉ được dùng trong giao tiếp với các thiết bị ngoài.
+ Port2: là một port có công dụng kép từ chân 21 đến 28, được dùng như các đườ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.
+ Port3: từ chân 10 đến 17. Các chân của port này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tính đặc biệt của AT89C51 như ở bảng sau :
Bit
Tên
Chức năng chuyển đổi
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
RXD
TXD
INTO
INT1
T0
T1
WR
RD
Dữ liệu nhận cho port nối tiếp
Dữ liệu phát cho port nối tiếp
Ngắt 0 bên ngoài
Ngắt 1 bên ngoài
Ngõ vào của timer/counter 0
Ngõ vào của timer/counter 1
Xung ghi bộ nhớ dữ liệu ngoài
Xung đọc bộ nhớ dữ liệu ngoài
+ PSEN (Program Store Enable): AT89C51 có 4 tín hiệu điều khiển. PSEN là tín hiệu ra trên chân 29, nó là tín hiệu điều khiển cho phép bộ nhớ chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các byte mã lệnh. PSEN sẽ ở mức thấp trong thời gian lấy 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 AT89C51 để 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).
+ ALE (Address Latch Enable): tín hiệu ra ALE trên chân 30. AT89C51dùng ALE để giải các bus địa chỉ và dữ liệu đa hợp. Khi port 0 vừa là bus dữ liệu vừa là byte thấp của địa chỉ, 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 đó, port 0 dùng để xuất hoặc nhập dữ liệu trong nữa sau chu kỳ của bộ nhớ.
+ EA (External Access): Tín hiệu vào EA trên chân 31 thường được mắc lên mức cao (+5V) hoặc mức thấp (GND). Nếu ở mức cao, AT89C51 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng. Nếu EA được nối mức thấp, bộ nhớ bên trong chương trình AT89C51 sẽ bị cấm và chương trình thi hành từ EPROM mở rộng. Người ta còn dùng chân EA làm chân cấp điện áp 21V khi lập trình cho EPROM trong AT89C51.
Mạch reset
+ RST (Reset): Ngõ vào RST trên chân 9 là ngõ reset của AT89C51. Khi tín hiệu này được đưa lên mứùc cao trong ít nhất 2 chu kỳ, các thanh ghi trong AT89C51 sẽ được thiết lập về những giá trị thích hợp để khởi động hệ thống. RST có thể được kích khi cấp điện dùng một mạch R-C. Sơ đồ mạch Reset được sử dụng trong hệ thống:
Trạng thái của tất cả các thanh ghi của AT89C51/8031 sau khi reset hệ thống được tóm tắt trong bảng sau:
Thanh ghi
Nội dung
Đếm chương trình
Tích lũy
B
PSW
SP
DPTR
Port 0-3
IP
IE
Các thanh ghi định thời
SCON
SBUF
PCON(HMOS)
PCON(CMOS)
0000H
00H
00H
00H
07H
0000H
FFH
XXX00000B
0XX00000B
00H
00H
00H
0XXXXXXB
0XXX0000B
+ Các ngõ vào bộ dao động trên chip: Như đã thấy trong các hình trên, AT89C51 có một bộ dao động trên chip. Nó thường được nối với thạch anh giữa hai chân 18 và 19. Tần số thạch anh thông thường là 12MHz.
+ Các chân nguồn: AT89C51 vận hành với nguồn đơn +5V. Vcc được nối vào chân 40 và Vss (GND) được nối vào chân 20.
d.Cấu trúc của động cơ bước
H×nh: CÊu trĩc cđa motor bíc.
Ho¹t ®éng cđa ®éng c¬ bíc:
C¸c cuén d©y ®ỵc cÊp dßng theo mét vßng trßn, mçi chu k× cÊp dßng ®éng c¬ quay ®ỵc 1 vßng.
AA'
t
BB'
t
CC'
t
DD'
t
H×nh: Ho¹t ®éng cđa tõng cuén d©y trong motor bíc.
A
B
C
D
Step motor
H×nh: S¬ ®å nguyªn lÝ cđa khèi khuÕch ®¹i c«ng suÊt ®éng c¬.
Bé khuÕch ®¹i c«ng suÊt sư dơng 1 transitor c«ng suÊt cho mçi cuén d©y:
"ABCD"= "0001" ® "0010" ® "0100" ® "1000" ® "0001" ......
® "ABCD" thùc hiƯn lƯnh dÞch 4 lÇn, ®éng c¬ quay 1 vßng.
Gi¶ sư ®éng c¬ quay 1000vßng/phĩt ®Õn 10000vßng/phĩt trong kho¶ng T1 ®Õn T2.
Ta cã c«ng thøc: Dn=kDT
n1=1000vßng/phĩt = 16,6vßng/gi©y
® "ABCD" quay16,6x4lÇn = 66,4lÇn/gi©y.
Víi xung nhÞp = 17,4kHz ® cø 17,4kHz/66.4=262 xung =¶1 "ABCD" quay 1 lÇn.
n2=10000vßng phĩt, t¬ng tù trªn, 26 xung =¶2 "ABCD" quay 1 lÇn.
Khi nhiƯt ®é biÕn thiªn tõ T0 ®Õn T8, th× biÕn chØ b¸o nhiƯt ®é VT biÕn thiªn tõ 000.0000.0000b ®Õn 8x255=2040=111.1111.1000b.
®1/26-1/262=kx2040
® k=1.69.10-5
Khi ë nhiƯt ®é TX ® 1/¶ - 1/262 = 1,69.10-5x(VT-0)
¶ = 59172/(VT+227).
Nh vËy, víi tÇn sè xung lµ 17,4kHz th× cø ¶ xung th× "ABCD" quay 1 lÇn.
III.S¬ ®å nguyªn lý,tÝnh to¸n vµ m¹ch in.
1.S¬ ®å nguyªn lý.
2.TÝnh to¸n khèi c¶m biÕn.
Theo c«ng thøc ph©n ¸p cã:
Ura=Vcc.Rm/ (RCdS+Rm) (3.1)
suy ra
mặt khác ta cĩ quan hệ giữa Ura và Uso là:
(3.2)
(với Uso là điện áp sau khi chuyển đổi A/D)
A/D
Uso
Ura
thay vào biểu thức trên ta được
E1
E
Rcds
E2
R1
R2
(3.3)
Đồ thị biểu thị sự phụ thuộc của điện trở CDS vào độ sáng
coi gần đúng sự phụ thuộc trên là tuyến tính, ta cĩ:
E = b – a.R (3.4)
bằng thực nghiệm ta xác định được cặp các giá trị R1, R2 tương ứng với E1, E2 , từ đĩ ta xác định được các hệ số a,b. ta cĩ:
E1 = b - a.R1
E2 = b – a.R2
từ đĩ suy ra:
với E1= 1000, đo được R1=1800W
E2=500, đo được R2=27090W
Þ a=0,55 ; b=2000
thay biểu thức (2.3) vào (2.4) ta tìm được biểu thức liên hệ giữa tín hiệu sau bộ A/D và độ sáng là:
(3.5)
chọn Rm =
3.Sơ đồ mạch in
Sơ đồ lớp trên và lớp dưới
Sơ đồ mạch in tổng quát
IV. Lưu đồ thuật tốn
Begin
Khëi t¹o
KiĨm tra cã ng¾t nèi tiÕp kh«ng ?
Thay ®ỉi gi¸ trÞ mÉu
HiĨn thÞ ra ®Ìn LED
KiĨm tra cã ng¾t ®Þnh thêi kh«ng?
NhËn d÷ liƯu tõ c¶m biÕn
Xư lÝ d÷ liƯu vµ ®a tÝn hiƯu t¬ng øng ra c¬ cÊu chÊp hµnh
HiĨn thÞ ra ®Ìn LED c¸c gi¸ trÞ vỊ ¸nh s¸ng
V. Phần mềm điều khiển
Ch¬ng tr×nh ®ùoc viÕt b»ng ng«n ng÷ lËp tr×nh C trªn m«i trêng RIDE
Ch¬ng tr×nh ®ỵc chia thµnh 5 module chÝnh:
Module khai b¸o
Module ®iỊu khiĨn ADC
Module hiĨn thÞ
Module nh¹p gi¸ trÞ mÉu
Module xư lÝ chÝnh
Sau ®©y la code cơ thĨ cđa phÇn mỊm ®iỊu khiĨn:
//************************************************************
Module khai b¸o: ®©y lµ 1 tƯp tiªu ®Ị ®Ỉt tªn lµ “define.h”
//************************************************************
#include
#include
#include
#include
//Dinh nghia cac cong
at 0x80 sbit CTRL0;
at 0x81 sbit CTRL1;
at 0x82 sbit CTRL2;
at 0x83 sbit CTRL3;
at 0x84 sbit START_ALE;
at 0x85 sbit OE_ADC;
at 0x86 sbit PhimTang;
at 0x87 sbit PhimGiam;
sbit Enter = P3^2;
sbit Kich = P3^4;
sbit Chuyen = P3^7;
at 0xA0 sbit b0;
at 0xA1 sbit b1;
at 0xA2 sbit b2;
at 0xA3 sbit b3;
at 0xA4 sbit Q0;
at 0xA5 sbit Q1;
at 0xA6 sbit Q2;
at 0xA7 sbit Q3;
//************************************************************
Module nhËp gi¸ trÞ mÉu: Module nµy cã chøc n¨ng thay ®ỉi gi¸ trÞ mÉu nhiƯt ®é cÇn ỉn ®Þnh
//************************************************************
#include
//Khai bao cac bien
extern unsigned int E, EDuoi, ETren;
//Khai bao cac ham
void HienthiLEDDuoi(); //Display to 7 bar LED gia tri can duoi
void HienthiLEDTren(); //Display to 7 bar LED gia tri can tren
void Hienthi(unsigned time);
void Delay(unsigned int time);
void ThietLap()interrupt 0; //Ngat ngoai 0
//------------------------------------------------------------------------------------
void ThietLap()interrupt 0 //Ngat ngoai 0
{
bit NhapXong;
Delay(100);
EX0=0;//Vo hieu hoa ngat ngoai 0
while (Enter==0) {};
NhapXong=0;
while (NhapXong==0)
{
while ((PhimTang==1)&&(PhimGiam==1)&&(Chuyen==1))
{
HienThiLEDDuoi();
}
if (Chuyen==0)
{
NhapXong=1;
while (Chuyen==0) {};
}
else
{
if (PhimTang==0) {EDuoi=EDuoi+1;}
if (PhimGiam==0) {EDuoi=EDuoi-1;}
while ((PhimTang==0)||(PhimGiam==0))
{
HienThiLEDDuoi();
}
}
}
NhapXong=0;
while (NhapXong==0)
{
while ((PhimTang==1)&&(PhimGiam==1)&&(Chuyen==1))
{
HienThiLEDTren();
}
if (Chuyen==0)
{
NhapXong=1;
while (Chuyen==0) {};
}
else
{
if (PhimTang==0) {ETren=ETren+1;}
if (PhimGiam==0) {ETren=ETren-1;}
while ((PhimTang==0)||(PhimGiam==0))
{
HienThiLEDTren();
}
}
}
Hienthi(2);
EX0=1; //Cho phep ngat ngoai 0 hoat dong tro lai
Delay(100);
}
//-----------------------------------------------------------------------------------------
//************************************************************
Module ®iỊu khiĨn ADC0809
//************************************************************
#include
void Delay(unsigned int time);
void Hienthi(unsigned time);
//-----------------------------------------------------------------
unsigned char QuetDuLieuSo()
{
unsigned char so,i;
unsigned int Sum;
Sum=0;
for (i=0; i<20; i++)
{
START_ALE=1;
START_ALE=0;
Hienthi(1); //Doi cho ADC chuyen doi xong
P1=0xFF;
OE_ADC=1;
so=P1; //Lay du lieu ve anh sang
OE_ADC=0;
Sum = Sum + so;
}
so = Sum/20;
return so;
}
//-----------------------------------------------------------------------
unsigned int AnhSang(unsigned char so)
{
unsigned int tg;
tg=4*so-4;
return tg;
}
//----------------------------------------------------------------------
//************************************************************
Module ®iỊu khiĨn hiĨn thÞ ra ®Ìn LED
//************************************************************
#include
// Variables used in this program
extern unsigned int E, EDuoi, ETren;
bit Q0_hn, Q1_hn, Q2_hn, Q3_hn, Q0_ht, Q1_ht, Q2_ht, Q3_ht,
Q0_hc, Q1_hc, Q2_hc, Q3_hc, Q0_hdv, Q1_hdv, Q2_hdv, Q3_hdv;
//Functions used in this program
void Delay(unsigned int time);
void Khoitaoht(unsigned char gt);
void Khoitaohc(unsigned char gt);
void Khoitaohdv(unsigned char gt);
void Khoitao(unsigned int num);
void HienthiLEDHienThoi(); //Display to 7 bar LED gia tri anh sang hien thoi
void HienthiLEDDuoi(); //Display to 7 bar LED gia tri anh sang can duoi
void HienthiLEDTren(); //Display to 7 bar LED gia tri anh sang can tren
void Hienthi(unsigned int time);
void Duavao7447(bit bi0,bit bi1,bit bi2,bit bi3);
//------------------------------------------------------------------------
//Noi dung cac ham
//------------------------------------------------------------------------
void TatLED()
{
Q3_hn=1; Q2_hn=1; Q1_hn=1; Q0_hn=1;
Q3_ht=1; Q2_ht=1; Q1_ht=1; Q0_ht=1;
Q3_hc=1; Q2_hc=1; Q1_hc=1; Q0_hc=1;
Q3_hdv=1; Q2_hdv=1; Q1_hdv=1; Q0_hdv=1;
}
//--------------------------------------------------------------------------------
void Khoitaohn(unsigned char gt)
{
Q0_hn=(gt&0x01)?1:0;
Q1_hn=(gt&0x02)?1:0;
Q2_hn=(gt&0x04)?1:0;
Q3_hn=(gt&0x08)?1:0;
}
//--------------------------------------------------------------------------------
void Khoitaoht(unsigned char gt)
{
Q0_ht=(gt&0x01)?1:0;
Q1_ht=(gt&0x02)?1:0;
Q2_ht=(gt&0x04)?1:0;
Q3_ht=(gt&0x08)?1:0;
}
//--------------------------------------------------------------------------------
void Khoitaohc(unsigned char gt)
{
Q0_hc=(gt&0x01)?1:0;
Q1_hc=(gt&0x02)?1:0;
Q2_hc=(gt&0x04)?1:0;
Q3_hc=(gt&0x08)?1:0;
}
//--------------------------------------------------------------------------------
void Khoitaohdv(unsigned char gt)
{
Q0_hdv=(gt&0x01)?1:0;
Q1_hdv=(gt&0x02)?1:0;
Q2_hdv=(gt&0x04)?1:0;
Q3_hdv=(gt&0x08)?1:0;
}
//--------------------------------------------------------------------------------
void Khoitao(unsigned int num)
{
unsigned char th,d;
d=num%10; th=num/10;
Khoitaohdv(d);
d=th%10; th=th/10;
Khoitaohc(d);
d=th%10; th=th/10;
Khoitaoht(d);
Khoitaohn(th);
}
//---------------------------------------------------------
void Duavao7447(bit bi0,bit bi1,bit bi2,bit bi3)
{
Q0=bi0;
Q1=bi1;
Q2=bi2;
Q3=bi3;
}
//---------------------------------------------------------
void HienThiLEDHienThoi()
{
Khoitao(E);
Duavao7447(Q0_hn,Q1_hn,Q2_hn,Q3_hn);
b3 = 0; b2 = 0; b1 = 0; b0 = 0;
Delay(100);
Duavao7447(Q0_ht,Q1_ht,Q2_ht,Q3_ht);
b3 = 0; b2 = 0; b1 = 0; b0 = 1;
Delay(100);
Duavao7447(Q0_hc,Q1_hc,Q2_hc,Q3_hc);
b3 = 0; b2 = 0; b1 = 1; b0 = 0;
Delay(100);
Duavao7447(Q0_hdv,Q1_hdv,Q2_hdv,Q3_hdv);
b3 = 0; b2 = 0; b1 = 1; b0 = 1;
Delay(100);
}
//------------------------------------------------------------------
void HienThiLEDDuoi()
{
Khoitao(EDuoi);
Duavao7447(Q0_hn,Q1_hn,Q2_hn,Q3_hn);
b3 = 0; b2 = 1; b1 = 0; b0 = 0;
Delay(100);
Duavao7447(Q0_ht,Q1_ht,Q2_ht,Q3_ht);
b3 = 0; b2 = 1; b1 = 0; b0 = 1;
Delay(100);
Duavao7447(Q0_hc,Q1_hc,Q2_hc,Q3_hc);
b3 = 0; b2 = 1; b1 = 1; b0 = 0;
Delay(100);
Duavao7447(Q0_hdv,Q1_hdv,Q2_hdv,Q3_hdv);
b3 = 0; b2 = 1; b1 = 1; b0 = 1;
Delay(100);
}
//------------------------------------------------------------------
void HienThiLEDTren()
{
Khoitao(ETren);
Duavao7447(Q0_hn,Q1_hn,Q2_hn,Q3_hn);
b3 = 1; b2 = 0; b1 = 0; b0 = 0;
Delay(100);
Duavao7447(Q0_ht,Q1_ht,Q2_ht,Q3_ht);
b3 = 1; b2 = 0; b1 = 0; b0 = 1;
Delay(100);
Duavao7447(Q0_hc,Q1_hc,Q2_hc,Q3_hc);
b3 = 1; b2 = 0; b1 = 1; b0 = 0;
Delay(100);
Duavao7447(Q0_hdv,Q1_hdv,Q2_hdv,Q3_hdv);
b3 = 1; b2 = 0; b1 = 1; b0 = 1;
Delay(100);
}
//------------------------------------------------------------------
void Delay(unsigned int time)
{
unsigned int i;
for (i=0;i<=time;i++);
}
//--------------------------------------------------------------
void Hienthi(unsigned time)
{
unsigned int i;
for (i=0;i<=time;i++)
{
void HienthiLEDHienThoi();
void HienthiLEDDuoi();
void HienthiLEDTren();
}
}
//************************************************************
Module chÝnh cđa ch¬ng tr×nh
//************************************************************
#include
//Khai bao cac bien dung trong chuong trinh
unsigned char Eso, Solantran;
unsigned int E, EDuoi, ETren, BuocRem;
//Cac ham dung trong chuong trinh
void HienthiLEDHienThoi(); //Ham hien thi ra LED 7 thanh
void HienthiLEDDuoi();
void HienthiLEDTren();
void Hienthi(unsigned int time);
unsigned char QuetDuLieuSo(); //Lay du lieu tu cac cam bien o cac vi tri va luu vao bo nho
unsigned int AnhSang(unsigned char so);
void KiemTra()interrupt 1; //Ngat do bo dinh thoi 0
void Delay(int time);
//Chuong trinh chinh
void main()
{
//Cho phep ngat do bo dinh thoi 0 va ngat ngoai 0
IE=0x83; //10000011 EA=1 va ET0=1 , EX0=1
PX0=1; //Uu tien cho ngat ngoai 0
IT0=1; //Chon ngat ngoai 0 duoc kich thich boi canh
//Khoi tao bo dinh thoi 0 va bo dinh thoi 1
TMOD=0x01;//=00000001
TL0=0;
TH0=0;
//Khoi tao port de xuat/nhap
P0=0xFF;
P1=0xFF;
P3=0xFF;
//Khoi tao ADC
OE_ADC=0;
START_ALE=0;
//Khoi tao gia tri mau chuan
EDuoi=700;
ETren=1000;
BuocRem = 0; //Khoi tao rem o vi tri dong han
//Khoi tao dong co buoc
CTRL0 = 0;
CTRL1 = 0;
CTRL2 = 0;
CTRL3 = 0;
//Chay bo dinh thoi 0
TR0=1;
Solantran = 0;
while (1)
{
HienthiLEDHienThoi();
HienthiLEDDuoi();
HienthiLEDTren();
}
}
//------------------------------------------------------------------------
void KiemTra() interrupt 1 //Ngat do bo dinh thoi 0
{
unsigned char i;
TF0=0;//Xoa co tran
Solantran++;
if (Solantran > 20)
{
TR0=0; //Dung bo dinh thoi 0 lai
Solantran=0;
Eso=QuetDuLieuSo();
E=AnhSang(Eso);
if (E<EDuoi) //Mo rem
{
if (Kich == 1)
{
i = BuocRem % 4;
switch (i)
{
case 0:
CTRL0=1; CTRL1=0; CTRL2=0; CTRL3=0;
Hienthi(4);
break;
case 1:
CTRL0=0; CTRL1=1; CTRL2=0; CTRL3=0;
Hienthi(4);
break;
case 2:
CTRL0=0; CTRL1=0; CTRL2=1; CTRL3=0;
Hienthi(4);
break;
case 3:
CTRL0=0; CTRL1=0; CTRL2=0; CTRL3=1;
Hienthi(4);
break;
}
BuocRem++;
}
}
else
if (E>ETren) //Dong rem
{
if (BuocRem > 0)
{
i = BuocRem % 4;
switch (i)
{
case 0:
CTRL0=0; CTRL1=0; CTRL2=0; CTRL3=1;
Hienthi(4);
break;
case 1:
CTRL0=1; CTRL1=0; CTRL2=0; CTRL3=0;
Hienthi(4);
break;
case 2:
CTRL0=0; CTRL1=1; CTRL2=0; CTRL3=0;
Hienthi(4);
break;
case 3:
CTRL0=0; CTRL1=0; CTRL2=1; CTRL3=0;
Hienthi(4);
break;
}
BuocRem--;
}
}
TH0=0;
TL0=0;
TR0=1;//Kich hoat lai bo dinh thoi 0
}
}
//-------------------------------------------------------------------------------------------
Các file đính kèm theo tài liệu này:
- V0251.doc