Разработка программного обеспечения ССОО
⇐ ПредыдущаяСтр 2 из 2 Требуется разработать программу для опроса кнопок "СБРОС", "ТРЕВОГА" и "ТЕСТ" в соответствии с п3.1. При нажатии кнопки "СБРОС" записать номер выбранного сообщения 0 (нет передачи) в регистр R0, при этом надо остановить отсчет временного тридцатисекундного интервала (таймер 0), обнулить флаг запроса прерывания таймера 0 и флага временного интервала 30с FLAG. При нажатии кнопки "ТРЕВОГА" записать номер выбранного сообщения 2 (ALARM) в регистр R0. При нажатии кнопки "ТЕСТ" записать номер выбранного сообщения 1 (TEST) в регистр R0. Программа размещается в общем тексте программного модуля, начиная с метки Key до команды выхода из подпрограммы RET. В сообщениях test и alarm сделать замену выделенного поля на свою фамилию, используя только заглавные латинские буквы. Размер поля изменять нельзя. Выполнить отладку модуля, используя программу browse.exe [4]. Для проверки передачи данных в транспондер, соединить два компьютера, на одном запустить программу в debug.exe, сконфигурировать контроллер, настроить связь через COM порт, на другом компьютере запустить программу Сontroller debug program ярлыком СomDial с рабочего стола компьютера (рис. 8).
Рис.8 Окно программы СomDial
На панели «Состояние СОМ-порта» выбрать номер порта «1», скорость передачи данных «4800» и клавишей «Open» открыть порт. Выбрать из закладок вкладку «Терминал». Включить на стенде переключатель «Тревога». Передаваемые данные будут отображаться в окне «Терминал». Через 1 мин выключить переключатель «Тревога», включить переключатель «Test», проконтролироать выдачу данных в окне «Терминал». На рис. 9 приведен пример отображения передаваемых данных в окне «Терминал» программы СomDial.
Рис.9 Пример отображения передаваемых данных в окне «Терминал» программы СomDial. Визуально проверить правильность приема данных. Записать программу в контроллер, соединить с транспондером, реализовать передачу.
Содержание отчета. Отчет по выполненной работе должен содержать: · задание в соответствии с вариантом; · электрическую принципиальную схему ССОО; · спецификацию; · тексты передаваемых сообщений с заданным MMSI станции и своей фамилией; · текст программы; · скриншоты Сontroller debug program с принятыми сообщениями "ТРЕВОГА" и "ТЕСТ";
Библиографический список 1. Судовая автоматизированная идентификационная система /А.Н. Маринич [и др.]; под ред. Ю.М.Устинова. – СПб.: Судостроение, 2004.-179 с. 2. Шишкин, А.В. Глобальная морская система связи при бедствии и для обеспечения безопасности мореплавания: уч. пособие /А.В. Шишкин -М.: ТрасЛит, 2007. -544 с. 3. Грошева, Л.С.Архитектура микроконтроллеров MCS-51: учеб. пособие для студентов очного обучения: по специальностям 162107 «Техническая эксплуатация транспортного радиооборудования» и 180407.65 «Эксплуатация судового электрооборудования и средств автоматики»/ Л.С. Грошева, В.И. Плющаев. – Н.Новгород: Изд-во ФБОУ ВПО «ВГАВТ»,2014.–68с. 4. Грошева, Л.С.Архитектура микроконтроллеров MCS-51: метод. пособие для студентов очного обучения: по специальности 162107 «Техническая эксплуатация транспортного радиооборудования»/ Л.С. Грошева.– Н.Новгород: Изд-во ФБОУ ВПО «ВГАВТ»,2015.–32 с.
Оглавление
Приложение1 1. Микроконтроллер MCS51
2. Блок кнопок
3. Последовательный порт RS-232
4. Транспондер
5. Блок питания Приложение2 ;================================= ; Программа контроллера СССО ;================================= .PUBLIC INIT RegKan: Equ 30h;Состояние передачи NomBuf: Equ 31h;Номер передаваемого буфера FLAG: Reg 20h.0;Флаг временного интервала 30с
.ORG 0;Размещение команды по адресу 0000h LJMP INIT;Обход векторов прерывания при включении МК
.ORG 000Bh;Размещение команды по адресу 000Вh LJMP Timer;Вектор прерывания таймера/счетчика 0
.ORG 23H;Размещение команды по адресу 0023h LJMP Serial;Вектор прерывания последовательного канала
.org 30h;Размещение команд с адреса 0030h ;Инициализация необходимых ресурсов микроконтроллера INIT: mov SP,#50h;организовать стек в верхних адресах ОЗУ mov RegKan,#0;Нет передачи ;Программирование и запуск таймера 1 MOV TMOD,#00100001B;Таймер 1 в режиме 2, таймер 0 в режиме 1 MOV TH1,#0faH;Установить скорость передачи данных MOV TL1,#0faH; 4800 бит/сек ;Программирование последовательного канала mov SCON,#01000000b; 8-битовый асинхронный передатчик
SETB IE.4;Разрешить прерывания последовательного канала SETB IE.1;Разрешить прерывания таймера 0 SETB IE.7; Общее разрешение прерываний SETB TR1;Запустить таймер 1 CLR TR0;Таймер 0 остановлен CLR FLAG;Сброс флага завершения временного интервала 30с
MOV R0,#0;Обнуление регистров общего назначения MOV R1,#0 MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0 MOV R6,#0 MOV R7,#0
;Основной модуль передачи буфера на траспондер Upr_Mod: lcall Key;Вызов подпрограммы анализа клавиш mov NomBuf,R0;Сохранение номера передаваемого буфера AnBuf: CJNE R0,#1,M0;Выбор буфера для передачи MOV dptr,#test;Выбран буфер передачи тестового сообщения MOV R1,#46;Длина передавемого буфера 46 символов LJMP M1;Переход на передачу буфера M0: CJNE R0,#2,Upr_Mod;Выбор буфера для передачи MOV dptr,#alarm;Выбран буфер передачи тревожного сообщения
MOV R1,#46;Длина передавемого буфера 46 символов
M1: JB FLAG,Upr_Mod;Проверка флага временного интервала 30с SETB FLAG;Установка флага временного интервала 30с MOV B,R1;Запись числа передаваемых символов DEC R1;Вычисление числа символов для DEC R1;расчета контрольной суммы R1-2 LCALL ConSum;Обращение к программе расчета контр. суммы
MOV R0,#0;Индекс первого передаваемого символа MOV R1,B;Запись числа передаваемых символов Upr_Mod1:;Передача байтов из буфера MOV A,RegKan; проверить занят ли канал JNZ Upr_Mod1; перейти, если занят (нельзя передавать) MOV RegKan,#1;Разрешить передачу MOV A,R0 MOVC A,@A+dptr;Взятьочередной символ из буфера MOV SBUF,A;Выдать байт из аккумулятора в ;последовательный канал INC R0;Увеличить индекс передаваемого символа DJNZ R1,Upr_Mod1;Повторять передачу всех символов буфера
Upr_Mod2:;Передача первого байта контрольной суммы MOV A,RegKan; проверить занят ли канал JNZ Upr_Mod2; перейти, если занят (нельзя передавать) MOV RegKan,#1;Разрешить передачу MOV SBUF,R3;Выдать байт из R3 в ;последовательный канал Upr_Mod3:;Передача второго байта контрольной суммы MOV A,RegKan;проверить занят ли канал JNZ Upr_Mod3;перейти, если занят (нельзя передавать) MOV RegKan,#1;Разрешить передачу MOV SBUF,R4;Выдать байт из R4 в последовательный канал Upr_Mod4:;Передача символа <CR> MOV A,RegKan; проверить занят ли канал JNZ Upr_Mod4; перейти, если занят (нельзя передавать) MOV RegKan,#1;Разрешить передачу MOV SBUF,#0Dh;Выдать байт в последовательный канал Upr_Mod5:;Передача символа <LF> MOV A,RegKan; проверить занят ли канал JNZ Upr_Mod5; перейти, если занят (нельзя передавать) MOV RegKan,#1;Разрешить передачу MOV SBUF,#0Ah;Выдать байт в последовательный канал ;Программирование таймера для отсчета интервала 30 с MOV TH0,#43h;начальная константа для отсчета MOV TL0,#5Dh;интервала 0.05сек MOV R5,#0;Обнуление регистра отсчета 1 сек MOV R7,#0;Обнуление регистра отсчета 30 сек SETB TR0;Запуск таймера на счет Mov R0,NomBuf;Восстановление номера передаваемого буфера ljmp Upr_Mod;Переход к анализу состояния клавиш
;Программа обработки прерывания последовательного канала Serial: PUSH A;запись содержимого аккумулятора в стек
MOV a,RegKan;Проверка состояния передачи CJNE A,#1,EXIT;если не 1, то вход не по запросу прерывания JBC TI,Pered;Перейти, если флаг завершения передачи байта=1 CLR RI;Сбросить флаг приема LJMP EXIT Pered:;Передача байта закончена mov RegKan,#0;Разрешение передачи следующего байта LJMP EXIT EXIT: POP A;Восстановить содержимое аккумулятора из стека RETI;Выход из программы обработки прерывания
;Программа обработки прерывания последовательного канала Timer: CLR TR0;Остановить таймер MOV TH0,#43h;начальная константа для отсчета MOV TL0,#5Dh;интервала 0.05сек INC R5;увеличить счетчик интервалов для 1секунды CJNE R5,#20,EX;проверка завершения 1 секунды MOV R5,#0;обнульть счетчик интервалов для 1секунды INC R7;увеличить счетчик секунд CJNE R7,#30,EX;проверка завершения 30 секунд MOV R7,#0;обнульть счетчик интервалов для 30секунд CLR FLAG;Сброс флага временного интервала 30с LJMP EXX EX: SETB TR0;запустить таймер и продолжить отсчет 30с EXX: RETI;Выход из программы обработки прерывания
;Программа расчета контрольной суммы ConSum: MOV R0,#1;Индекс очередного символа MOV R2,#0;Начальное значение контрольной суммы ConM: MOV A,R0 MOVC A,@A+dtpr;Взятьочередной символ из буфера XRL A,R2;вычисилить текущее значение контрольной суммы MOV R2,A;сохранить текущее значение контрольной суммы INC R0;Увеличить индекс очередного символа на 1 DJNZ R1,ConM;Уменьшить счетчик символов на 1 ; если не 0, то повторить вычисление MOV A,R2;Взять итоговое значение контрольной суммы ANL A,#F0h;Выделить старшую половину RR A; и сдвинуть ее на 4 позиции вправо RR A RR A RR A LCALL ASCI;обратиться к программе преобразования в ASCII MOV R3,A;записать первый байт контрольной суммы в ASCII MOV A,R2;Взять итоговое значение контрольной суммы ANL A,#0Fh;Выделить младшую половину LCALL ASCI;обратиться к программе преобразования в ASCII MOV R4,A;записать второй байт контрольной суммы в ASCII RET;Выход из программы
;Программа преобразования в ASCII код ASCI: CJNE A,#AH,SL;Если код больше 9 SL: JNC PR;то перейти на символы ADD A,#30h;Преобразовать код 0-9 в ASCII код RET;Выход из программы PR: CLR C SUBB A,#AH;Преобразовать код A-F в ASCII код ADD A,#41h RET;Выход из программы
;Программа анализа состояния клавиш Key:;проверка кнопки "СБРОС" JB P0.7,Kn;если кнопка "СБРОС" не нажата, то проверять другие MOV R0,#0;Номер выбиранного буфера 0 (нет) CLR TR0;Прекратить расчет временного интервала CLR TF0;Сбросить флаг запроса прерывания таймера 0 CLR FLAG;Сброс флага временного интервала 30с RET;Выход из программы
Kn:;проверка кнопок "ТРЕВОГА" JNB P0.0, Met1;переход на метку, если нажата JNB P0.1, Met1;хоть одна из тревожных кнопок JNB P0.2, Met1 ;проверка кнопки "ТЕСТ" JNB P0.4, Met2;переход на метку, если нажата RET;Выход из программы
Met1: MOV R0,#2;Выбран буфер "ТРЕВОГА" RET;Выход из программы Met2: MOV R0,#1;Выбран буфер "ТЕСТ" RET;Выход из программы
; Сообщения
test:.DB "!AIABM,1,1,1,799000001,3,12,TEST01234567890,0*" alarm:.DB "!AIABM,1,1,1,799000001,3,12,ALARM1234567890,0*"
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|