АТ-команда
|
Значение
|
ERROR
|
Ошибка
|
OK
|
Команда
выполнена
|
Нам необходима скорость в 19200 бит/с для этого используется
ТС1 в режиме 1.
Далее передается АТ-команда получения SMS "AT+CMGR=1. После этого нужно
принять от GSM-терминала сообщение "start", которое
подтверждает начало выполнения операции.
После того, как подпрограмма передачи АТ-команд выполнила все
действия, происходит выход из подпрограммы, возобновляется анализ портов.
Рис.3.2 - Подпрограмма получения SMS
3.2
Подпрограмма приёма СМС
На рисунке 3.3 представлен алгоритм подпрограммы приёма. Как
видно из него, мы ждем пока флаг прерывания приёмника установится в логическую
"1", это говорит нам, что символ принят. Далее содержание буфера
приёмника записывается в аккумулятор и происходит сброс флага приёмника.
Рисунок 3.3 -
Подпрограмма приёма
3.3
Обработчик прерываний от ТС0
Так как один машинный такт занимает 12 временных тактов, на
вход таймеров счетчиков будут поступать импульсы с частотой:
= fтакт / 12 = (11.0592 * 10^6) / 12 = 0.9216 МГц,
где fтакт = 11.0592 МГц - частота процессора.
Так как таймеры-счетчики настроены как 16-тиразрядные
таймеры, то максимальное значение в них равно 65535, что соответствует
максимальному времени:
= 65536/ (0.9216 * 10^6) = 71.11 мс,
поэтому прерывание от него происходит раз в 71 мс. После
запуска реле двигателя требуется 5 секунд задержки до выключения двигателя,
следовательно, необходимое нам количество прерываний находим как: 5/ 71 * 10-3
= 70. Тоесть таймер будет иметь 70 прерываний.
Рисунок 3.4 - Алгоритм обработчика прерываний
4. Разработка
схемы электрической принципиальной
В качестве микроконтроллера для сигнализации возьмём
контроллер из семейства MCS-51 фирмы Atmel, а именно AT89C51. Данный
микроконтроллер имеет 4 КБайт флэш-памяти с внутрисхемным программированием,
125 байт внутреннего ОЗУ, 2 16-ти разрядных таймер-счётчика, 1 последовательный
интерфейс UART, рабочий диапазон температур от - 40 до 80 C0. Напряжение питания от
4.5 до 5.5 В, необходимый ток 20 мА.
На рисунке 4.1 представлено расположение выводов данного
микроконтроллера.
Рисунок 4.1 - Микроконтроллер AT89C51
В устройстве используются порты P3.0 (RxD) и P3.1 (TxD) для
последовательного интерфейса, входы XTAL1 и XTAL2 для подключения кварцевого
резонатора, порты P1.1, P1.2 и P1.3 для подключения датчиков.
4.1 Цепь
сброса
Цепь сброса включается для начальной установки всех
внутренних систем процессора в момент включения питания. На рисунке 4.2
представлена схема начального сброса.
Рисунок 4.2 - Схема начального сброса
Чтобы при включении питания сброс был гарантированно выполнен,
вывод RST должен удерживаться в состоянии высокого уровня в течение времени,
достаточного для запуска тактового генератора плюс еще минимум два машинных
цикла. Время запуска тактового генератора зависит от его частоты работы и для
10 МГц кварцевого резонатора составляет в среднем 1 мс. Если взять значение
резистора равным 1кОм, то по формуле емкость конденсатора будет составлять 1 мкФ.
4.2 Кварцевый
резонатор
Он предназначен для формирования и выдачи внутренних
синхросигналов фаз, тактов и циклов. Для работы с последовательным портом
микроконтроллера возьмём частоту резонатора 11.059 МГЦ. Схема подключения
кварцевого резонатора показана на рисунке 5.3.
Рис. 4.3 - Схема подключения кварцевого резонатора
Значения емкостей в данной схеме обычно берут 3010 пФ
4.3 Цепи
питания и прочее
Для фильтрации (сглаживания) бросков напряжения в цепи
питания обычно используют конденсатор. Возьмём его емкость равной 1 мкФ.
Рисунок 4.4 - Цепь питания микроконтроллера
На вход DEMA необходимо подать логическую "1" т.е.
напряжение более 2.4В, возьмём 3В. У нас есть источник питания +5В, значит
необходимо поставить резистор, на котором падает 2В. Если ток равен 50мкА, то
необходим резистор 39 кОм
5. Разработка
программы на языке ассемблера
Листинг программы на языке ассемблера
org 0; начало с 0 адреса
jmp START; переход на метку
ORG 0BH; после метки START, программа начинается в
0ВН
START: P0,#0; подаем нули на неиспользуемые контакты
mov P3,#00000011b; подаем нули на неиспользуемые контакты
mov SP,#80h; запись начинается с адреса 81h
mov 08h,#0FFh; запись в ОЗУ первоначального состояния порта Р1
mov 09h,#0h; запись в 0ЗУ первоначального состояния порта Р2
PROVERKA:TMOD,#00100001b; настройка ТС1 TH1,#0FDh; запись числа в старшие
байты ТС
mov TL1,#0FDh; запись числа в младшие байты ТС
mov SCON,#01010000b; режим UART, передача 9 битного
пакета
mov PCON,#10000000b; удвоение скорости
mov TCON,#01000000b; включение ТС1
nabor:
mov R0,#0
mov DPTR,#prer1
string:
movc A,@A+DPTR; загружаем байт в аккумулятор из DPTR
mov SBUF,A; записываем значения из А в буфер
again:
JNB TFI,again; ветвление по адресу, пока флаг таймера не
переполниться
clr TFI
inc R0; увеличение значения регистра R0 на 1
mov R4,#0; флаг для прерывания от ТС0, который еще не включен
cjne A,#9,string PRIEM; должны принять "start
CJNE A,#'s',naborPRIEM A,#'t',nabor
LCALL PRIEM
CJNE A,#'a',nabor
LCALL PRIEM
CJNE A,#'r',nabor
LCALL PRIEM
CJNE A,#'t',nabor; если пришло start, то начинается выполнение операции
mov N, 1; Количество попыток запуска двигателя
Dvigatel:
CMP P1.1, #0, Dvigatel; Сравнивание D и 0 (двигатель заглушен)
JZ Korobka; Переход к проверке Korobka
Dvigatel: RETI; выход из цикла
Korobka:
CMP P1.2, #1, Korobka; Сравнивание KP и 0 (стоит нейтральная
передача)
JZ Ruchnik; Переход к проверке Ruchnik
Korobka: RETI; выход из цикла
Ruchnik:
CMP P1.3, #1, Ruchnik; Сравнивание RT и 1 (ручной тормоз
включен)
JZ Run; Переход к Run
Ruchnik: RETI; выход из цикла
Run:
mov P1.7, #1h; Подача наивысшего уровня для запуска двигателя
CMP P1.1, 1, Dvigatel; Сравнивание D и 1 (двигатель запущен)
JZ Answer_true; Переход на метку с положительным отчетом
inc N; увеличение N на единицу, для подсчета попыток
PRIEM:R4,#0,vyhod RI,PRIEM; Ждём пока придёт
символ, и в регистр R1 установится 1
mov A,SBUF; Записываем в аккумулятор пришедший символ из буфера
CLR RI
vyhod: RETI:
inc R2R2,#70, ret_1R2,#0 R4,#1; задержка на 5
секунд
ret_1: RETI
mov P1.7, #0h; отмена запуска реле
CMP N, 3; проверка количества попыток
JBE Run
Dvigatel: RETI
JMP Answer_false; Переход на метку с отрицательным отчетом
Answer_true:: mov R0,#0; передача команды
"AT+CMGS=89227157174", т.е. отправка SMS на номер абонента
mov DPTR,#prer2:TFI,againTFI R0
cjne A,#20,string R0,#10h; ввод в отчета о
выполнении операции
string:A,@R0SBUF,A:TFI,againTFI R0
cjne A,#30,string:
LCALL PRIEM; принятине отчета о количестве отправленных смс
CJNE A,#30,kolvo; т.к. нам не понадобится данная информация, то
ждем окончания строки
LCALL PRIEM; подтверждение отправки sms
CJNE A,#'O',smska
LCALL PRIEMA,#'K',smska;_false:: mov R0,#0; передача команды
"AT+CMGS=89227157174", т.е. отправка SMS на номер абонента
mov DPTR,#prer2:TFI,againTFI R0
cjne A,#20,string
mov R0,#10h; ввод в отчет о выполнении операции
again:TFI,againTFI R0
cjne A,#30,kolvo: LCALL PRIEM; принятие отчета о количестве отправленных смс
CJNE A,#30,kolvo; т.к. нам не понадобится данная информация, то
ждем окончания строки
LCALL PRIEM; подтверждение отправки sms
CJNE A,#'O',smska
LCALL PRIEMA,#'K',smska;: db ' AT+CMGR=1; ',9: db
'AT+CMGS=89227157174; ', 19;
Заключение
Разработанное в курсовой работе устройство, осуществляет
запуск двигателя с помощью отправки SMS сообщения, отвечает требованиям технического
задания. Разработана принципиальная электрическая схема и написана программа на
языке ассемблера.
Главным модулем устройства является GSM модуль который принимает
SMS сообщение, а также
отправляет отчет о работе
Были получены практические знания, связанные с работой
процессорной техники, для выполнения устройством заданного алгоритма работы
использовали программу, которая написана на языке assembler для процессора серии MCS - 51.
Библиографический
список
1.
Бродин В.Б., Калинин А.В. Системы на микроконтроллерах и БИС программируемой
логики. - М.: ЭКОМ, 2002. - 412 c.