TỔNG QUAN VỀ ĐỀ TÀI
Lý do chọn đề tài
Trước sự gia tăng không ngừng của phương tiện giao thông và sự phức tạp của hệ thống giao thông, tình trạng ùn tắc và tai nạn giao thông ngày càng trở nên nghiêm trọng Để đảm bảo an toàn và thông suốt cho giao thông, việc sử dụng hệ thống tín hiệu điều khiển và phân luồng tại các nút giao thông là rất cần thiết Nhận thấy tầm quan trọng này, chúng tôi đã chọn đề tài thiết kế và chế tạo mô hình điều khiển đèn giao thông tại ngã tư.
Mục đích nghiên cứu
Trong nghiên cứu này, tôi mong muốn áp dụng các sản phẩm công nghệ tiên tiến vào việc điều khiển phân luồng giao thông Bên cạnh đó, đây cũng sẽ là mô hình tham khảo quý giá cho các sinh viên khóa sau, giúp họ nghiên cứu và phát triển hơn nữa trong lĩnh vực này.
- Củng cố lại kiến thức lý thuyết đã được học tập nghiên cứu tại trường.
- Đây là đồ án tích hợp để sinh viên làm bước đệm cho đồ án tốt nghiệp được hoàn thiện hơn
Ý nghĩa và thực tiễn của đề tài
Hiện nay, tai nạn và ùn tắc giao thông, đặc biệt tại các ngã tư, đang gia tăng Để giải quyết vấn đề này, việc lắp đặt đèn giao thông là rất cần thiết Vì vậy, tôi xin thực hiện đề tài: “Thiết kế chế tạo hệ thống điều khiển đèn giao thông ở ngã tư” với mong muốn đưa ra giải pháp cải thiện tình trạng lưu thông, giúp giảm thiểu ùn tắc và tai nạn.
SỞ LÝ THUYẾT
GIỚI THIỆU CHUNG CẤU TRÚC BỘ VĐK PIC16F886
Dòng PIC16F886 được chọn sử dụng trong đề tài là dòng phổ thông với các tính năng cơ bản và dễ cho việc sử dụng với:
Lập trình trong ngôn ngữ này được thực hiện thông qua 35 lệnh đơn giản, dễ nhớ và dễ học, với độ dài 8bit Hầu hết các lệnh được thực thi trong một chu kỳ lệnh, ngoại trừ một số lệnh rẽ nhánh cần hai chu kỳ lệnh để hoàn thành.
- Tốc độ hoạt động tối đa cho phép của xung ngoại là 20MHz.
Tốc độ hoạt động tối đa cho phép của xung nội là 4MHz.
- Chu kỳ lệnh thực hiện trong 200ns.
- Bộ nhớ chương trình Flash Rom 8K×14words.
Bộ nhớ chương trình của Vi điều khiển PIC16F886 là bộ nhớ flash, dung lượng bộ nhớ 8K word (1 word = 16bit).
Khả năng của bộ xử lý này:
- Khả năng ngắt ( lên tới 14 nguồn ngắt trong và ngắt ngoài )
- Ngăn nhớ Stack được phân chia làm 8 mức
- Truy cập bộ nhớ bằng địa chỉ trực tiếp hoặc gián tiếp.
- Nguồn khởi động lại (POR)
- Bộ tạo xung thời gian (PWRT) và bộ tạo dao động (OST)
- Bộ đếm xung thời gian (WDT) với nguồn dao động trên ung (nguồn dao động RC) hoạt động đáng tin cậy.
- Có mã chương trình bảo vệ.
- Có bảng lựa chọn dao động.
- Công nghệ CMOST FLASH/EEPROM nguồn mức thấp, tốc độ cao.
- Thiết kế hoàn toàn tĩnh.
- Mạch chương trình nối tiếp có 2 chân.
- Xử lý đọc/ghi tới bộ nhớ chương trình.
- Dải điện thế hoạt động rộng từ 2.0V đến 5.5V.
- Nguồn sử dụng hiện tại 25mA.
- Dãy nhiệt độ công nghiệp và thuận lợi.
- Công suất tiêu thụ thấp:
Các đặc tính nổi bật của thiết bị ngoại vi trên chip
- Timer0: 8 bít của bộ định thời, bộ đếm với hệ số tỉ lệ trước.
Timer1 là bộ định thời 16 bít với khả năng đếm và điều chỉnh hệ số tỉ lệ trước, cho phép tăng cường hiệu suất trong chế độ Sleep thông qua xung đồng hồ cung cấp từ bên ngoài.
- Timer2: 8 bít của bộ định thời, bộ đếm với 8 bít của hệ số tỉ lệ trước, hệ số tỉ lệ sau.
- Có 2 chế độ bắt giữ, so sánh, điều chế độ rộng xung (PWM)
Chế độ bắt giữ 16 bít với tốc độ 12.5ns, chế độ so sánh 16 bít có tốc độ giải quyết tối đa 200ns, và chế độ điều chế độ rộng xung 10 bít.
- 2 bộ module CCP ( bao gồm Capture bắt giữ, Compare so sánh, PWM điều chế xung 10 bit) và 1 bộ module ECCP.
- 1 bộ ADC với 11 kênh ADC 10 bit
- Cổng truyền thông nối tiếp SSP với SPI phương thức chủ và I 2 C (chủ/phụ)
- Bộ truyền nhận thông tin đồng bộ, dị bộ USART (AUSART/EUSART) có khả năng phát hiện ra 9 bít địa chỉ.
- Cổng phụ song song (PSP) với 8 bít mở rộng, với RD, WR và CS điều khiển.
- Bộ giám sát định thời Watchdog timer.
- Chuẩn giao tiếp nối tiếp MSSP (SPI/I2C)
- Nạp chương trình bằng cổng nối tiếp ICSP( In Circuit Serial Programming) thông qua 2 chân.
- Có thể hoạt động với nhiều dạng Oscillator khác nhau.
- Tần số hoạt động tối đa là 64Mhz.
- Bộ nhớ Flash với khả nămh ghi xóa được 100.000 lần
- Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần
- Dữ liệu EEPROM có thể lưu trữ trên 40 năm
- Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
Hình 2.1 Bộ Nhớ của VDK PIC16F886
Vi điều khiển PIC16F886 sở hữu bộ nhớ chương trình Flash với dung lượng 8K word (mỗi word chứa 14 bit), được chia thành nhiều trang Để mã hóa địa chỉ cho 8K word của bộ nhớ chương trình, thanh ghi đếm chương trình PC có kích thước 13 bit.
Khi vi điều khiển reset, bộ đếm chương trình sẽ trỏ về địa chỉ 0000h Khi có ngắt xảy ra thì thanh ghi PC sẽ trỏ đến địa chỉ 0004h.
Bộ nhớ chương trình không bao gồm bộ nhớ Stack và không được địa chỉ hóa bởi bộ đém chương trình.
Bộ nhớ dữ liệu của PIC16F886 được chia thành 4 bank.Mỗi bank có dụng lượng 128 byte.
Bộ nhớ dữ liệu của vi điều khiển 8051 được chia thành hai bank riêng biệt: bank 1 chứa 128 byte RAM nội để lưu trữ dữ liệu, trong khi bank 2 bao gồm 128 byte với các thanh ghi chức năng đặc biệt (SFR) mà không được phép lưu trữ dữ liệu khác Ngược lại, PIC16F877A có cấu trúc tổ chức bộ nhớ dữ liệu khác với bốn bank, cho phép quản lý và sử dụng tài nguyên hiệu quả hơn.
Mỗi bank của bộ nhớ dữ liệu PIC16F886 bao gồm các thanh ghi chức năng đặc biệt (SFR) ở các ô nhớ địa chỉ thấp và các thanh ghi mục đích chung (GPR) ở vùng địa chỉ còn lại Vùng ô nhớ của các thanh ghi mục đích chung là nơi người dùng lưu trữ dữ liệu trong quá trình lập trình, do đó tất cả các biến dữ liệu nên được khai báo trong khu vực này.
Trong bộ nhớ dữ liệu của PIC16F886, các thanh ghi SFR thường xuyên sử dụng như thanh ghi STATUS được đặt ở tất cả các bank để dễ dàng truy xuất Điều này giúp việc khai báo đúng bank chứa thanh ghi trở nên thuận tiện hơn, từ đó giảm thiểu số lượng lệnh trong chương trình.
2.1.3 Sơ đô chân và chức năng chân
Hình 2.2 Sơ Đồ chân VDK PIC16F886
Từ hình trên cho thấy pic16f886 có 28 chân bao gồm:
VDD : chân cấp nguồn dương cho vi điều khiển
VSS : chân cấp nguồn âm cho vi điều khiển
PORTA: bao gồm 8 chân dùng cho các chức năng như
PORTB: bao gồm 8 chân dùng cho các chức năng như Ngắt ngoài,ngắt portB, ANALOG,INPUT,OUTPUT…
PORTC: bao gồm 8 chân dùng cho các chức năng như
UART,SPI,I2C,PWM,INPUT CAPTURE,COUNTER,INPUT,OUTPUT…
Timer1 là một bộ định thời 16 bit, với giá trị được lưu trong hai thanh ghi 8 bit là TMR1H và TMR1L Cờ ngắt của Timer1 được xác định bởi bit TMR1IF, trong khi bit điều khiển của Timer1 là TRM1IE.
Cặp thanh ghi TMR1 sẽ tăng từ 0000h đến FFFFh và sau đó sẽ tràn về 0000h Nếu ngắt được cho phép, ngắt sẽ xảy ra khi giá trị TMR1 tràn từ FFFFh về 0000h, lúc này tín hiệu TMR1IF sẽ được kích hoạt.
Timer1 có 3 chế độ hoạt động :
- Chế độ hoạt động định thời đồng bộ : Chế độ được lựa chọn bởi bit
TMR1CS Trong chế độ này xung cấp cho Timer1 là Fosc/4, bit T1SYNC không có tác dụng.
Chế độ đếm đồng bộ cho phép giá trị của timer1 tăng khi có xung cạnh lên vào chân T1OSI/RC1 Trong chế độ này, xung clock ngoại được đồng bộ với xung clock nội, và hoạt động đồng bộ diễn ra ngay sau bộ tiền định tỉ lệ xung (prescaler).
Chế độ đếm bất đồng bộ xảy ra khi bit T1SYNC được thiết lập, cho phép bộ định thời tiếp tục đếm ngay cả khi vi điều khiển đang trong trạng thái ngủ Chế độ này có khả năng tạo ra một ngắt khi bộ định thời tràng, giúp vi điều khiển thoát khỏi trạng thái ngủ một cách hiệu quả.
PIC16F886 có 15 nguồn ngắt, được điều khiển bởi thanh ghi INTCON (bit GIE), với mỗi ngắt có bit điều khiển và cờ ngắt riêng Các cờ ngắt được thiết lập khi điều kiện ngắt xảy ra, bất chấp trạng thái của bit GIE, nhưng hoạt động ngắt vẫn phụ thuộc vào bit GIE và các bit điều khiển khác Bit điều khiển ngắt RB0/INT0 và TMR0 nằm trong thanh ghi INTCON, cùng với bit cho phép ngắt ngoại vi PEIE Các bit điều khiển ngắt được lưu trữ trong thanh ghi PIE1 và PIE2, trong khi các cờ ngắt ngoại vi được chứa trong các thanh ghi PIR1 và PIR2.
Khi một chương trình ngắt được thực thi, nó sẽ kết thúc bằng lệnh RETFIE, trong đó bit GIE tự động bị xóa và địa chỉ lệnh tiếp theo của chương trình chính được lưu vào bộ nhớ Stack Bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h Lệnh RETFIE không chỉ giúp thoát khỏi chương trình ngắt mà còn khôi phục lại chương trình chính, đồng thời thiết lập lại bit GIE để cho phép các ngắt hoạt động trở lại Các cờ hiệu cần được kiểm tra và xóa bởi chương trình trước khi cho phép ngắt tiếp tục hoạt động, nhằm phát hiện chính xác thời điểm ngắt tiếp theo xảy ra.
Khi một ngắt được đáp ứng, bit GIE sẽ bị xóa và tất cả các ngắt khác sẽ bị cấm Cờ ngắt cần được xóa bởi phần mềm trước khi cho phép ngắt trở lại Trước khi thực hiện các chương trình phục vụ ngắt, nội dung các thanh ghi sẽ được lưu lại để đảm bảo an toàn và phục hồi trước khi quay lại chương trình chính Đối với các ngắt ngoại vi như ngắt từ chân INT hoặc ngắt từ sự thay đổi trạng thái của các pin PortB, việc xác định ngắt nào xảy ra cần từ 3 đến 4 chu kỳ lệnh tùy thuộc vào thời điểm ngắt xảy ra.
Trong quá trình thực thi ngắt, chỉ có giá trị của bộ đếm chương trình được lưu trữ trong Stack, trong khi một số thanh ghi quan trọng không được lưu và có thể bị thay đổi trong quá trình thực thi chương trình ngắt Để tránh hiện tượng này, cần phải xử lý bằng chương trình.
Hình 2.4 Các nguồn ngắt của VDK PIC16F886
Led 7 đoạn và led đơn
2.2.1.Các khái niệm cơ bản
Để báo trạng thái hoạt động của thiết bị, người ta thường sử dụng "led 7 đoạn" với các dãy số đơn giản Led 7 đoạn phù hợp cho những thông số không quá phức tạp, chỉ cần hiển thị số Ví dụ, nó thường được dùng để hiển thị nhiệt độ phòng, trong đồng hồ treo tường điện tử, và số lượng sản phẩm sau mỗi công đoạn kiểm tra.
Led 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới, bên phải của led 7 đoạn 8 led đơn trên led 7 đoạn có Anode(cực +) hoặc
Cathode (cực âm) được kết nối chung tại một điểm và được đưa ra ngoài để kết nối với mạch điện Tám cực còn lại của mỗi LED đơn được sắp xếp theo cách riêng.
8 chân riêng, cũng được đưa ra ngoài để kết nối với mạch điện.
Anode chung được kết nối với nguồn Vcc, trong khi các chân còn lại được sử dụng để điều khiển trạng thái sáng tắt của đèn LED đơn Đèn LED chỉ sáng khi tín hiệu đầu vào các chân này ở mức 0.
Cathode chung (cực -) được kết nối với Ground (hay Mass), trong khi các chân còn lại được sử dụng để điều khiển trạng thái sáng và tắt của các LED đơn Các LED chỉ phát sáng khi tín hiệu đầu vào ở các chân này đạt mức 1.
LED 7 thanh là một thiết bị hiển thị phổ biến, sử dụng để biểu diễn các chữ số từ 0 đến 9 trong hệ thập phân Thiết bị này bao gồm 7 thanh được sắp xếp theo hình số 8, mỗi thanh là một diode phát quang (LED) hoặc màn hình tinh thể lỏng Diode thường được làm từ các hợp chất như Ga, As, P và có tính chất chỉnh lưu giống như diode thông thường Khi điện áp thuận vượt quá ngưỡng nhất định, diode sẽ phát sáng, với điện áp ngưỡng dao động từ 1,5 đến 5 volt tùy thuộc vào loại diode và màu sắc của nó.
LED màu đỏ có điện áp ngưỡng Ung = 1,6 đến 2 v
LED màu cam có điện áp ngưỡng Ung = 2,2 đến 3 v
LED màu xanh lá cây có điện áp ngưỡng Ung = 2,8 đến 3,2 v
LED màu vàng có điện áp ngưỡng Ung = 2,4 đến3, 2 v
LED màu xanh ra trời có điện áp ngưỡng Ung = 3 đến 5 v
Thiết kế bộ giải mã hiển thị cho LED 7 thanh với tín hiệu đầu vào là mã BCD
Dạng chỉ thị led 7 đoạn:
Hình 2.6 Cấu tạo của led 7 thanh
Để bảo vệ các đèn LED đơn trong đèn LED 7 đoạn, cần đảm bảo dòng điện qua mỗi LED đơn ở mức 10mA-20mA Khi kết nối với nguồn 5V, có thể sử dụng điện trở 220Ω để hạn dòng trước các chân nhận tín hiệu điều khiển.
Các điện trở 220Ω là các điện trở bên ngoài được kết nối để giới hạn dòng điện qua led nếu led 7 đoạn được nối với nguồn 5V.
Chân nhận tín hiệu a điều khiển led a sáng tắt, ngõ vào b để điều khiển led b Tương tự với các chân và các led còn lại
2.2.2 Kết nối với vi điều khiển
Để điều khiển led 7 đoạn, ngõ nhận tín hiệu có 8 đường cho phép sử dụng một Port của Vi điều khiển Led 7 đoạn nhận dữ liệu 8 bit từ Vi điều khiển, gọi là "mã hiển thị led 7 đoạn", để điều khiển hoạt động sáng tắt của từng led đơn Có hai kiểu mã hiển thị: mã cho led 7 đoạn Anode chung và mã cho led 7 đoạn Cathode chung Ví dụ, để hiển thị số 1, với led Anode chung, chân b và c cần được cấp 0V, trong khi các chân khác cấp 5V Ngược lại, với led Cathode chung, chân b và c phải được cấp 5V.
Bảng mã hiển thị led 7 đoạn( led 7 đoạn anot chung: led đơn sáng ở mức 0)
Số hiển thị trên led 7 đoạn
Mã hiển thị led 7 đoạn dạng nhị phân
Mã hiển thị led 7 đoạn dạng thập lục phân hgfedcba
Bảng 5: Mã hiển thị led 7 đoạn dành cho led 7 đoạn canot chung(các led đơn sáng ở mức 1)
Số hiển thị trên led 7 đoạn
Mã hiển thị led 7 đoạn dạng nhị phân
Mã hiển thị led 7 đoạn dạng thập lục phân hgfedcba
Phần cứng cần được kết nối với một cổng bất kỳ của vi điều khiển để dễ dàng xử lý sau này Để thuận tiện, các chân kết nối nên được thực hiện theo thứ tự: Px.0 nối với chân a, Px.1 nối với chân b, và tiếp tục cho đến Px.7 nối với chân h.
Dữ liệu xuất có dạng nhị phân như sau : hgfedcba
Kết quả từ bảng chức năng lập bảng Karnaugh cho 7 hàm rat a bao gồm các biểu thức sau: a = ABCD + A BCD, b = A BCD + ABCD, c = ABCD, d = ABCD + A BCD + ABCD, e = ABCD + ABCD + A BCD + ABCD + ABCD, f = ABCD + ABCD + ABCD + ABCD, g = A BCD + ABCD + ABCD.
2.2.3 Giao tiếp vi điều khiển với led 7 đoạn
Để kết nối nhiều đèn LED 7 đoạn với vi điều khiển mà không làm giảm khả năng thực hiện các tác vụ khác, cần sử dụng ít chân điều khiển nhất có thể Có hai giải pháp khả thi: sử dụng IC chuyên dụng cho hiển thị LED 7 đoạn hoặc kết nối nhiều LED 7 đoạn vào cùng một đường xuất tín hiệu Phương pháp quét LED được áp dụng bằng cách nối tất cả các chân nhận tín hiệu của các LED 7 đoạn vào cùng một Port, ví dụ như P0 cho 8 LED 7 đoạn Các chân điều khiển còn lại của vi điều khiển sẽ được sử dụng để bật/tắt từng LED 7 đoạn, với chế độ ON cho phép hiển thị và OFF để ngắt nguồn không hiển thị.
Để đảm bảo an toàn cho vi điều khiển và tránh tình trạng quá tải, chỉ nên cho phép một LED 7 đoạn hoạt động tại mỗi thời điểm Điều này có nghĩa là chỉ có một ngõ ra duy nhất nối với transistor ở mức 1, giúp đảm bảo rằng chỉ có một LED 7 đoạn được bật, từ đó ngăn ngừa quá tải cho cả tải và vi điều khiển khi điều khiển nhiều LED 7 đoạn cùng lúc.
Dựa vào hiện tượng lưu ảnh trên võng mạc, mắt vẫn giữ lại hình ảnh ngay cả khi ánh sáng kích thích đã biến mất Để tạo cảm giác hình ảnh liên tục, mỗi LED sẽ được hiển thị 24 lần trong một giây.
Giới thiệu về khối giải mã
2.3.1 Khối giải mã thập phân sang mã BCD
Mạch giải mã là thiết bị có n đầu vào và 2^n đầu ra, thường được sử dụng để biến đổi mã nhị phân BCD sang mã nhị phân hoặc mã 7 đoạn Để thiết kế bộ giải mã, người ta có thể áp dụng các phương pháp logic cơ bản Tuy nhiên, hiện nay, việc sử dụng các vi mạch giải mã có sẵn trên thị trường đã trở nên phổ biến hơn.
Giải mã BCD sang mã 7 đoạn:
Mã nhị phân BCD được chuyển đổi thành số thập phân và hiển thị qua 7 đoạn tương ứng với mỗi tổ hợp cụ thể Các thanh sáng này biểu diễn một chữ số trong hệ thập phân.
Các đoạn a, b, c, d, e, f, g có thể được cấu hình với đèn LED mắc anôt chung hoặc katôt chung, kết nối qua các điện trở để giới hạn dòng điện, đảm bảo đầu ra phù hợp cho bộ giải mã.
Trong thực tế người ta đã chế tạo sẵncác vi mạch để giảI mã nhị phân ra mã 7 đọan như :
Các vi mạch 7448, 74LS48, 7449 và 74LS49 là các IC giải mã 7 đoạn với đầu ra mức cao, cho phép chuyển đổi mã BCD sang dạng thập phân Quy luật hiển thị các chữ số thập phân của các vi mạch này tương tự nhau, như thể hiện trong bảng chân lý, với điểm khác biệt là số 6 không sử dụng thanh a và số 9 không sử dụng thanh d.
Mã BCD đầu vào Đầu ra mã 7 thanh
Vi mạch giải mã 7 đoạn 7447A, 74L47 và 74S47 là các vi mạch 16 chân, với đặc điểm là số 6 và số 9 chỉ có 5 thanh sáng tương tự như 7448 và 7449 Các vi mạch này có lối ra tác động thấp (mức 0), do đó đèn chỉ thị 7 đoạn được thiết kế với anốt chung.
Giới thiệu tổng quan về hệ thống đèn giao thông
Hệ thống đèn giao thông bao gồm hai cột đèn chính được đặt tại hai đầu của các làn đường khác nhau ở ngã tư Mỗi cột đèn có 5 đèn, trong đó có 3 đèn chính: đèn xanh, đèn đỏ và đèn vàng.
Mỗi hệ thống đèn được điều khiển thông qua một hộp điều khiển, từ đó phát ra tín hiệu điều khiển Tín hiệu này được gửi từ CPU qua các cổng ra, tiếp theo là các rơle, và cuối cùng là hệ thống dây nối đến các đèn.
Hình 2.6 Cấu Tạo đèn giao thông ngã tư
Cơ chế hoạt động của đèn giao thông rất đơn giản: khi đèn xanh của làn đường 1 (Green1) sáng lên, đèn đỏ của làn đường khác sẽ được bật cùng lúc.
Khi đèn đỏ cho người đi bộ ở làn đường 1 (padRed1) và đèn xanh cho người đi bộ ở làn đường 2 (padGreen2) được bật sáng, đèn xanh 1 (Green1) sẽ tắt sau một khoảng thời gian nhất định Tiếp theo, đèn vàng 1 (Yellow1) sẽ được bật lên Khi Yellow1 tắt, đèn đỏ 2 (Red2), đèn đỏ cho người đi bộ ở làn đường 1 (pedRed1), và đèn xanh cho người đi bộ ở làn đường 2 (pedGreen2) sẽ tắt đồng thời, đồng thời đèn xanh 2 (Green2), đèn đỏ 1 (Red1), đèn đỏ cho người đi bộ 2 (padRed2) cũng sẽ được kích hoạt.
1(padGreen1) được bật sáng Lúc đèn vàng 2(Yellow2) được bật lên cũng là lúc Green2 tắt, Yellow2 tắt chu kì được lập lại với Red2, Green1,…
THIẾT KẾ CHẾ TẠO
Sơ đồ khối
RESET: cho hệ thống chạy lại ban đầu
DAT/NIGHT: chuyển chế độ ngày và đêm
Khối nguồn đóng vai trò quan trọng trong việc cung cấp điện cho toàn bộ mạch, đặc biệt là nguồn 5V cần thiết cho các thành phần trong mạch điện, giúp chúng hoạt động hiệu quả.
*Khối xử lí trung tâm
Khối vi xử lý đảm nhận vai trò quan trọng trong việc xử lý tín hiệu, nhằm điều khiển các đèn giao thông một cách chính xác, giúp các phương tiện tuân thủ luật lệ giao thông.
Thời gian hiển thị của các đèn tín hiệu giao thông bao gồm các trạng thái: được phép đi, đi chậm và dừng Những tín hiệu này nhằm hướng dẫn các phương tiện giao thông và người đi bộ tuân thủ quy định giao thông.
Khối Điều Khiển Khối Hiển Thị
Hình 3.1 Sơ đồ nguyên lý
Hình 3.2 Sơ đồ đi dây board mạch
Hình 3.2 Hình ảnh 3D của board mạch
#include //chen thu vien chinh
//khai bao bien toan cuc unsigned int8
Maled[]={0xC0,0xF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XF F}; signed int8 ThoiGian; signed int8 Tam; unsigned int8 Counter=0; unsigned int8 CheDo=0; int1 BanNgayBanDem=0;
//khai bao chuong trinh con void TatHetLed(void); void KhoiTaoNgatNgoai(void); void Tach2So(unsigned int8 SoDem,unsigned char
*HangChuc,*HangDonvi); void DieuKhienLed(unsigned char Cot,int1 Giatri); void TatHetCot(void); void XuatDuLieu(unsigned char L1,L2,L3,L4); void TaoTre(unsigned int16 Time,unsigned char L1,L2,L3,L4); void TaoPORT(unsigned int8 Value);
#INT_TIMER1 void Ngat_Timer1(void)
} set_timer1(15436);//cai gia tri dem ban dau cho timer1
#INT_EXT void NgatNgoai(void)
//chuong trinh chinh void main()
//khai bao bien cuc bo unsigned char HangChuc1,HangChuc2,HangDonVi1,HangDonVi2;
KhoiTaoNgatToanCuc(1); while(TRUE)//vong lap vo han
//TODO: User Code while(BanNgayBanDem==0)//day la ban ngay
{ if(CheDo==0)//den do 1 va den xanh 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,1); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian-3,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==1)//den do 1 va den vang 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,1);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==2)//den do 2 va den xanh 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,1); output_bit(LedVang1,0); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian-3,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==3)//den do 2 va den vang 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,1); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); }
{ output_bit(LedVang1,1); output_bit(LedVang2,1);
//viet chi tiet chuong trinh con o day nhe ahihi
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,0);
{ enable_interrupts(INT_EXT);//cho phep ngat ngoai enable_interrupts(INT_EXT_H2L);//cho phep ngat cach xuong
} void Tach2So(unsigned int8 SoDem,unsigned char *HangChuc,*HangDonvi) { unsigned char So[]={0,1,2,3,4,5,6,7,8,9};
} void DieuKhienLed(unsigned char Cot,int1 Giatri)
{ output_bit(Cot1,Giatri); break;
{ output_bit(Cot2,Giatri); break;
{ output_bit(Cot3,Giatri); break;
{ output_bit(Cot4,Giatri); break;
} void TaoPORT(unsigned int8 Value)
Tam = (Tam!=0)?1:0; output_bit(pin_c7,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c6,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c5,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c4,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c0,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c1,Tam);
Lưu đồ thuật toán
Khối Điều Khiển Khối Hiển Thị
Sơ đồ nguyên lý
Hình 3.1 Sơ đồ nguyên lý
Hình 3.2 Sơ đồ đi dây board mạch
Hình 3.2 Hình ảnh 3D của board mạch
#include //chen thu vien chinh
//khai bao bien toan cuc unsigned int8
Maled[]={0xC0,0xF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XF F}; signed int8 ThoiGian; signed int8 Tam; unsigned int8 Counter=0; unsigned int8 CheDo=0; int1 BanNgayBanDem=0;
//khai bao chuong trinh con void TatHetLed(void); void KhoiTaoNgatNgoai(void); void Tach2So(unsigned int8 SoDem,unsigned char
*HangChuc,*HangDonvi); void DieuKhienLed(unsigned char Cot,int1 Giatri); void TatHetCot(void); void XuatDuLieu(unsigned char L1,L2,L3,L4); void TaoTre(unsigned int16 Time,unsigned char L1,L2,L3,L4); void TaoPORT(unsigned int8 Value);
#INT_TIMER1 void Ngat_Timer1(void)
} set_timer1(15436);//cai gia tri dem ban dau cho timer1
#INT_EXT void NgatNgoai(void)
//chuong trinh chinh void main()
//khai bao bien cuc bo unsigned char HangChuc1,HangChuc2,HangDonVi1,HangDonVi2;
KhoiTaoNgatToanCuc(1); while(TRUE)//vong lap vo han
//TODO: User Code while(BanNgayBanDem==0)//day la ban ngay
{ if(CheDo==0)//den do 1 va den xanh 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,1); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian-3,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==1)//den do 1 va den vang 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,1);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==2)//den do 2 va den xanh 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,1); output_bit(LedVang1,0); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian-3,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==3)//den do 2 va den vang 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,1); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); }
{ output_bit(LedVang1,1); output_bit(LedVang2,1);
//viet chi tiet chuong trinh con o day nhe ahihi
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,0);
{ enable_interrupts(INT_EXT);//cho phep ngat ngoai enable_interrupts(INT_EXT_H2L);//cho phep ngat cach xuong
} void Tach2So(unsigned int8 SoDem,unsigned char *HangChuc,*HangDonvi) { unsigned char So[]={0,1,2,3,4,5,6,7,8,9};
} void DieuKhienLed(unsigned char Cot,int1 Giatri)
{ output_bit(Cot1,Giatri); break;
{ output_bit(Cot2,Giatri); break;
{ output_bit(Cot3,Giatri); break;
{ output_bit(Cot4,Giatri); break;
} void TaoPORT(unsigned int8 Value)
Tam = (Tam!=0)?1:0; output_bit(pin_c7,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c6,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c5,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c4,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c0,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c1,Tam);
Hình ảnh 3D
Hình 3.2 Hình ảnh 3D của board mạch
#include //chen thu vien chinh
//khai bao bien toan cuc unsigned int8
Maled[]={0xC0,0xF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XF F}; signed int8 ThoiGian; signed int8 Tam; unsigned int8 Counter=0; unsigned int8 CheDo=0; int1 BanNgayBanDem=0;
//khai bao chuong trinh con void TatHetLed(void); void KhoiTaoNgatNgoai(void); void Tach2So(unsigned int8 SoDem,unsigned char
*HangChuc,*HangDonvi); void DieuKhienLed(unsigned char Cot,int1 Giatri); void TatHetCot(void); void XuatDuLieu(unsigned char L1,L2,L3,L4); void TaoTre(unsigned int16 Time,unsigned char L1,L2,L3,L4); void TaoPORT(unsigned int8 Value);
#INT_TIMER1 void Ngat_Timer1(void)
} set_timer1(15436);//cai gia tri dem ban dau cho timer1
#INT_EXT void NgatNgoai(void)
//chuong trinh chinh void main()
//khai bao bien cuc bo unsigned char HangChuc1,HangChuc2,HangDonVi1,HangDonVi2;
KhoiTaoNgatToanCuc(1); while(TRUE)//vong lap vo han
//TODO: User Code while(BanNgayBanDem==0)//day la ban ngay
{ if(CheDo==0)//den do 1 va den xanh 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,1); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian-3,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==1)//den do 1 va den vang 2 duoc bat
{ output_bit(LedDo1,1); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,1);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==2)//den do 2 va den xanh 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,1); output_bit(LedVang1,0); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian-3,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); } else if(CheDo==3)//den do 2 va den vang 1 duoc bat
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,1); output_bit(LedDo2,1); output_bit(LedXanh2,0); output_bit(LedVang2,0);
Tach2So(ThoiGian,&HangChuc1,&HangDonVi1);
Tach2So(ThoiGian,&HangChuc2,&HangDonVi2);
XuatDuLieu(HangChuc1,HangDonVi1,HangChuc2,HangDonVi2); }
{ output_bit(LedVang1,1); output_bit(LedVang2,1);
//viet chi tiet chuong trinh con o day nhe ahihi
{ output_bit(LedDo1,0); output_bit(LedXanh1,0); output_bit(LedVang1,0); output_bit(LedDo2,0); output_bit(LedXanh2,0); output_bit(LedVang2,0);
{ enable_interrupts(INT_EXT);//cho phep ngat ngoai enable_interrupts(INT_EXT_H2L);//cho phep ngat cach xuong
} void Tach2So(unsigned int8 SoDem,unsigned char *HangChuc,*HangDonvi) { unsigned char So[]={0,1,2,3,4,5,6,7,8,9};
} void DieuKhienLed(unsigned char Cot,int1 Giatri)
{ output_bit(Cot1,Giatri); break;
{ output_bit(Cot2,Giatri); break;
{ output_bit(Cot3,Giatri); break;
{ output_bit(Cot4,Giatri); break;
} void TaoPORT(unsigned int8 Value)
Tam = (Tam!=0)?1:0; output_bit(pin_c7,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c6,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c5,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c4,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c0,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c1,Tam);
Chương trình điều khiển
Tam = (Tam!=0)?1:0; output_bit(pin_c2,Tam);
Tam = (Tam!=0)?1:0; output_bit(pin_c3,Tam);