Счетчик на основе микропроцессора

Микропроцессор i8951 для выполнения функций счетчика обратного счета, с использованием прерывания от последовательного порта и таймера. Функции ввода с последовательного порта, с клавиатуры – Пуск, Стоп, Пауза, вывод – счет на вычитание в hex-кодах.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.08.2009
Размер файла 21,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

1

27

КАФЕДРА ЭВА

Счетчик на основе микропроцессора

Курсовая работа

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

Москва 2009

Аннотация

В работе запрограммирован микропроцессор i8951 на выполнение функций счетчика обратного счета. Использованы прерывания от последовательного порта и таймера.

Оглавление

  • Аннотация 2
  • Оглавление 3
  • 1. Техническое задание 4
  • 2. Анализ технического задания 5
  • 3. Программа (Основная) 6
  • 4. Программа (Прерывания) 14
  • 5. Выводы 16
  • 6. Литература 17

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

Написать программу для микропроцессора семейства 51, обладающую функциями:

1. Ввод с последовательного порта - число

2. Ввод с клавиатуры - Пуск, Стоп, Пауза

3. Вывод - счет на вычитание в hex-кодах

2. Анализ технического задания

В соответствии с техническим заданием, устройство должно по-разному реагировать на входные сигналы в зависимости от того, в каком состоянии находится. Поэтому выделим один регистр ОЗУ для хранения текущего состояния:

· #01h - счет

· #02h - ввод значения

· #03h - пауза

Основная программа инициализирует ОЗУ, после чего ожидает флаг F0 в режиме пониженного токопотребления, из которого выходит при прерываниях.

Когда флаг F0 установлен, основная программа выполняет определенную процедуру в зависимости от содержимого определенного регистра (текущего события). Предусмотрены текущие события:

· #00h - ввод символа из параллельного порта

· #01h - старт

· #02h - стоп

· #03h - пауза

· #04h - счет на уменьшение

Предусмотренны прерывания последовательного порта (синхронизируется таймером 1) и таймера 0, который переодически опрашивает клавиатуру, подключенную к порту 1. При каждом прерывании таймера 0 в режиме счета также происходит уменьшение на 1 определенного регистра и когда он становится равным 0, устанавливается F0 и регистру текущего события присваевается значение «счет на уменьшение».

3. Программа (Основная)

CR EQU 0dh ; carriage return

LF EQU 0ah ; line feed

ACK EQU 6h ; responses to remote system

NAK EQU 15h ;

CAN EQU 18h ;

BAUD_1200 EQU 0e8h ; 1200 baud

BAUD_9600 EQU 0fdh ; 9600 baud timer reload value

ASC_0 EQU 30h ;ASCII for char 0

ASC_a EQU 61h ;ASCII for char a

CountTacts EQU 10h ;Quantity of timer 0 tacts in count tact

CButton EQU 30h ;addr of Current Button state(0=pc,1=start,2=input,3=pause,4=count)

DeviceState EQU 31h ;addr of Current device state (1=count,2=input,3=pause)

MR0 EQU 32h ;addr of my register 0

MR1 EQU 33h ;addr of my register 1

Cnt_tact EQU 34H ;addr of counter, tact char

Cnt0 EQU 35H ;addr of counter, 0 char

Cnt1 EQU 36H ;addr of counter, 1 char

Cnt2 EQU 37H ;addr of counter, 2 char

Cnt3 EQU 38H ;addr of counter, 3 char

CntPointer EQU 39H ;addr of counter pointer

DSEG AT 20H

ORG 30H

data_buf: DS 32 ; storage for record data field (20H-2FH is bit-addresable memory)

ORG 60H ; stack origin

stack: DS 20H ; stack depth

;Vectory prerivaniy

CSEG

ORG 0000H ; power on/reset vector

jmp cold_start

ORG 0003H ; external interrupt 0 vector

reti ; undefined

ORG 000BH ; timer 0 overflow vector

jmp get_button

ORG 0013H ; external interrupt 1 vector

reti ; undefined

ORG 001BH ; timer 1 overflow vector

reti ; undefined

ORG 0023H ; serial I/O interrupt vector

jmp get_char

ORG 40H ; begin constant data space

privet_cmd: DB 'Device online', 0 ; modem return to command mode

copyright_cmd: DB 'Hardware&Software Copyright (c) by Chupilko 2007',0

start_cmd: DB 'Start! ',0

pause_cmd: DB 'Pause! ',0

stop_cmd: DB 'Stop! ',0

clock_cmd: DB 'Clock ',0

ORG 0100H ; begin code space

USING 0 ; register bank zero

cold_start:

setb P3.4;green marker

clr P3.5

mov sp, #(stack-1) ; initialize stack pointer

mov PCON, #0 ; initialize power control register

mov IE, #0 ; deactivate all interrupts

mov a, #0ffh ; deactivate output ports

mov p0, a ;

mov p1, a ;

mov p2, a ;

mov p3, a ;

mov SCON, #01000000b ; serial port mode one

mov TMOD, #00100001b ; timer one 8-bit auto-reload, timer zero 16-bit

mov TH1, #BAUD_9600 ; timer one reload value

mov TCON, #01000000b ; start timer 1

setb REN ; enable serial reception

setb EA ; global interrupt enable

mov DeviceState, #2 ; DeviceState = input

; Initialize the modem.

setb TI ; set transmit interrupt flag

; (kludge for first use)

; clr p3.3

call delay_sec ;wait one second

mov a,#LF

call send_char

mov a,#CR

call send_char

mov dptr, #privet_cmd ; point to attention string

call send_string ; transmit string

mov a,#LF

call send_char

mov a,#CR

call send_char

mov dptr, #copyright_cmd ; point to attention string

call send_string ; transmit string

mov a,#LF

call send_char

mov a,#CR

call send_char

mov cnt0,#0

mov cnt1,#0

mov cnt2,#0

mov cnt3,#0

mov cnt_tact,#CountTacts

mov CntPointer,#(Cnt3)

m1:

; Clear pending interrupts before enabling serial interrupts.

jnb TI, $ ; wait for transmitter to clear

clr TI ; clear transmit interrupt flag

clr RI ; clear receive interrupt flag

setb EA ; enable all ints

setb ES ; enable serial ints to wake controller

setb ET0 ; enable timer0 ints (keyboard)

setb TR0 ; resume timer0

clr F0 ; clear connect flag

idle:

orl PCON, #1 ; idle the controller, serial int exits

jnb F0, idle ; return to idle if not connected

; Connection has been established.

; Begin polling for valid record header.

clr EA ; disable all interrupts

mov R0,CButton

cjne R0,#00h,notpc

;pc keyboard****************************************************

setb TI ; set transmit interrupt flag

mov r6, DeviceState

cjne r6, #2, input_badstate; if Device State not Input just ignore

cjne r6, #(Cnt0-1), input_goodpointer; if 4 chars been inputted just ignore

jmp input_badstate

input_goodpointer:

call char2hex ; a: char -> hex

cjne a,#16, input_goodnumber; if bad char been inputted just ignore

jmp input_badstate

input_goodnumber:

mov r0,CntPointer

mov @r0,a ;@CntPointer = a

dec CntPointer

call hex2char ; a: hex -> char

call send_char

input_badstate:

jmp m1; go back

notpc:cjne R0,#01h,notpc_norstart

;signal start****************************************************

setb TI ; set transmit interrupt flag

mov dptr, #start_cmd ; point to attention string

call send_string ; transmit string

mov a,#LF

call send_char

mov a,#CR

call send_char

mov DeviceState,#1 ; Device State = count

jmp m1

notpc_norstart:cjne R0,#02h,notpc_norstart_norstop

;signal stop***********************************************

input_stop:

setb TI ; set transmit interrupt flag

mov dptr, #stop_cmd ; point to attention string

call send_string ; transmit string

mov a,#LF

call send_char

mov a,#CR

call send_char

jmp cold_start ;Reset Device

notpc_norstart_norstop:cjne R0,#03h,notpc_norstart_norstop_norpause

;signal pause****************************************************

setb TI ; set transmit interrupt flag

mov dptr, #pause_cmd ; point to attention string

call send_string ; transmit string

mov a,#LF

call send_char

mov a,#CR

call send_char

mov DeviceState,#3 ; Device State = pause

jmp m1

notpc_norstart_norstop_norpause:cjne R0,#04h,_m1

;signal count*******************************************

setb TI ; set transmit interrupt flag

call dec_count

jz input_stop; if dec_count sets a=0 then end of count

mov dptr, #clock_cmd ; point to attention string

call send_string ; transmit string

mov a,Cnt3

call hex2char

call send_char

mov a,Cnt2

call hex2char

call send_char

mov a,Cnt1

call hex2char

call send_char

mov a,Cnt0

call hex2char

call send_char

mov a,#LF

call send_char

mov a,#CR

call send_char

jmp m1

_m1: jmp m1 ; (relative addresing exceed)

send_string:

; Transmit string pointed to by DPTR.

; String may be of any length, but must be null-terminated.

push acc

push dpl

push dph

ss1:

clr a

movc a, @a+dptr ; get character

jz ss2 ; check for terminator

call send_char ; send character

inc dptr ; point to next character

jmp ss1

ss2:

pop dph

pop dpl

pop acc

ret

send_char:

; Wait for transmitter to clear, add even parity bit to character

; in accumulator and transmit it. Does not wait for transmitter

; to clear before returning.

jnb TI, $ ; wait here for transmitter to clear

clr TI ; clear transmit flag

push acc ; save char

mov c, p ; get parity bit

mov acc.7, c ; add parity bit to data

mov SBUF, a ; load character into transmitter

pop acc ; restore char

ret

delay_sec:

; Delay for one second times the value in the accumulator.

push mr0

push mr1

mov mr0,#4

mov mr1,#250

ddd:

call delay_ms ; mr1*mr2 mS

djnz mr1, ddd

mov mr1,#250

djnz mr0, ddd

pop mr1

pop mr0

ret

delay_50msec:

; Delay for one second times the value in the accumulator.

push mR0

mov mR0, #50

ddd2:

call delay_ms ; 50 mS

djnz mR0, ddd2

pop mR0

ret

delay_ms:

; Delay for one mS times the value in the accumulator.

push mR0

mov mR0, #0

djnz mR0, $ ; 500 uS @ 12 MHz

djnz mR0, $ ; 500 uS @ 12 MHz

pop mR0

ret

;a: hex -> char

hex2char:

cjne a,#0,p1_lb1

mov a,#(asc_0+0)

jmp p1_back

p1_lb1:

cjne a,#1,p1_lb2

mov a,#(asc_0+1)

jmp p1_back

p1_lb2:

cjne a,#2,p1_lb3

mov a,#(asc_0+2)

jmp p1_back

p1_lb3:

cjne a,#3,p1_lb4

mov a,#(asc_0+3)

jmp p1_back

p1_lb4:

cjne a,#4,p1_lb5

mov a,#(asc_0+4)

jmp p1_back

p1_lb5:

cjne a,#5,p1_lb6

mov a,#(asc_0+5)

jmp p1_back

p1_lb6:

cjne a,#6,p1_lb7

mov a,#(asc_0+6)

jmp p1_back

p1_lb7:

cjne a,#7,p1_lb8

mov a,#(asc_0+7)

jmp p1_back

p1_lb8:

cjne a,#8,p1_lb9

mov a,#(asc_0+8)

jmp p1_back

p1_lb9:

cjne a,#9,p1_lb10

mov a,#(asc_0+9)

jmp p1_back

p1_lb10:

cjne a,#10,p1_lb11

mov a,#(asc_a+0)

jmp p1_back

p1_lb11:

cjne a,#11,p1_lb12

mov a,#(asc_a+1)

jmp p1_back

p1_lb12:

cjne a,#12,p1_lb13

mov a,#(asc_a+2)

jmp p1_back

p1_lb13:

cjne a,#13,p1_lb14

mov a,#(asc_a+3)

jmp p1_back

p1_lb14:

cjne a,#14,p1_lb15

mov a,#(asc_a+4)

jmp p1_back

p1_lb15:

cjne a,#15,p1_back

mov a,#(asc_a+5)

jmp p1_back

p1_lb16:

mov a,#(asc_a+5)

p1_back:

ret

a: char -> hex, #16 mean not recognized

char2hex:

cjne a,#(asc_0+0),p2_lb1

mov a,#0

jmp p2_back

p2_lb1:

cjne a,#(asc_0+1),p2_lb2

mov a,#1

jmp p2_back

p2_lb2:

cjne a,#(asc_0+2),p2_lb3

mov a,#2

jmp p2_back

p2_lb3:

cjne a,#(asc_0+3),p2_lb4

mov a,#3

jmp p2_back

p2_lb4:

cjne a,#(asc_0+4),p2_lb5

mov a,#4

jmp p2_back

p2_lb5:

cjne a,#(asc_0+5),p2_lb6

mov a,#5

jmp p2_back

p2_lb6:

cjne a,#(asc_0+6),p2_lb7

mov a,#6

jmp p2_back

p2_lb7:

cjne a,#(asc_0+7),p2_lb8

mov a,#7

jmp p2_back

p2_lb8:

cjne a,#(asc_0+8),p2_lb9

mov a,#8

jmp p2_back

p2_lb9:

cjne a,#(asc_0+9),p2_lb10

mov a,#9

jmp p2_back

p2_lb10:

cjne a,#(asc_a+0),p2_lb11

mov a,#10

jmp p2_back

p2_lb11:

cjne a,#(asc_a+1),p2_lb12

mov a,#11

jmp p2_back

p2_lb12:

cjne a,#(asc_a+2),p2_lb13

mov a,#12

jmp p2_back

p2_lb13:

cjne a,#(asc_a+3),p2_lb14

mov a,#13

jmp p2_back

p2_lb14:

cjne a,#(asc_a+4),p2_lb15

mov a,#14

jmp p2_back

p2_lb15:

cjne a,#(asc_a+5),p2_lb16

mov a,#15

jmp p2_back

p2_lb16:

mov a,#16

p2_back:

ret

;decrise cnt0,1,2,3, a=0 if end of count

dec_count:

inc cnt0

inc cnt1

inc cnt2

inc cnt3

djnz cnt0, p3_back

mov cnt0,#16

djnz cnt1, p3_back

mov cnt1,#16

djnz cnt2, p3_back

mov cnt2,#16

djnz cnt3, p3_back

mov cnt0,#0

mov cnt1,#0

mov cnt2,#0

mov cnt3,#0

mov a,#0

jmp p3_justback

p3_back:

dec cnt0

dec cnt1

dec cnt2

dec cnt3

mov a,#1

p3_justback:

ret

end

4. Программа (Прерывания)

get_char:

; Read a character from the serial port and check for even parity.

;

jnb RI, $ ; wait here recever

mov a, SBUF ; get character into accumulator

mov c, p ; carry set for odd parity (error)

anl a, #7fh ; strip off parity (eighth) bit

setb F0 ; set connect flag

clr RI ; reset receive flag

; call delay_sec

Reti

get_button:

;clr P3.4 is orange

;setb P3.5 is orange

;mov r0,CButton

;cjne r0,#0,kb_justback

clr TF0

mov r0,DeviceState

cjne r0,#1,kb_notcount ;only if count

djnz cnt_tact,kb_notcount

mov cnt_tact,#CountTacts

mov CButton,#04h

setb F0 ;Set connection

jmp kb_justback

kb_notcount:

clr TR0

clr ET0

push acc

push mr0

mov mr0,#0FFh

mov P1,#01111111b

mov a,p1

anl mr0,a

mov r0,mr0

jnb p1.1, kb_next1

jnb p1.2, kb_next1

jnb p1.3, kb_next1

jmp kb_next2

kb_next1:

clr P3.4 ;is orange

setb P3.5

jmp kb_next3

kb_next2:

setb P3.4 ;is green

clr P3.5

kb_next3:

cjne r0,#01110111b,kb_not_start

;*******************Start*************************

mov r1,cbutton

cjne r1,#0,kb_isoldbutton

mov CButton,#01h

setb F0 ;Set connection

jmp kb_goback

kb_not_start: cjne r0,#01111011b,kb_not_stop

;*******************Stop*************************

mov r1,cbutton

cjne r1,#0,kb_isoldbutton

mov CButton,#02h

setb F0 ;Set connection

jmp kb_goback

kb_not_stop: cjne r0,#01111101b,kb_not_abort

;*******************Abort*************************

mov r1,cbutton

cjne r1,#0,kb_isoldbutton

mov CButton,#03h

setb F0 ;Set connection

jmp kb_goback

kb_not_abort:

;*******************Any else key*************************

mov CButton,#0h

setb TR0

setb ET0

kb_goback:

;*******************Pop from stack and reti**********************

pop mr0

pop acc

jmp kb_justback

kb_isoldbutton:

;***************Continous press************************

setb TR0

setb ET0

pop mr0

pop acc

kb_justback:

reti

5. Выводы

В работе запрограммирован микропроцессор i8951 на выполнение функций счетчика обратного счета. Использованы прерывания от последовательного порта и таймера.

6. Литература

1. Официальная документация к процессору 8951

2. Программирования на языке Ассемблера для микроконтроллеров семейства i8051. Каспер Эрни, М.: 2003

3. Однокристальные микроЭВМ. Справочник. Бином: 1994


Подобные документы

  • Разработка калькулятора на выполнение арифметических функций в 16-ой системе. Использование прерывания от последовательного порта и таймера. Применение системы "прототип" на основе микроконтроллера 51 семейства. Ввод чисел с последовательного порта.

    курсовая работа [18,4 K], добавлен 23.08.2009

  • Технические характеристики микропроцессора Aduc 812. Основные блоки электрической структурной схемы: микроконтроллер, клавиатура, индикатор, интерфейс последовательного midi-порта. Выбор элементной базы, описание алгоритма работы устройства и программы.

    курсовая работа [68,0 K], добавлен 23.12.2012

  • Выбор элементной базы: микроконтроллера; микросхем для реализации системной шины; памяти; кварцевого генератора; сторожевого таймера; индикатора и коммутатора; последовательного порта. Программное обеспечение микропроцессорной системы обработки сигналов.

    курсовая работа [259,3 K], добавлен 19.04.2012

  • Горизонтальные и вертикальные протоколы модели OSI. Типы данных: сегмент, пакет, кадр, бит. Прикладной, транспортный, сетевой и представительский уровень: понятие, главные особенности. Основные функции сетевого адаптера и последовательного порта.

    лекция [177,1 K], добавлен 15.04.2014

  • Назначение, классификация и принцип действия плоттеров. Технические характеристики режущего графопостроителя. Особенности его подключения к компьютеру с помощью последовательного порта и USB. Определение возможных неисправностей и методы их устранения.

    реферат [2,8 M], добавлен 09.12.2010

  • Определение основных функций процессора. Микросхема процессора и выводы шин адреса, данных и управления. Функции памяти и устройств ввода/вывода (мыши, клавиатуры, джойстика). Описание функций внутренних регистров микропроцессора. Оперативная память.

    презентация [603,1 K], добавлен 17.06.2014

  • Разработка программы на языке Assembler, отсчитывающую время от заданного значения до 0. Осуществление ввода с помощью стандартной шестнадцатикнопочной терминальной клавиатуры, подключаемой к параллельному порту (P1). Логика построения программы.

    курсовая работа [188,8 K], добавлен 15.08.2009

  • Разработка структурной схемы и поведенческой модели последовательного CAN-порта. Методика синтеза и синтез схем. Построение топологии и анализ результатов. Техническая прогрессивность новой конструкции. Verilog-описание механизма сигнализации ошибок.

    дипломная работа [548,1 K], добавлен 01.06.2013

  • Разработка ввода с клавиатуры и вывода на экран монитора данных с помощью стандартных функций printf и scanf. Ввод количества материальных точек. Работа с линейным списком. Хранение содержимого списка в блоке ячеек памяти с последовательными адресами.

    курсовая работа [176,8 K], добавлен 18.01.2016

  • Использование программой функции ввода-вывода данных для реализации дружественного интерфейса с пользователем. Функции консоли и особенности их применения для обеспечения аккуратного ввода информации и упорядоченного вывода. Обзор стандартных функций.

    лабораторная работа [40,4 K], добавлен 06.07.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.