Разработка микропроцессорной системы АОНа на базе микроконтроллера
хема принципиальная электрическая АОН разработанная в Accel EDA представлена на рис. 2.Номера записанные в память телефона для быстрого набора никак не связаны с номерами хранящимися в списке АОН и манипуляции с одними не отражаются на других. Рис. 2 - Принципиальная схема АОНа в Accel EDAПринципиальная схема АОНа приведена в Приложении Б. Спецификация элементов приведена в Приложении В.ЗАКЛЮЧЕНИЕВ данном курсовом проекте разработано устройство - Автоматический Определитель Номера. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассемблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера. Существенно сократились размеры устройства, относительно аналогичных, собранных на базе п/п элементов и соответственно сократилось энергопотребление.СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ1. Техническая документация на микроконтроллеры Z86E0812PSC компании Microchip Technology Incorporated ООО«Микро-Чип», Москва, 2002.-184 с. 2. Проектирование цифровых устройств на однокристальных микроконтроллерах / В.В. Сташин [ и др.]. - М.: Энергоатомиздат, 1990. - 224 с.3. Евстифеев А.В. Микроконтроллеры Microchip: практическое руководство/А.В.Евстифеев. - М.: Горячая линия - Телеком, 2002. - 296 с.4. Ульрих В.А. Микроконтроллеры PIC16х\17хx / В.А. Ульрих. Изд. 2-е, перераб. и доп. - СПб.: Наука и техника, 2002. - 320 с.5. Александр Елисеев (E-mail: ea@eunet.lt) ПРИЛОЖЕНИЕ АЛистинг программы и объектный файлTITLE Программа АОН "Panaphone" Z8REGDEFS; Назначение символических имен TIM_BL_H = 10H; Таймер звонка TIM_BL_L = 11H; Таймер звонка N_RECORD = 12H; Номер записи в списке BLC_CLOCK = 13H; Счетчик блокировки по нажатию клавиши CLOCK CNT_SET = 14H; Счетчик нажатия SET CNT_CLOCK = 15H; Счетчик нажатия CLOCK CNT_TWIX = 16H; Счетчик нажатия обоих клавиш F_KEYS = 17H; XXXXXXXX Флаги клавиш CONST_KEY = 10; Константа минимального количества тактов между нажатиями CONST_BELL = 1000; Константа звонка TET1 = 18H; 1-я ячейка тетрады TET2 = 19H; 2-я ячейка тетрады TET3 = 1AH; 3-я ячейка тетрады TET4 = 1BH; 4-я ячейка тетрады TET1_ = R8; 1-я ячейка тетрады TET2_ = R9; 2-я ячейка тетрады TET3_ = R10; 3-я ячейка тетрады TET4_ = R11; 4-я ячейка тетрады CNT_ONL = 18H; Счетчик низкой линии PRE_N = 1CH; Предыдущая цифра CNT_REP = 1DH; Счетчик повторов цифры COND = 1EH; Состояние линии MASK1 = 1FH; Маска первой цифры номера BUF_NUM = 20H; Начало буфера номера BEG_ST = 40H; Начало стека BEG_COD = 40H; Начало области записи принятого кода BEG_LST = 59H; Начало списка END_LST = 7CH; Конец списка BFLAG = 7FH; XXXXXXXX ; ¦¦¦¦¦¦¦¦ ; ¦¦¦¦¦¦¦+------ ; ¦¦¦¦¦¦+------- ; ¦¦¦¦¦+-------- Флаг неопределившегося номера ; ¦¦¦¦+--------- флаг блокировки звонка ; ¦¦¦+---------- флаг индикации категории ; ¦¦+----------- Флаг активности своего телефона ; ¦+------------ Флаг 1-й цифры ; +------------- Флаг звонка TESTB = 7EH; Тест-байт целостности информации CNT_B = 7DH; Счетчик длительности сигнала звонка ;+------------------------------------------------------------------+ ;¦ Начало программного блока ¦ ;+------------------------------------------------------------------+ CODE GLOBAL ABS ORG 0 Область хранения векторов прерываний WORD INT_P3_2L;P3.2 F-edge WORD INT_P3_3L;P3.3 F-edge WORD INT_P3_1L;P3.1 F-edge WORD INT_P3_2H;P3.2 R-edge WORD INT_T0;T0 WORD Sample;T1 ; После сброса: Счетчики запрещены ; Прерывания запрещены ; Приоритеты не определены ; Указатель стека не определён ; Регистровый указатель = 0 ; Порт 2 открытый сток,все входы ; Порт 3 цифровой ; Порт 0 вход INT_P3_2L: INT_P3_3L: INT_P3_1L: INT_P3_2H: START: ; LD RP,#0FH; Активизация управления по P2.7 ; LD 0BH,#00010100B; для эмулятора LD RP,#00 LD P01M,#00000100B; Порт P0 - выход LD P3M,#00000011B; P2 - Pull-Ups Activ ; P3 - Analog LD P2, #11111111B; Вывод в порт 2 ; ¦¦¦¦¦¦¦¦ ; ¦¦¦¦¦¦¦+------ Вход клавиши SET ; ¦¦¦¦¦¦+------- Вход клавиши CLOCK ; ¦¦¦¦¦+-------- - ; ¦¦¦¦+--------- - ; ¦¦¦+---------- Датчик активности телефона ; ¦¦+----------- Управление ключом ; ¦+------------ Датчик линии ; +------------- Вход прерываний ; LD P2M,#11001111B; Определение направления выводов порта P2 LD P0,#00000111B; LD PRE0,#11001001B; Коэффицент деления 50 LD TMR,#00001011B; Разрешение обоих таймеров T0 с загрузкой LD T0,#150; Переполнение таймера каждые 5 мс LD IMR,#10010000B; Разрешение T0 и запрещение T1 BEGIN: LD SPL,#BEG_ST EI CP TESTB,#55H; Проверка целостности информации JR Z,NOT_CLEAR_RAM; LD R4,#5 CLEAR_RAM:; Очистка ОЗУ контроллера LD @R4,#0 INC R4 CP R4,#127 JR C,CLEAR_RAM LD TESTB,#55H LD MASK1,#2; Выставить маску первой цифры номера LD CNT_B,#0 NOT_CLEAR_RAM: AND BFLAG,#00000111B; Сброс флага звонка,определения ; пульсового набора,набранной цыфры и ; очистки буфера CALL GO_HALT ; ;------------------------------------------------------------------------ ; Основной блок ;------------------------------------------------------------------------ MAIN: TCM P2,#00000011B JP NZ,M1 M2_2: TM P2,#01000000B JR Z,M2 TM P3,#00000100B JR NZ,M2 LD P2M,#11001111B NOP STOP M2: LD R4,#10 LD CNT_ONL,#0 M2_0: CALL GO_HALT INC CNT_ONL; Счетчик низкой линии TM P2,#01000000B JR Z,M2_1 LD CNT_ONL,#0 M2_1: DJNZ R4,M2_0 CP CNT_ONL,#8 JR UGE,M3; Переход если трубку сняли TM BFLAG,#10000000B JR NZ,M2 JR M2_2 M3: AND BFLAG,#10110011B TM BFLAG,#10000000B JR Z,M4 AND P0,#11111110B; Захват LCD PUSH IMR CALL ID_NUM OR P2,#00100000B POP IMR LD R7,#BUF_NUM; Вывод номера на LCD LD R6,#0 LD R8,#8 CALL SEND_BYTE CALL SEND_BYTE M3_1: LD R6,@R7 CALL SEND_BYTE INC R7 DJNZ R8,M3_1 TM BFLAG,#00000100B; Не сохранять номер если он не определился JR NZ,M4 LD R7,#END_LST; Сдвиг списка на одну запись LD R8,#END_LST-4 M3_2: LD R4,@R8 LD @R7,R4 DEC R7 DEC R8 CP R8,#BEG_LST JR UGE,M3_2 LD R7,#BEG_LST; Упаковка номера в список LD R8,#BUF_NUM LD R9,#4 M3_3: LD R4,@R8 SWAP R4 AND R4,#0F0H INC R8 AND @R8,#0FH OR R4,@R8 LD @R7,R4 INC R8 INC R7 DJNZ R9,M3_3 OR P0,#00000001B; Снять захват LCD M4: AND BFLAG,#00110011B LD BLC_CLOCK,#0 TM P2,#00000100B JR NZ,M4_1 AND P0,#11111110B; Захват LCD M4_1: CALL GO_HALT TM P2,#01000000B; Проверка тока в линии JR Z,M5; Переход если нет импульса в линии LD R9,#0; Счетчик цыфры MN4_1: LD R4,#20; Счетчик импульса MN4_2: CALL GO_HALT TM P2,#01000000B; Проверка тока в линии JR Z,MN4_3; Переход если прервался импульс DJNZ R4,MN4_2 ; Выход если импульс слишком длинный OR P0,#00000001B; Снять захват LCD LD P2M,#11001111B NOP STOP MN4_3: LD R4,#12; Счетчик паузы INC R9 MN4_4: CALL GO_HALT TM P2,#01000000B; Проверка тока в линии JR NZ,MN4_1; Переход если прервалась пауза DJNZ R4,MN4_4 TM P2,#00000100B JR NZ,M5 MN4_6: TM BFLAG,#01000000B; Проверить флаг первой цифры JR NZ,MN4_7 LD R6,#00 LD R8,#10 MN4_8:CALL SEND_BYTE DJNZ R8,MN4_8 OR BFLAG,#01000000B; Выставить флаг первой цифры MN4_7: LD R6,R9 CALL SEND_BYTE M5: TM F_KEYS,#00001000B; Проверка клавиши SET JR Z,M4_1 AND F_KEYS,#11110111B; CALL LIST JR M4 M1: TM F_KEYS,#00010000B; Проверка клавиши CLOCK JR Z,M1_1 AND F_KEYS,#11101111B; Сброс флага клавиши CLOCK CP BLC_CLOCK,#00; Пуст ли счетчик нажатий клавиши CLOCK JR NZ,M1_0 LD BLC_CLOCK,#2 JR M1_1 M1_0: DEC BLC_CLOCK M1_1: TM F_KEYS,#00001000B; Проверка клавиши SET JP Z,MAIN ; ; Режим просмотра списка ; AND F_KEYS,#11110111B CALL LIST JP MAIN ;+----------------------------------------------------------------------+ ;¦ Режим просмотра списка ¦ ;+----------------------------------------------------------------------+ LIST: AND F_KEYS,#11110111B CP BLC_CLOCK,#00 JP Z,LIST1 RET LIST1: AND P0,#11111110B; Захват LCD LD R4,#10 LIST2: CALL GO_HALT DJNZ R4,LIST2 LIST3: LD N_RECORD,#1 LIST4: LD R6,N_RECORD CALL SEND_BYTE; Вывод на LCD номера записи LD R6,#0FH; '-' CALL SEND_BYTE LD R7,N_RECORD; Вычисление адреса записи DEC R7 RL R7; Умножить на 4 (длину записи) RL R7 ADD R7,#BEG_LST; Получить адрес начала записи LD R8,#2 ; ; Вывод номера ; LIST5: LD R6,@R7; Вывод 8-и байтов номера SWAP R6 AND R6,#0FH; TM BFLAG,#00010000B; Проверить флаг индикации категории JP NZ,LIST6 LD R6,#0; Не показывать категорию если не выставлен LIST6:; флаг CALL SEND_BYTE LD R6,@R7; Вывод первой цифры номера AND R6,#0FH CP R6,MASK1 JP NZ,LIST7 LD R6,#0 LIST7: CALL SEND_BYTE INC R7; Вывод второй цифры номера LD R6,@R7 SWAP R6 CALL SEND_BYTE SWAP R6; Вывод третьей цифры номера CALL SEND_BYTE LIST8: INC R7; Вывод остальных цифр номера LD R6,@R7 SWAP R6 CALL SEND_BYTE SWAP R6 CALL SEND_BYTE DJNZ R8,LIST8 LIST9: TM F_KEYS,#00100000B; Проверка одновременного нажатия CLOCK,SET JR Z,LIST10 AND F_KEYS,#11000111B; JR LIST12 LIST10: TM F_KEYS,#00010000B; Проверка клавиши CLOCK JR Z,LIST11 AND F_KEYS,#11101111B; INC N_RECORD CP N_RECORD,#9 JR UGT,LIST3 JR LIST4 LIST11: TM F_KEYS,#00001000B; Проверка клавиши SET JP Z,LIST23 AND F_KEYS,#11110111B; OR P0,#00000001B CALL GO_HALT CALL SEND_BYTE RET ; ; Режим установок ; LIST12: ; Установка флага показа категории LD R6,#0CH CALL SEND_BYTE TM BFLAG,#00010000B; Проверить флаг индикации категории LD R6,#0AH JP Z,LIST13; Показать флаг индикации категории LD R6,#01H LIST13: CALL SEND_BYTE LD R6,#0DH CALL SEND_BYTE LD R6,#0 CALL SEND_BYTE CALL SEND_BYTE LD R6,MASK1 CALL SEND_BYTE LD R6,#0 CALL SEND_BYTE CALL SEND_BYTE CALL SEND_BYTE CALL SEND_BYTE LIST14: TM F_KEYS,#00001000B; Проверка клавиши SET JR Z,LIST15 AND F_KEYS,#11110111B; JP LIST17 LIST15: TM F_KEYS,#00010000B; Проверка клавиши CLOCK JR Z,LIST16 AND F_KEYS,#11101111B; XOR BFLAG,#00010000B; JP LIST12 LIST16: CALL GO_HALT JP NZ,BEGIN JR LIST14 LIST17:; Установка маски первой цифры LD R6,#00H CALL SEND_BYTE TM BFLAG,#00010000B; Проверить флаг индикации категории LD R6,#0AH JP Z,LIST18; Показать флаг индикации категории LD R6,#01H LIST18: CALL SEND_BYTE
Страницы: 1, 2, 3
|
|