курсовой проект / Аэроионизатор / Лит-ра для КР / ТЕХНИЧЕСКОЕ ЗАДАНИЕ
.docНа выводы 10 – 13 микроконтроллера поступают сигналы от четырех установленных на плате ввода/вывода кнопок, с помощью которых управляют источником. Формируемые микроконтроллером в последовательной форме сигналы управления находящимися на той же плате двумя цифровыми светодиодными индикаторами сдвиговый регистр DD2 преобразует в параллельную форму. Индикация динамическая: в зависимости от уровней напряжения на выводах 6 и 9 DD1 в каждый момент времени работает лишь один из индикаторов.
5 РАЗРАБОТКА УПРАВЛЯЮЩЕЙ ПРОГРАММЫ
list p=pic16f628 Задаем тип микроконтроллера;
Include <p16f628.inc> Подключаем файл с описанием служебных регистров
микроконтроллера PIC16F628;
config _INTRC_OSC_CLKOUT &_DATA_CP_OFF &_CP_OFF _BODEN_ON &_MCLRE_OFF &_PWRTE_ON &_WDT_OFF &_LVP_OFF
Задаем слово конфигурации микроконтроллера;
bot equ 20h Начальный адрес размещения переменных;
cblock bot
impuls
temp
endc
#define shift STATUS,RP0 Бит переключения банков;
#define zero STATUS,Z Бит нулевого результата;
#define carry STATUS,C Бит отрицательного результата;
#define speed PCON,OSCF Бит переключения скорости RC-генератора;
#define key_1 PORTA,1 Кнопка №1;
#define key_2 PORTB,0 Кнопка №2;
#define key_3 PORTB,1 Кнопка №3;
#define led PORTB,2 Вывод светодиода;
org 0x2100 Адрес EEPROM памяти;
DATA 0xA5 Ячейка EEPROM памяти со стартовой скважно-
стью ШИМ;
org 0x000 Вектор сброса;
goto reset Идем на инициализацию;
org 0x004 Вектор прерываний;
return Выход с запрещением прерываний;
Инициализация микроконтроллера;
reset clrf PORTB Очищаем порт В;
clrf PORTA Очищаем порт A;
movlw 0xff
movwf CMCON Выключаем модуль компараторов;
bsf shift Выбираем Банк №1;
movlw b’00000111’
movwf OPTION_REG Включаем делитель перед TMR0 1:256;
movlw 0xff
movwf TRISA Определяем направление работы порта А;
movlw b’00000011’
movwf TRISB Определяем направление работы порта В; bcf shift Выбираем Банк №0;
Начало основной программы
off clrf CCP1CON Выключаем ШИМ;
bcf PORTB,3 Устанавливаем логический 0 на выходе ШИМ;
movlw b’00111111’
movwf T2CON Настраиваем работу TMR2;
bsf shift Выбираем Банк №1;
movlw 0xff
movwf PR2 Задаем новый период работы TMR2;
bcf speed Переключаем скорость внутреннего RC- гене-
ратора (37КГц);
bcf shift Выбираем Банк №0;
bsf PIR1,TMR2IF Устанавливаем флаг прерывания TMR2;
scan_1 btfsc key_1 Проверяем состояние кнопки key_1;
goto start Если нажата, то идем на метку start ;
btfss PIR1,TMR2IF Проверяем состояние флага прерывания TMR2;
goto scan_1
bcf PIR1,TMR2IF Сбрасываем флаг прерывания TMR2;
btfss led Проверяем, включен ли светодиод;
goto led_on Если он выключен, то идем на соответствую- щую метку;
led_off bcf led Выключаем светодиод;
movlw b’00111111’
movwf T2CON Задаем новый период работы TMR2;
goto scan_1 Возвращаемся в начало цикла поверки состоя-
ния кнопки key_1;
led_on bsf led Включаем светодиод ;
movlw b’00000111’
movwf T2CON Задаем новый период работы TMR2;
goto scan_1 Возвращаемся в начало цикла поверки состоя-
ния кнопки key_1;
start bcf led Гасим светодиод;
bsf shift Выбираем Банк №1;
bsf speed Переключаем скорость внутреннего RC-
генератора (4МГц);
movlw 0x3E
movwf PR2 Задаем период ШИМ (15кГц);
bcf shift Выбираем Банк №0;
call write Вызываем подпрограмму записи скважности в регистры ШИМ;
movlw b’01111100’
movwf T2CON Настраиваем работу TMR2;
movlw b’00001111’
iorwf CCP1CON,1 Запускаем ШИМ;
scan_2 btfss key_ Проверяем, не отпущена ли кнопка key_1;
goto off Если отпущена, то идем на метку off;
btfss key_2 Проверяем состояние кнопки key_2;
goto plus Если нажата, то идем на метку plus ;
btfss key_3 Проверяем состояние кнопки key_3;
goto minus Если нажата, то идем на метку minus;
goto scan_2 Повторяем цикл сканирования клавиатуры;
plus movf impuls,w Сохраняем величину импульса ШИМ в аккуму-
ляторе;
sublw 0xff Сравниваем значение импульса ШИМ с макси -
мальным значением;
btfsc zero Проверяем состояние флага Z;
goto exit_2 Если значение максимально, то выходим;
movlw 0x03
addwf impuls,1 Увеличиваем длительность импульса ШИМ;
goto exit_1 Идем на выход;
minus movf impuls,w Сохраняем величину импульса ШИМ в аккумуля-
торе;
sublw 0x69 Сравниваем значение импульса ШИМ с мини –
мальным значением;
btfsc zero Проверяем состояние флага Z;
goto exit_2 Если значение минимально, то выходим;
movlw 0x03
subwf impuls,1 Уменьшаем длительность импульса ШИМ;
goto exit_1 Идем на выход;
exit_1 bcf INTCON,GIE Запрещаем все прерывания;
movf impuls,w Сохраняем значение длины импульса в аккумуля –
торе;
bsf shift Выбираем Банк №1;
movwf EEDATA Переписываем значение импульса в регистр
EEPROM памяти;
clrf EEADR Задаем адрес ячейки EEPROM памяти;
bsf EECON1,WREN Разрешаем запись в EEPROM память;
movlw 0x55
movwf EECON2 Записываем код для разрешения записи в EEPROM память;
movlw 0xAA
movwf EECON2 Записываем код для разрешения записи в EEPROM память;
bsf EECON1,WR Включаем запись;
btfsc EECON1,WR Ожидаем окончания записи;
goto $-1
bcf shift Выбираем Банк №0;
call write Вызываем подпрограмму записи скважности в регистры ШИМ;
exit_2 bsf led Включаем светодиод;
movlw 0x02 Задаем величину паузы;
call pause Вызываем подпрограмму паузы;
bcf led Выключаем светодиод;
movlw 0x04 Задаем величину паузы;
call pause Вызываем подпрограмму паузы;
goto scan_2 Возвращаемся в начало цикла поверки состоя-
ния кнопок;
Подпрограмма записи скважности в регистры ШИМ
write bsf shift Выбираем Банк №1;
clrf EEADR Задаем адрес ячейки EEPROM памяти;
bsf EECON1,RD Включаем чтение EEPROM памяти;
movf EEDATA,w Сохраняем полученное значение в аккумулято-
ре;
bcf shift Выбираем Банк №0;
movwf impuls Переписываем полученное значение длительно-
сти импульса в регистр;
movwf temp Переписываем полученное значение длительно-
сти импульса в регистр;
bcf CCP1CON,4 Сбрасываем бит;
bcf CCP1CON,5 Сбрасываем бит;
bcf carry Сбрасываем флаг С;
rrf temp,1 Сдвигаем вправо значение регистра, в котором находится величина длительности импульса;
btfsc carry Проверяем состояние флага С;
bsf CCP1CON,4 И устанавливаем бит, если С=1;
bcf carry Сбрасываем флаг С;
rrf temp,1 Сдвигаем вправо значение регистра, в кото- ром находится величина длительности им-
пульса;
btfsc carry Проверяем состояние флага С;
bsf CCP1CON,5 И устанавливаем бит, если С=1;
movf temp,w
movwf CCPR1L Записываем старшие разряды скважности
return Выходим из подпрограммы;
Подпрограмма паузы для обеспечения плавности регулировок скважности ШИМ
pause movwf temp Сохраняем величину паузы в регистре;
clrf TMR0 Очищаем TMR0;
p_1 bcf INTCON,T0IF Сбрасываем флаг прерывания по переполне-
нию TMR0;
btfss INTCON,T0IF Проверяем состояние флага переполнения
TMR0;
goto $-1 Создаем цикл;
decfsz temp,1 Отнимаем единицу от значения регистра;
goto p_1 Создаем цикл;
return Выходим из подпрограммы.
end