AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 10. Светофор

Модель светофора с полным циклом: красный, красный с жёлтым, зелёный, мигающий зелёный и жёлтый. Проект объединяет управление портом, вложенные задержки и счётчики.

Задача

Воспроизвести цикл работы дорожного светофора.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • светодиоды красный, жёлтый, зелёный
  • 3 резистора 330 Ом
  • резистор 10 кОм

Схема подключения

ВыводПодключение
RB0красный светодиод через 330 Ом
RB1жёлтый светодиод через 330 Ом
RB2зелёный светодиод через 330 Ом
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Включить красный на 5 секунд.
  2. Добавить жёлтый на 1 секунду (подготовка к движению).
  3. Включить зелёный на 5 секунд, затем несколько раз мигнуть им.
  4. Включить жёлтый на 1 секунду и вернуться к красному.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p10.asm · p10.hex (готовая прошивка).

;=======================================================
; Проект 10. Светофор (красный RB0, жёлтый RB1, зелёный RB2)
; PIC16F84A, 4 МГц
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, d3, blink
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        bcf     STATUS,RP0
        clrf    PORTB

Main
        movlw   b'00000001'     ; КРАСНЫЙ
        movwf   PORTB
        call    Delay5s

        movlw   b'00000011'     ; красный + жёлтый
        movwf   PORTB
        call    Delay1s

        movlw   b'00000100'     ; ЗЕЛЁНЫЙ
        movwf   PORTB
        call    Delay5s

        movlw   .6              ; зелёный мигает 3 раза
        movwf   blink
GrBlink
        movlw   b'00000100'
        xorwf   PORTB,f
        call    Delay500
        decfsz  blink,f
        goto    GrBlink

        movlw   b'00000010'     ; ЖЁЛТЫЙ
        movwf   PORTB
        call    Delay1s
        goto    Main

Delay5s
        movlw   .10
        movwf   d3
D5      call    Delay500
        decfsz  d3,f
        goto    D5
        return

Delay1s
        call    Delay500
        call    Delay500
        return

Delay500
        movlw   .255
        movwf   d1
DL1     movlw   .255
        movwf   d2
DL2     nop
        nop
        decfsz  d2,f
        goto    DL2
        decfsz  d1,f
        goto    DL1
        return

        END

Пояснения

  • Длинные интервалы набираются вызовом базовой задержки в цикле — так экономится память и не нужны трёхбайтные счётчики.
  • Комбинации сигналов задаются одной записью в порт: b'00000011' — это красный и жёлтый одновременно.
  • Мигание зелёного реализовано инверсией одного бита с чётным числом повторов, чтобы цикл завершился при погашенном светодиоде.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.