Система регулирования дорожного движения
ТТЛ
ТТЛ/ТШ 2)
ТТЛ/ТШ 2)
PORTB - двунаправленный порт ввода/вывода. Может быть запрограммирован в режиме внутренних активных нагрузок на линию питания по всем выводам. Вывод RB0/INT может быть выбран как внешний вход прерывания. Выводы RB4...RB7 могут быть программно настроены как входы прерывания по изменению состояния на любом из входов. При программировании МК RB6 используется как тактовый, а RB7 как вход/выход данных.
1) Этот буфер имеет вход триггера Шмитта, когда конфигурируется в качестве входа внешнего прерывания.
2) Этот буфер имеет вход триггера Шмитта, когда используется в режиме последовательного программирования.
3) Этот буфер имеет вход триггера Шмитта, когда конфигурируется в режиме RC-генератора и КМОП-вход в остальных случаях.
Табл.1 Назначение выводов МК подгруппы PIC16F8X |
||||
Обозначение |
Тип |
Буфер |
Описание |
|
Vdd |
P |
- |
Положительное напряжение питания |
|
Vss |
P |
- |
Общий провод (земля) |
|
В таблице использованы следующие обозначения: I -- вход; O -- выход; I/O -- вход/выход; P -- питание; - -- не используется; ТТЛ -- ТТЛ вход; ТШ -- вход триггера Шмитта. |
Микроконтроллер содержит 8-разрядное АЛУ и рабочий регистр W. АЛУ является арифметическим модулем общего назначения и выполняет арифметические и логические функции над содержимым рабочего регистра и любого из регистров контроллера. АЛУ может выполнять операции сложения, вычитания, сдвига и логические операции. Если не указано иное, то арифметические операции выполняются в дополнительном двоичном коде.
В зависимости от результата операции, АЛУ может изменять значения бит регистра STATUS: C (Carry), DC (Digit carry) и Z (Zero).
Все перечисленные выше особенности данного микроконтроллера удовлетворяют требованиям для реализации системы светофоров.
2. Принцип действия устройства
2.1 Функциональная схема
Система управления
Данное устройство может работать автономно или под управлением компьютера. Который указывает устройству, какой свет включить в определенном направлении. Возможны следующие варианты включения светофоров:
нормальный режим
все красные
все зеленые
2.2 Описание элементов схемы
Схема питается от источника стабилизированного напряжения +5В. Тактовая частота микроконтроллера задается RC - цепью и составляет около 2 МГц. Порты RA0 - RA4 и RB0 используются для синхронизации с компьютером. Порты RA0 - RA3 (используются на вход) принимают данные от компьютера. Порт RA4 (используется на выход) выдает сигнал подтверждения приема данных. Порт RB0 (используется на вход) строб данных от компьютера. К линиям RB2 - RB7 посредствам транзисторов подключены 12 лампочек, которые имитируют светофоры. Лампочка загорается при низком уровне сигнала на выходе RB2 - RB7.
3. Программное обеспечение
3.1 Алгоритм программы
Словесное изложение алгоритма
Программа включает в себя бесконечный цикл в котором выполняется подпрограммы. Первая подпрограмма отвечает за инициализацию портов ввода/вывода. Вторая подпрограмма отвечает за нормальный режим работы системы. В ней выполняется включение лампочек светофоров через определенный промежуток времени. Задержка - вложенные циклы и выполняются они указанное количество раз. Третья подпрограмма отвечает за работу светофоров, учитывая информацию поступившую от компьютера. В ней анализируется полученная информация и выбирается вариант работы системы.
3.2 Листинг программы с комментариями
;******************************************************
;*листинг исходной программы
;******************************************************
;ы
list p=16c84, r=hex ;директива, определяющая тип
;процессора и систему счисления
;по умолчанию
;
;******************************************************
;*описание используемых переменных и назначения адресов
;*ячеек для хранения переменных пользователя
;******************************************************
PCL EQU 0x02
STATUS EQU 0x03
RP0 EQU 5
PORTA EQU 0x05
PORTB EQU 0x06
TRISA EQU 0x05
TRISB EQU 0x06
W EQU 0
F EQU 1
TEMPA EQU 0x0C
TEMPB EQU 0x0D
COUNT1 EQU 0x0E
COUNT2 EQU 0x0F
COUNT3 EQU 0x10
;
;******************************************************
;*определение меток замены текста
;******************************************************
;
#DEFINE Z STATUS,2 ;бит нулевого результата
#DEFINE VD1 PORTB,2 ;красный светодиод
#DEFINE VD2 PORTB,3 ;желтый светодиод
#DEFINE VD3 PORTB,4 ;зеленый светодиод
#DEFINE VD4 PORTB,5 ;красный светодиод
#DEFINE VD5 PORTB,6 ;желтый светодиод
#DEFINE VD6 PORTB,7 ;зеленый светодиод
#DEFINE KONT PORTB,0 ;подтверждение приема данных
#DEFINE KOMP PORTA,4 ;строб данных от компьютера
#DEFINE D0 PORTA,0 ;данные от компьютера
#DEFINE D1 PORTA,1 ;данные от компьютера
#DEFINE D2 PORTA,2 ;данные от компьютера
#DEFINE D3 PORTA,3 ;данные от компьютера
;
;******************************************************
;*исполняемая программа
;******************************************************
;
ORG 0x000 ;установка начального адреса по сбросу
GOTO START ;переход на начало программы
ORG 0x005 ;установка начального адреса размещения программы
START
CALL INIT_PORTS ;вызов подпрограммы инициализации портов МК
LOOP
CLRWDT ;сброс сторожевого таймера
CALL SVETOFOR
BTFSS TEMPA,0
CALL PROCESSING_DATA
GOTO LOOP ;переход к метке LOOP для повторения процесса
INIT_PORTS ;подпрограмма инициализации портов
MOVLW 0xFF ;установка линий портов
MOVWF PORTA ;A и B в единичное
MOVWF PORTB ;состояние
BSF STATUS,RP0 ;переход на банк 1
MOVLW 0xFF ;установка RB0-RB7
MOVWF TRISB ;на выход
BCF STATUS,RP0 ;возврат в банк 0
RETURN ;возврат из подпрограммы
SVETOFOR
;************************ горит VD1 и VD6 (красный и зеленый) ******************
BSF VD1 ;зажечь красный свет
BSF VD6 ;зажечь зеленый свет
MOVLW H32 ;пересылка константы 50 в W
MOVWF COUNT2 ;загрузка 50 в COUNT2
MOVWF COUNT1 ;загрузка 50 в COUNT1
LOOPD
DECFSZ COUNT1,F ;декремент COUNT1
CALL INPUT_DATA
BTFSS TEMPA,0 ; пропустить команду если (TEMPA,0) = 1
GOTO END_P
GOTO LOOPD ;
CLRWDT ;сброс сторожевого таймера
MOVWF COUNT1
DECFSZ COUNT2,F ;декремент COUNT2
GOTO LOOPD
;
;******* горит VD2 (желтый где горит красный) **********
;
BSF VD2 ;зажечь желтый свет
MOVLW HA ;пересылка константы 50 в W
MOVWF COUNT2 ;загрузка 50 в COUNT2
MOVWF COUNT1 ;загрузка 50 в COUNT1
LOOPD1
DECFSZ COUNT1,F ;декремент COUNT1
CALL INPUT_DATA
BTFSS TEMPA,0 ; пропустить команду если (TEMPA,0) = 1
GOTO END_P
GOTO LOOPD1 ;
CLRWDT ;сброс сторожевого таймера
MOVWF COUNT1
DECFSZ COUNT2,F ;декремент COUNT2
GOTO LOOPD1
;
;****** гаснет красный, желтый и зеленый ***********
;
BCF VD2
BCF VD1
BCF VD6
;
;***** горят другой красный и зеленый **************
;
BSF VD3
BSF VD4
MOVLW H32 ;пересылка константы 50 в W
MOVWF COUNT2 ;загрузка 50 в COUNT2
MOVWF COUNT1 ;загрузка 50 в COUNT1
LOOPD2
DECFSZ COUNT1,F ;декремент COUNT1
CALL INPUT_DATA
BTFSS TEMPA,0 ; пропустить команду если (TEMPA,0) = 1
GOTO END_P
GOTO LOOPD2 ;
CLRWDT ;сброс сторожевого таймера
MOVWF COUNT1
DECFSZ COUNT2,F ;декремент COUNT2
GOTO LOOPD2
;
;***** горит желтый где горит красный **********
;
BSF VD5 ;зажечь желтый свет
MOVLW HA ;пересылка константы 50 в W
MOVWF COUNT2 ;загрузка 50 в COUNT2
MOVWF COUNT1 ;загрузка 50 в COUNT1
LOOPD3
DECFSZ COUNT1,F ;декремент COUNT1
CALL INPUT_DATA
BTFSS TEMPA,0 ; пропустить команду если (TEMPA,0) = 1
GOTO END_P
GOTO LOOPD3 ;
CLRWDT ;сброс сторожевого таймера
MOVWF COUNT1
DECFSZ COUNT2,F ;декремент COUNT2
GOTO LOOPD3
;
;***** гаснут красный, желтый и зеленый ***********
;
BCF VD5
BCF VD4
BCF VD3
END_P
RETURN
INPUT_DATA ;подпрограмма проверки порта А
MOVF PORTA,W ;чтение состояния порта А в W
MOVWF TEMPA ;пересылка W в TEMPA
RETURN
PROCESSING_DATA ;подпрограмма анализирования принятых данных
BEGIN
MOVF PORTA,W ;чтение состояния порта А в W
MOVWF TEMPA ;пересылка W в TEMPA
ANDLW 0x7 ;наложение на W маски b00000111
SUBWF TEMPA,W ;вычитание W из TEMPA
BTFSC Z ;пропустить команду, если результат нулевой
GOTO TWO
GOTO END_PP
;
;************красный свет во всех направлениях*************
;
TWO
CLRF COUNT1 ;обнуление регистра COUNT1
MOVWF COUNT1 ;пересылка W в COUNT1
INCF COUNT1 ;инкрементирование COUNT1
MOVF COUNT1,W
SUBWF TEMPA,W
BTFSC Z
GOTO THREE
BSF VD1
BSF VD4
V1
CALL INPUT_DATA
BTFSS TEMPA,0
GOTO BEGIN
GOTO V1
;
;**********зеленый свет во всех направлениях************
;
THREE
CLRF COUNT1
MOVWF COUNT1
INCF COUNT1
MOVF COUNT1,W
SUBWF TEMPA,W
BTFSC Z
NOP ;пустая команда предназначение здесь т. к. все варианты проверены)
BSF VD3
BSF VD6
V2
CALL INPUT_DATA
BTFSS TEMPA,0
GOTO BEGIN
GOTO V2
END_PP
RETURN
END ;конец программы
Приложение
Размещено на www.allbest.