Счетчик на основе микропроцессора
Микропроцессор 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