Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Применение однокристальной микро ЭВМ семейства МК51 для реализации алгоритма работы электронных часов

Работа добавлена на сайт samzan.net: 2015-07-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 18.5.2024

Пояснительная записка к курсовой работе

по дисциплине:
«Микропроцессорные системы»

тема_курсовой_работы:

«Применение однокристальной микроЭВМ
семейства МК51 для реализации
алгоритма работы электронных часов»

[ Выполнили: ]
студенты группы С-85
Ким В.
Пиленко Ю.
Седрединов А.
Шапцов В.

[ Проверил: ]
преподаватель кафедры
Гудков
Юрий Игоревич


Оглавление:

[1] Техническое задание

[2] Выполнение

[2.1] Логика построения программы

[2.2] Устройства ввода

[2.3] Исходный текст программы с комментариями

[3] Список использованных источников




Техническое задание

Разработать программу для микроконтроллера на базе МП Intel 8051, реализующую функциональность электронных часов и имеющую следующие особенности:

  •  поддержка двух режимов работы программы: а) режим счёта; б) режим установки времени;
  •  в режиме счёта на дисплей терминала выводится текущее время в формате hh:mm:ss, где , , ;
  •  в режиме установки времени выполняется последовательный ввод значений двузначных регистров, начиная с ss, причём в каждом регистре сначала задаётся значение десятков, а затем единиц. На этапе ввода значений регистров должна производиться проверка корректности задаваемых чисел и, в случае их выхода за пределы допустимого для регистра диапазона значений, — коррекция до верных значений.

Ввод необходимо осуществлять с помощью стандартной шестнадцатикнопочной терминальной клавиатуры.

Переход в режим установки времени необходимо осуществлять нажатием клавиши ’9’. Выход из режима установки времени должен происходить автоматически по окончании ввода значений всех регистров, т.е. сразу после задания числа единиц регистра hh.



Выполнение

  1.  Логика построения программы

Исходя из ТЗ сформируем следующую блок-схему работы основной программы:

  1.  Устройства ввода

Для ввода данных используется стандартная шестнадцатикнопочная клавиатура, подключаемая к параллельному порту (P1). Она имеет следующий вид:

Чтобы определить, нажата или нет какая-либо клавиша-ключ, сначала нужно выставить на линии регистра-защёлки P1, которые соединяет клавиша, разные логические значения. Затем необходимо считать из регистра значения этих линий: если оба бита стали равными «0», то значит, проверяемая клавиша была нажата.

Для сокращения процедуры опроса клавиатуры будем делать опрос по «строкам»:

Клавиша

Слово, выставленное на P1

Ожидаемое на P1 слово

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

‘1’

1

1

0

1

1

1

1

1

1

1

0

1

1

1

0

1

‘2’

1

1

0

1

1

1

1

1

1

1

0

1

1

1

1

0

‘3’

1

1

0

1

1

1

1

1

1

1

0

1

0

1

1

1

‘4’

1

1

1

0

1

1

1

1

1

1

1

0

1

1

0

1

‘5’

1

1

1

0

1

1

1

1

1

1

1

0

1

1

1

0

‘6’

1

1

1

0

1

1

1

1

1

1

1

0

0

1

1

1

‘7’

0

1

1

1

1

1

1

1

0

1

1

1

1

1

0

1

‘8’

0

1

1

1

1

1

1

1

0

1

1

1

1

1

1

0

‘9’

0

1

1

1

1

1

1

1

0

1

1

1

0

1

1

1

‘0’

1

0

1

1

1

1

1

1

1

0

1

1

1

1

0

1

Чтобы просто зафиксировать факт нажатия любой из цифровых клавиш, достаточно выставить в регистр P1 слово #00001111b и ожидать на P1 значение #0000x1xxb, где x{0;1}.

Особенностью данной клавиатуры, которую надо учитывать при программировании, является наличие переходного процесса (дребезга) с длительностью  в несколько раз большей, чем время машинного цикла ОМЭВМ МК8051:

 


  1.  Исходный текст программы с комментариями
  2.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3.  ;; Лабораторная работа по курсу "Микропроцессорные системы".
  4.  ;; (С) Ким В., Пиленко Ю., Седрединов А., Шапцов В.
  5.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6.  
  7.    ;;;; ОПИСАНИЕ ПЕРЕМЕННЫХ: ;;;;
  8.  
  9.    ;R0 - итерация для режима установки времени; для удобства
  10.    ;R1 - адрес для косвенно-регистровой адресации, указывающий на регистры R2-R4
  11.    
  12.    ;регистры R2 - секунды (ss) in [0..3Bh]
  13.    ;регистры R3 - минуты (mm) in [0..3Bh]
  14.    ;регистры R4 - часы (hh) in [0..17h]
  15.  
  16.    ;регистры R5,R6 - для разных промежуточных значений
  17.    ;регистр R7 - буфер для хранения значения нажатой клавиши [#0..#9] или
  18.    ;             значения #FFh, если клавиша не нажата
  19.  
  20.    CR  equ 0Dh; "возврат каретки"
  21.    LF  equ 0Ah; "перевод строки"
  22.    ESC equ 1Bh; "конец сообщения"
  23.    TimerRepeat equ 30h; число полных циклов таймера, через которое нужно
  24.                       ; обрабатывать прерывание по переполнению
  25.  
  26.    fMode equ 20h.0; текущий режим:
  27.                   ; "0" - режим счёта
  28.                   ; "1" - режим установки времени
  29.  
  30.  ; *****************************************************************************
  31.  ; *****************************************************************************
  32.  ; ОПИСАНИЕ ТОЧЕК ВХОДА ОСНОВНОЙ ПРОГРАММЫ и ПОДПРОГРАММ ПРЕРЫВАНИЙ
  33.  ; !Внимание! В i8051 точки прерываний предопределены (фиксированы)
  34.  ;   для того или иного прерывания! Т.е. не могут назначаться произвольно!
  35.  
  36.    ORG 8000h; - точка входа в основную программу
  37.      jmp lbMain
  38.  
  39.    ORG 800Bh; - прерывание по переполнению таймера (по биту TF0)
  40.      jmp intTF0
  41.  
  42.    ;;Далее по каждому биту назначаем одно прерывание и по фронту, и по срезу:
  43.      ORG 8033h; - прерывание по биту P1.0 (по любому фронту)
  44.        jmp intP1
  45.  
  46.      ORG 803Bh; - прерывание по биту P1.1 (по любому фронту)
  47.        jmp intP1
  48.  
  49.      ORG 804Bh; - прерывание по биту P1.3 (по любому фронту)
  50.        jmp intP1
  51.  
  52.  
  53.  ; *****************************************************************************
  54.  ; *****************************************************************************
  55.  ; ОСНОВНАЯ ПРОГРАММА
  56.  
  57.    lbMain:
  58.      ; конфигурируем таймер T0:
  59.        anl TMOD, #0F0h; обнуляем младшую тетраду
  60.        orl TMOD, #01h; младшую тетраду приводим к виду "0001"
  61.        ;mov TMOD, #00100001b; - то же самое
  62.        clr TR0; остановка таймера T0 (таймер - не считает)
  63.  
  64.      ; настраиваем систему прерываний:
  65.        mov IP, #00000010b; (IP0) все прерывания (пока) - с одинаковым низким уровнем
  66.                          ; приоритета
  67.        mov 0F8h, #00000000b; (IP1)
  68.        mov IE, #10000010b; IEN0: выставили биты EA(7),ES(4),ET0(1)
  69.        mov 0E8h, #00001011b; IEN1: выставили биты 0,1,3
  70.        mov P1, #00001111b
  71.        mov 0EBh,#11111111b; (CTCON) разрешаем прерывания по битам P1 по фронту и срезу
  72.                           ; CTCON - см. стр. 22 в "publab2.pdf"
  73.      ;задаём начальное время:
  74.        mov R2, #55; секунды
  75.        mov R3, #59; минуты
  76.        mov R4, #11; часы
  77.  
  78.      clr fMode; изначально - в режим счёта
  79.  
  80.      ;I. РЕЖИМ СЧЁТА:
  81.        lbCountMode:
  82.          clr IE.7
  83.  
  84.          mov DPTR, #msgShowTimeMode
  85.          call prShowMessage; вывод сообщения msgShowTimeMode
  86.  
  87.          ; настраиваем таймер T0:
  88.            mov TH0, #0
  89.            mov TL0, #0
  90.            mov TimerRepeat, #13
  91.  
  92.          mov P1, #00001111b
  93.          setb IE.7
  94.  
  95.          setb TR0; запускаем таймер (таймер - считает). Пошло инкрементирование T0
  96.  
  97.          lbCountMode_Loop:
  98.            ; проверяем бит режима, и выполняем соответствующий переход:
  99.              jb fMode, lbSetTimeMode
  100.            jmp lbCountMode_Loop
  101.  
  102.      ;II. РЕЖИМ УСТАНОВКИ ВРЕМЕНИ:
  103.        lbSetTimeMode:
  104.          clr IE.7
  105.          clr TR0; остановка таймера T0 (таймер - не считает)
  106.  
  107.          mov DPTR, #msgSetTimeMode
  108.          call prShowMessage; вывод сообщения msgSetTimeMode
  109.  
  110.          mov R0, #04h; задаём начальное значение; всего будет семь итераций
  111.  
  112.          mov P1, #00001111b
  113.          setb IE.7
  114.  
  115.          lbSetTimeMode_Loop:
  116.            ;проверяем бит режима, и выполняем соответствующий переход:
  117.              jnb fMode, lbCountMode
  118.            jmp lbSetTimeMode_Loop
  119.  
  120.  ; *****************************************************************************
  121.  ; *****************************************************************************
  122.  ; ПОДПРОГРАММЫ_ОСНОВНЫЕ
  123.  
  124.  ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  125.  ;; процедура intTF0:
  126.  
  127.    intTF0:
  128.      clr TF0; сбрасываем бит переполнения ВРУЧНУЮ!
  129.      djnz TimerRepeat, lbTF0_End;
  130.  
  131.      ; реализация собственно "хода" часов:
  132.        inc R2
  133.        cjne R2, #60, lbTF0_Next1
  134.          mov R2, #0
  135.          inc R3
  136.          cjne R3, #60, lbTF0_Next1
  137.            mov R3, #0
  138.            inc R4
  139.            cjne R4, #24, lbTF0_Next1
  140.              mov R4, #0
  141.  
  142.      lbTF0_Next1: mov TimerRepeat, #13
  143.      lbTF0_End:   call prDisplay
  144.    reti
  145.  
  146.  ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  147.  ;; процедура prDisplay:
  148.  
  149.      lbDrawSeparator:
  150.        call prWaitFor_TI
  151.        mov SBUF, #3Ah
  152.  
  153.      ;; переводим значение из A в кодировку ACSII и выводим на экран:
  154.      lbDrawElement:
  155.        mov B, #10
  156.        div AB
  157.        add A, #30h
  158.          call prWaitFor_TI
  159.          mov SBUF, A
  160.        mov A, B
  161.        add A, #30h
  162.          call prWaitFor_TI
  163.          mov SBUF, A
  164.      ret
  165.  
  166.    prDisplay:
  167.      ;[начало вывода 9 символов]
  168.  
  169.      call prWaitFor_TI
  170.      mov SBUF, #CR; переводим курсор в начало строки:
  171.  
  172.      mov A, R4
  173.      call lbDrawElement
  174.  
  175.      mov A, R3
  176.      call lbDrawSeparator
  177.  
  178.      mov A, R2
  179.      call lbDrawSeparator
  180.  
  181.      call prWaitFor_TI; для выравнивания подождём передачи последнего символа
  182.      setb TI; иначе - программа "зависнет"
  183.   
  184.      ;[конец вывода 9 символов]
  185.    ret
  186.  
  187.  ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  188.  ;; обработчик прерывания intP1:
  189.  ;;   проверяет, нажата ли клавиша входа в режим установки времени.
  190.  ;;   Такой клавишей явл. '0' на маленькой клавиатуре
  191.  
  192.    intP1:
  193.      ; Запрещаем прерывания на время выполнения:
  194.        clr 0C8h.0
  195.        clr 0C8h.1
  196.        clr 0C8h.2
  197.        clr 0C8h.3
  198.  
  199.      jnb fMode, lbP1_CountMode
  200.      ;;I. ПРЕРЫВАНИЕ ИЗ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ:
  201.        call prSmartDelay
  202.        call prCheckNumKeys
  203.  
  204.        cjne R7, #0FFh, lbP1_CountMode_KeyPressed
  205.          jmp lbP1_SetTimeMode_Finalize
  206.  
  207.        lbP1_CountMode_KeyPressed:
  208.          call prSetTimeMode_Iteration
  209.  
  210.        lbP1_SetTimeMode_Finalize:
  211.          jmp lbP1_End
  212.  
  213.      ;;II. ПРЕРЫВАНИЕ ИЗ РЕЖИМА СЧЁТА:
  214.        lbP1_CountMode:
  215.          call prSmartDelay
  216.          call prCheckNumKeys
  217.          cjne R7, #9, lbP1_End
  218.            setb fMode
  219.  
  220.      lbP1_End:
  221.        call prSmartDelay
  222.        mov P1, #00001111b
  223.    reti
  224.  
  225.  
  226.    prSetTimeMode_Iteration:
  227.          mov A, R0
  228.          mov B, #2
  229.          div AB; в А - целая часть, в В - остаток
  230.          mov R1, A
  231.          mov A, B
  232.  
  233.          cjne A, #0, lbSetTimeMode_Iteration_LO
  234.          ;;Загружаем десятки в регистр:
  235.            mov A, R7
  236.            mov B, #10
  237.            mul AB
  238.            mov @R1, A
  239.            jmp lbSetTimeMode_Iteration_Finalize
  240.  
  241.          lbSetTimeMode_Iteration_LO: ;;Загружаем единицы в этот же регистр:
  242.            mov A, @R1
  243.            add A, R7
  244.            mov @R1, A
  245.            
  246.            call prCorrect_SS; корректируем секунды (R2)
  247.            call prCorrect_MM; корректируем минуты (R3)
  248.            call prCorrect_HH; корректируем часы (R4)
  249.  
  250.          lbSetTimeMode_Iteration_Finalize:
  251.            
  252.            call prDisplay; выводим вводимое время на экран
  253.  
  254.            inc R0; увеличили указатель на регистры
  255.            cjne R0, #10, lbSetTimeMode_Iteration_End
  256.              clr fMode; - устанавливаем режим счёта
  257.  
  258.    lbSetTimeMode_Iteration_End: ret
  259.  
  260.  ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  261.  ;; процедура prShowMessage:
  262.  ;;   выводит на экран текстовое сообщение; символ ESC - признак конца сообщения
  263.  
  264.    prShowMessage:
  265.      clr A
  266.      movc A, @A + DPTR
  267.  
  268.      lbNextSymbol:
  269.        call prWaitFor_TI
  270.        mov SBUF, A
  271.        inc DPTR
  272.        clr A
  273.        movc A, @A + DPTR
  274.        cjne A, #ESC, lbNextSymbol
  275.          ret
  276.  
  277.  ; *****************************************************************************
  278.  ; *****************************************************************************
  279.  ; ПОДПРОГРАММЫ_ВСПОМОГАТЕЛЬНЫЕ
  280.  
  281.  ; ///////////////////////////////////////////////////////////////////////////
  282.  ;; процедуры prCorrect_SS, prCorrect_MM, prCorrect_HH:
  283.  ;;   проверяют соответствующие регистры на корректность значений в них;
  284.  ;;   большие значения уменьшаются до ближайших верных
  285.  
  286.    prCorrect_SS:
  287.      cjne R2, #59, lbR2_not_59
  288.        ret
  289.      lbR2_not_59:
  290.        jnc lbR2_more_59
  291.          ret
  292.      lbR2_more_59:
  293.        mov R2, #59
  294.        ret
  295.  
  296.    prCorrect_MM:
  297.      cjne R3, #59, lbR3_not_59
  298.        ret
  299.      lbR3_not_59:
  300.        jnc lbR3_more_59
  301.          ret
  302.      lbR3_more_59:
  303.        mov R3, #59
  304.        ret
  305.  
  306.    prCorrect_HH:
  307.      cjne R4, #23, lbR4_not_23
  308.        ret
  309.      lbR4_not_23:
  310.        jnc lbR4_more_23
  311.          ret
  312.      lbR4_more_23:
  313.        mov R4, #23
  314.        ret
  315.  
  316.  ; ///////////////////////////////////////////////////////////////////////////
  317.  ;; процедура prSmartDelay:
  318.  ;;   небольшая задержка, за время которой на клавиатуре успевает
  319.  ;;   завершиться "переходной процесс"
  320.  
  321.    prSmartDelay:
  322.      mov B, #0
  323.      mov A, #0
  324.      lbSmartDelay_Loop:
  325.        djnz ACC, $
  326.        djnz B, lbSmartDelay_Loop
  327.    ret
  328.  
  329.  ; ///////////////////////////////////////////////////////////////////////////
  330.  ;; процедура prWaitFor_TI:
  331.  ;;   ожидание "готовности передачи" по последовательному порту
  332.  
  333.    prWaitFor_TI:
  334.      jnb TI, $; зациклить, пока TI=0
  335.      clr TI   ; устанавливаем "неготовность передачи"
  336.      ret
  337.  
  338.  ; ///////////////////////////////////////////////////////////////////////////
  339.  ;; процедура prCheckNumKeys:
  340.  ;;   опрос цифровых клавиш.
  341.  ;;   Процедура помещает в регистр R7 номер нажатой клавиши '0'..'9' или
  342.  ;;   #0ffh, если ничего не нажато
  343.  
  344.      prCheckNumKeys:
  345.  
  346.        mov R7, #0FFh; допустим, что ничего не будет нажато
  347.  
  348.        ;опрос первого столбца клавиш:
  349.        lbKey_1:
  350.          mov P1, #00DFh
  351.          mov A, P1
  352.  
  353.          cjne A, #00DDh, lbKey_2
  354.            mov R7, #1
  355.            ret
  356.  
  357.        lbKey_2:
  358.          cjne A, #00DEh, lbKey_3
  359.            mov R7, #2
  360.            ret
  361.  
  362.        lbKey_3:
  363.          cjne A, #00D7h, lbKey_4
  364.            mov R7, #3
  365.            ret
  366.  
  367.        ;опрос второго столбца клавиш:
  368.        lbKey_4:
  369.          mov P1, #00EFh
  370.          mov A, P1
  371.   
  372.          cjne A, #00EDh, lbKey_5
  373.            mov R7, #4
  374.            ret
  375.  
  376.        lbKey_5:
  377.          cjne A, #00EEh, lbKey_6
  378.            mov R7, #5
  379.            ret
  380.  
  381.        lbKey_6:
  382.          cjne A, #00E7h, lbKey_7
  383.            mov R7, #6
  384.            ret
  385.  
  386.        ;опрос третьего столбца клавиш:
  387.        lbKey_7:
  388.          mov P1, #007Fh
  389.          mov A, P1
  390.  
  391.          cjne A, #007Dh, lbKey_8
  392.            mov R7, #7
  393.            ret
  394.  
  395.        lbKey_8:
  396.          cjne A, #007Eh, lbKey_9
  397.            mov R7, #8
  398.            ret
  399.  
  400.        lbKey_9:
  401.          cjne A, #0077h, lbKey_0
  402.            mov R7, #9
  403.            ret
  404.  
  405.        ;опрос четвёртого столбца клавиш:
  406.        lbKey_0:
  407.          mov P1, #00BFh
  408.          mov A, P1
  409.  
  410.          cjne A, #00BDh, lbEnd_Exam_NumKeys
  411.            mov R7, #0
  412.            lbEnd_Exam_NumKeys:  ret
  413.  
  414.  ; *****************************************************************************
  415.  ; *****************************************************************************
  416.  ; ОПИСАНИЕ ТЕКСТОВЫХ СООБЩЕНИЙ:
  417.  
  418.    msgSetTimeMode:  db LF,LF,CR, '-= Time Set Mode: =-', CR, LF, ESC
  419.    msgShowTimeMode: db LF,LF,CR, '-= Current Time: =-', CR, LF, ESC
  420.  
  421.  END;;;; КОНЕЦ ПРОГРАММЫ



Список использованных источников

  1.  Курс лекций по дисциплине «Микропроцессорные системы».
  2.  [ http://donntu.edu.ua/library_web/resurs/mikro ] Однокристалльные МикроЭВМ. Справочник. Под ред. Боборыкина, Липовецкого и др.
  3.  Ю.Н. Евланов, В.А. Новиков, А.А. Шатохин. ОДНОКРИСТАЛЬНЫЙ МИКРОКОНТРОЛЛЕР 80C552. Методическое пособие по курсу «Схемотехника и программное обеспечение электронных средств измерений» для студентов, обучающихся по направлению «Информатика и вычислительная техника». М.: Издательство МЭИ, 2001.
  4.  Микроконтроллеры семейства MCS51 и др. материалы и пособия кафедры.







курсовая_работа  |  
1 







курсовая_работа  |  
1 







курсовая_работа  |  
1 







курсовая_работа  |  
1 




1. 26 ГПК рассматривают и разрешают не только дела возникающие из административных правоотношений но и дела
2. Вперед Котенок ПЕРВОЕ ДЕЙСТВИЕ Грохот Кастрюли
3. Тема 6 Социологический анализ девиантного поведения в обществе
4. Причины поломок съемных пластиночных протезов и возникновения аллергических реакций
5. Альтернативные виды топлива
6. Расчет 9-ти этажного 18-ти квартирного жилого дома с подземным гаражом
7. РОСГИПРОЛЕС ОАО РОСГИПРОЛЕС УДК 502
8. Тема 1 Теоретичні аспекти фін інжинірингу
9. тема НАССР 5
10. Основы теории управления
11. тематики в 1 классе.
12. Ну вот я снова здесь Моя замечательная волшебная страна
13. столкновение и взаимодействие различных характеров в их развитии
14. это свод моральных норм которому следует отдельный человек или коллектив людей
15. ТЕМА- Позиціонування елементів
16. Тема урока- Единицы времени
17. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата технічних наук КИЇВ 1999 Дисертацією є
18. метрология образовано из двух греческих слов-
19. тематичному відношенні являють собою сукупність декількох відособлених відділів рослин ~ імовірно самості
20. Основные теоретические сведения