1. ЦЕЛЬ
Приобрести навык составления функциональной схемы. Выучить способы формирования сигналов управления и индикации, научиться формировать звуковые и световые сигналы на примере микроконтроллера PIC16F84A, рассмотреть использование динамической индикации.
3. ЗАДАНИЕ ПО ЛАБОРАТОРНОЙ РАБОТЕ
3.1. На заданном выводе микроконтроллера сформировать сигнал с заданной частотой и скважностью Q = 2 при нажатой кнопке.
3.1.1. Разработать функциональную схему микроконтролерного устройству с выводом сигнала на звуковой излучатель.
3.1.2. Разработать и наладить управляющую программу.
3.2. На заданном выводе микроконтроллера сформировать сигнал с заданной частотой и скважнистю Q = 2 при отжатой кнопке.
3.2.1. Разработать функциональную схему микроконтролерного устройству с выводом сигнала на дискретный свитлодиодний индикатор.
3.2.2. Разработать и наладить управляющую программу.
3.3. На девятиразрядном семисегментном свитлодиодному индикаторе с помощью динамической индикации с заданной частотой возобновления всех разрядов индикатора, отобразить группу и свои инициалы.
3.3.1. Разработать функциональную схему микроконтролерного устройству.
3.3.2. Разработать и наладить управляющую программу.
Для заданий 3.1 и 3.2 позволяется разработать общую функциональную схему и управляющую программу. Выводы микроконтроллера для подключения кнопок выбрать самостоятельно.
Тактування микроконтроллера выполнить от тактового генератора с частотой Fosc = 4 МГц.
4. ВАРИАНТЫ ЗАДАНИЙ
4.1. Варианты задания 3.1.
Вывод | RA0 | RA1 | RA2 | RA3 | RB0 | RB1 | RB2 | RB3 | RB4 | RB5 | RB6 | RB7 | RA0 | RA1 | RA2 |
Частота, Гц |
4.2. Варианты задания 3.2.
Вывод | RB0 | RB1 | RB2 | RB3 | RB4 | RB5 | RB6 | RB7 | RA0 | RA1 | RA2 | RA3 | RB0 | RB1 | RB2 |
Частота, Гц | 0,2 | 0,4 | 0,6 | 0,8 | 1,5 | 2,5 | 0,3 | 0,5 | 0,7 | 0,9 | 1,2 | 1,7 |
4.3. Варианты задания 3.3.
Частота, Гц |
Пример.Формирование символов на семисегментном индикаторе
Соответствие сегментов индикатора разрядам двоичного числа:
H | G | F | E | D | C | B | А | |
Для отображения символа "5" на индикатор необходимо выдать следующий двоичный код:
Пример программы.Управляющая программа прострой, который отображает четыре символа на индикаторе с помощью динамической индикации, подсчет количества нажатий и отпусков кнопки, изменяя при этом частоту возобновления индикатора и частоту звукового сигнала.
; подключение файла с описанием стандартных констант и значений
#include p16f84a.inc
; формирование конфигурационного слова
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
; описание ячеек памяти данных
cblock 0x0C ; начиная с адреса 0x0C
W_TEMP ; сохранение W при вызове прерывания
STATUS_TEMP ; сохранение STATUS при прерывании
dig0 ; буфера на 4 разряда
dig1
dig2
dig3
segment ; номер отображаемого разряда
endc
; описание констант
init_porta equ b'00000100' ; RA2 на вводе, другие - на вывод
init_portb equ b'00000000' ; все разряды на вывод
init_option equ b'00000011' ; TMR0 считает CLKOUT/16
init_intcon equ b'10100000' ; прерывание от TMR0
; начало программы
org 0 ; вектор сброса
bcf INTCON, GIE ; запрещение всех прерываний
goto main ; переход на начало основной программы
; обработчик прерывания
int_start
org 0x04 ; вектор прерывания
movwf W_TEMP ; сохранение W и STATUS
swapf STATUS, W
movwf STATUS_TEMP
btfsc INTCON,T0IF ; прерывание от таймера?
goto tmr_int ; переход на обработчик прерывания
; при переполнении таймера
movlw b'00100000' ; разрешение прерываний только от таймера
movwf INTCON
goto int_end ; переход в заключение обработчика
; обработчик прерывания от таймера
tmr_int
bcf INTCON, T0IF ; очистка флажка переполнения TMR0
call UpdateDig ; возобновление состояния индикатора
swapf dig0, W ; инициализация значения таймера
andlw 0xF0
movwf TMR0
movlw b'00001000' ; формирование звукового сигнала
xorwf PORTA, F
int_end ; окончание обработчика прерывания
swapf STATUS_TEMP, W ; восстановление значений
movwf STATUS ; регистров W и STATUS
swapf W_TEMP, F
swapf W_TEMP, W
retfie ; возвращение из прерывания
; подпрограмма восстановления состояния индикатора
UрdаtеDіg
incf PORTA, W ; выбор дежурного разряда
andlw 0x03
movwf segment
movf PORTA, W
andlw 0xFC
iorwf segment, W
movwf PORTA
movlw dig0 ; подготовка содержания текущего разряда
addwf segment, W
movwf FSR
movf INDF, W
call bcd_table ; превращение в 7-сегментный код
movwf PORTB ; вывод текущего разряда
return
; подпрограмма превращения двоичного значения в 7-сегментный код
bcd_table
andlw 0x0F
addwf PCL, F
retlw b'00111111' ; 0
retlw b'00000110' ; 1
retlw b'01011011' ; 2
retlw b'01001111' ; 3
retlw b'01100110' ; 4
retlw b'01101101' ; 5
retlw b'01111101' ; 6
retlw b'00000111' ; 7
retlw b'01111111' ; 8
retlw b'01101111' ; 9
retlw b'01110111' ; А
retlw b'01111100' ; B
retlw b'00111001' ; C
retlw b'01011110' ; D
retlw b'01111001' ; E
retlw b'01110001' ; F
; подпрограмма инициализации микроконтроллера
Init
bsf STATUS, RP0 ; выбор банка 1
movlw init_porta ; инициализация регистра TRISA
movwf TRISA^80h
movlw init_portb ; инициализация регистра TRISB
movwf TRISB^0x80
movlw init_option ; инициализация регистра OPTION
movwf OPTION_REG^80h
clrf STATUS ; выбор банка 0
clrf dig0 ; инициализация отображения символа
movlw .10
movwf dig1
movlw 6
movwf dig2
movlw 9
movwf dig3
movlw init_intcon ; инициализация регистра INTCON, movwf INTCON ; разрешение прерываний
return
; основная программа
main
call Init ; инициализация микроконтроллера
m1 btfsc PORTA, 2 ; ожидание нажатия на кнопку
goto m1
incf dig0, F ; увеличение значения первого разряда
m2 btfss PORTA, 2 ; ожидание отпуска кнопки
goto m2
incf dig0, F ; увеличение значения первого разряда
goto m1
end ; конец программы