Red light, hệ thống đèn giao thông đơn giản
Red light mô phỏng hệ thống đèn giao thông gồm 3 led tương ứng với 3 màu – led màu đỏ, led màu vàng và led màu xanh. Về sự hoạt động, chúng tôi lập trình mô phỏng để 3 led này có thời gian on/off và sự chuyển đổi giữa các led giống như hệ thống đèn giao thông trong thực tế, cụ thể như sau:
- Led xanh, thời gian sáng 20s
- Led vàng, thời gian sáng 3s
- Led đỏ, thời gian sáng 30s
Sự hoạt động sẽ được lặp lại mãi mãi. Thời gian sáng của các led sẽ được đếm ngược và hiển thị trên 2 digit led 7 đoạn, bạn có thể xem lại “project Quét 2 led 7 đoạn trên pic 16f877A” để hiểu hơn cách quét led 7 đoạn.
Sơ lượt qua phần kết nối của project Traffic light:
- CMU: vi điều khiển pic 16f877A, 8 Mhz
- Led 7 đoạn: PORTD và PORTE điều khiển led 2 led 7 đoạn; RD0…RD1 kết nối A, B…DP của led 7 đoạn; RE0, RE1 điều khiển 2 led 7 đoạn.
- 3 Led đỏ, xanh, vàng: kết nối đến RC1, RC2, RC3.
Về phần code lập trình, bạn nên tìm hiểu 3 đoạn code hiển thị của 3 led như sau:
Code điều khiển led màu đỏ:
void dendo(){
for(i=1;i<=30;i++){
PORTC.F1=1;
PORTC.F2=0;
PORTC.F3=0;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
Code điều khiển led màu vàng:
void denvang(){
for(i=1;i<=3;i++){
PORTC.F1=0;
PORTC.F2=1;
PORTC.F3=0;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
Code điều khiển led màu xanh:
void denxanh(){
for(i=1;i<=20;i++){
PORTC.F1=0;
PORTC.F2=0;
PORTC.F3=1;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
Sau khi bạn đã hiểu rõ các đoạn code trên, bạn có thể xem tiếp phần code hoàn chỉnh của project và sau đó bạn tự tạo cho mình một project với trình biên dịch mikroC compiler để thực hành nhé.
/*Traffic light
Date: 16/12/2010
Author: Huynh Minh Trung
Website: http:giaoan.link
*/
unsigned short i,j,num,dk; // Khai bao bien
//Chuong trinh chuyen doi so thap phan sang led 7 doan
unsigned short mask(unsigned short num){
switch (num){
case 0: return 0xc0;
case 1: return 0xf9;
case 2: return 0xa4;
case 3: return 0xb0;
case 4: return 0x99;
case 5: return 0x92;
case 6: return 0x82;
case 7: return 0xf8;
case 8: return 0x80;
case 9: return 0x90;
}
}
///////Chuong trinh led 2 digit 7seg///////////////////////
void dendo(){
for(i=1;i<=30;i++){
PORTC.F1=1;
PORTC.F2=0;
PORTC.F3=0;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
void denvang(){
for(i=1;i<=3;i++){
PORTC.F1=0;
PORTC.F2=1;
PORTC.F3=0;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
void denxanh(){
for(i=1;i<=20;i++){
PORTC.F1=0;
PORTC.F2=0;
PORTC.F3=1;
for(j=0;j<=50;j++){
PORTD=mask(i%10);
PORTE.F0=1;
delay_ms(10);
PORTE.F0=0;
PORTD=mask(i/10);
PORTE.F1=1;
delay_ms(10);
PORTE.F1=0;
}
}
}
void main(){
///////////Khai bao bien///////////////////////
TRISA=0X00;
TRISB=0xFF;
TRISD=0x00;
PORTD=0X00;
TRISC=0X00;
TRISE=0X00;
PORTE=0X00;
while(1){
denxanh();
denvang();
dendo();
}
}