Đề tài Đo và ổn định độ sáng phòng

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

doc28 trang | Chia sẻ: Kuang2 | Lượt xem: 803 | Lượt tải: 0download
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.L­u ®å 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 tr­ng 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:

  • docV0251.doc
Tài liệu liên quan