
- •Программирование микроконтроллеров mcs-51
- •Учебное издание
- •Предисловие
- •1.1. Микроконтроллеры фирмы Intel
- •1.2. Микроконтроллеры фирмы Philips
- •1.3. Микроконтроллеры фирм Siemens, Atmel
- •2.1. Программная модель микроконтроллера 8051
- •2.2. Ассемблерный язык микроконтроллера 8051
- •2.2.1. Система команд языка асм51
- •2.2.2. Директивы языка асм51
- •Include операнды
- •3.1. Этапы проектирования ппо
- •3.2. Кросс-ассемблер x8051
- •Input Filename:
- •2500 A.D. 8051 Macro Assembler - Version 4.02a
- •Input Filename: prim.Asm
- •3.3. Кросс-редактор связей Link
- •Input Filename:
- •3.4. Примеры микроконтроллерных программ
- •Оглавление
- •Глава 1. Состав семейства mcs-51. . . . . . . 5
- •Глава 2. Особенности программирования
- •Глава 3. Технология разработки прикладного
3.4. Примеры микроконтроллерных программ
широкого применения
Сроки проектирования прикладного программного обеспечения микроконтроллеров MCS-51существенно сокращаются при использовании готовых МК-программ, реализующих типовые процедуры обработки данных (преобразование системы счисления, работа с таблицами констант, формирование заданной задержки и др.). Рассмотрим ряд МК-программ широкого применения, написанных на языке АСМ51.
Преобразование системы счисления. ПодпрограммаBINBCDвыполняет преобразование целого двоичного 8-разрядного числа без знака, содержащегося в аккумулятореA(значение в интервале 0-255), в трехзначное двоично-десятичное число, занимающее два байта и размещаемое в регистрахR1 (сотни),R2 (десятки и единицы).
BINBCD MOV B,#100
DIV AB ;разделить на 100 для определения
;числа сотен
MOV R1,A ;сохранить число сотен в R1
MOV A,#10
XCH A,B ;поместить остаток в A
DIV AB ;разделить на 10 для определения
;числа десятков
SWAP A ;число десятков в старшей тетраде A
ADD A,B ;число единиц в младшей тетраде A
MOV R0,A ;сохранить число десятков и единиц в R0
RET
Фрагмент МК-программы, предложенный ниже, обеспечивает преобразование двухзначного двоично-десятичного числа, содержащегося в R3, в двоичное 8-разрядное число, размещаемое в регистреDPH.
CONV MACRO BCD,BIN ;начало макроопределения с
;формальными параметрами BCD и BIN
MOV A,BCD
MOV B,#10H
DIV AB ;разделить на 16 для отделения
;старшей и младшей тетрад A
MOV R1,B
MOV B,#10
MUL AB
ADD A,R1
MOV BIN,A
ENDM ;конец макроопределения
CONV R3,DPH ;макрокоманда с фактическими
;параметрами R3 и DPH
Считывание таймера/счетчика в процессе работы. Часто встречаются ситуации, когда необходимо определить текущее состояние работающегоT/Cj (j{0,1}). Указанное может быть легко осуществлено последовательным чтением регистровTHj иTLj, после которого обязательно следует убедиться в том, что содержимоеTHjне изменилось (изменение возникает при переполненииTLj). Если изменение все же имело место, то следует повторить процедуру чтения сначала. Изложенный алгоритм реализован в подпрограммеRDT, приведенной ниже.
RDT MOV A,TH0
MOV R0,TL0 ;пересылка младшего байта T/C0 в R0
CJNE A,TH0,RDT ;контроль старшего байта T/C0
MOV R1,A ;пересылка старшего байта T/C0 в R1
RET
Передача параметров в подпрограмму. Обычно передача параметров перед вызовом подпрограммы осуществляется путем их загрузки в заданные регистры. Однако, если большое число параметров представляют собой константы, то более эффективным оказывается подход, при котором параметры фактически являются частью программного кода, следуя непосредственно за командой вызова подпрограммы. В этом случае подпрограмма определяет их местонахождение по адресу возврата в стеке. Рассмотрим подпрограммуADDBCD, которая иллюстрирует указанный подход при суммировании четырехзначной двоично-десятичной константы 1234Hс четырехзначной двоично-десятичной переменной, размещенной в резидентной памяти данных.
LCALL ADDBCD
DW 1234H ;BCD-константа
DB 56H ;адрес мл. байта BCD-переменной
DB 78H ;адрес мл. байта BCD-суммы
.........
ADDBCD POP DPH ;размещение в DPTR
POP DPL ;адреса возврата
MOV A,#2
MOVC A,@A+DPTR ;(A)=56H
MOV R0,A
MOV A,#3
MOVC A,@A+DPTR ;(A)=78H
MOV R1,A
MOV A,#1
MOVC A,@A+DPTR ;(A)=34H
ADD A,@R0 ;вычисление младшего байта суммы
DA A ;десятичная коррекция
MOV @R1,A
INC R0
INC R1
CLR A
MOVC A,@A+DPTR ;(A)=12H
ADDC A,@R0 ;вычисление старшего байта суммы
DA A ;десятичная коррекция
MOV @R1,A
MOV A,#4
JMP @A+DPTR ;переход к команде, следующей за
;списком параметров
|
Адрес |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STRT |
|
|
Рис.3. Схема
размещения табличных констант
|


,
где
и
есть соответственно номер строки и
столбца таблицы;STRTесть
адрес ячейки ПП, содержащей элемент
.
Отметим, что адрес
ячейки ПП, содержащей элемент
,
должен удовлетворять условию
.
;(R0)=i, (R1)=j, (DPTR)=STRT
MATRX MOV A,R0 ;(A)=i
DEC A
MOV B,#n
MUL AB
ADD A,DPL
MOV DPL,A ;в DPL младший байт STRT+n(i-1)
MOV A,B
ADDC A,DPH
MOV DPH,A ;в DPH старший байт STRT+n(i-1)
MOV A,R1 ;(A)=j
DEC A
MOVC A,@A+DPTR ;(A)=aij
RET
STRT DB a11,a12,...,a1n
DB a21,a22,...,a2n
..................
DB am1,am2,...,amn
Организация ветвления на n направленийпредполагает выбор одной изnпрограммных процедур в зависимости от выполнения соответствующего условия. Ниже приводится пример подпрограммы, эффективно реализующей указанный выбор. Здесь в зависимости от значения содержимого программно доступного элементаMEMSELосуществляется переход к одной из команд с адресамиMT1-MTn. При использовании подпрограммыJMP_nнеобходимо учитывать, что количество ячеек памяти программ, отведенное под таблицу адресов перехода и под область программных процедур, ограниченную адресамиMT1 и MTn, не должно превышать 256 байт.
;(MEMSEL){0,...,n-1}
MEMSEL REG R3
JMP_n MOV A,MEMSEL
MOV DPTR,#TBL
MOVC A,@A+DPTR
JMP @A+DPTR
TBL DB MT1-TBL,MT2-TBL,...,MTn-TBL
MT1 ..........
RET
MT2 ..........
RET
..........
MTn ..........
RET
Программирование последовательного порта. Последовательный порт микроконтроллера 8051 обеспечивает широкие возможности по организации приема/передачи данных, при этом настройка на заданную скорость приема/передачи и требуемый протокол обмена достигается соответствующей инициализацией регистровPCON (табл.2.2),TMOD (табл.2.4), SCON (табл.2.5). В качестве примера ниже приводятся три подпрограммы, которые совместно обеспечивают работу последовательного порта в режиме 3 со скоростью приема/передачи данных 2400 бод.
;INIT - подпрограмма инициализации
INIT MOV SCON,#1101xx10B ;x{0,1}
MOV TMOD,#0010xxxxB ;настройка T/C1
MOV PCON,#0 ;сброс бита SMOD
MOV
TH1,#<.NOT.K+1 ;,
где
;МГц
есть частота синхро-
;низации микроконтроллера
SETB TR1 ;включить T/C1
RET
;SP_OUT - подпрограмма передачи данных и контрольного бита
SP_OUT MOV C,P ;пересылка контрольного бита из флага
MOV TB8,C ;паритета в SCON.3
M1 JNB TI,M1 ;синхронизация передачи
CLR TI ;сброс бита SCON.1
MOV SBUF,A ;передача контрольного бита и
;содержимого A через посл. порт
RET
;SP_IN - подпрограмма приема данных и контрольного бита
SP_IN JNB RI,SP_IN ;синхронизация приема
CLR RI ;сброс бита SCON.0
MOV A,SBUF ;загрузка принятого байта данных в A
MOV C,RB8 ;загрузка девятого принятого бита
;данных (контрольного бита) в C
RET
Программная организация задержки. Процедура организации временной задержки может быть реализована на основе программного цикла. При этом в заданный регистр загружается число, которое затем в каждом проходе цикла уменьшается на единицу. Так продолжается до тех пор, пока содержимое используемого регистра не станет равным нулю, что интерпретируется МК-программой как момент выхода из цикла. Время задержки при этом зависит от числа, загруженного в регистр, и времени выполнения команд, образующих цикл. Например, задержка, формируемая подпрограммойDELAY1, будет определяться выражением:
,
где fесть частота синхронизации микроконтроллера.
Если,
то
мкс.
Задержку большей длительности при той
же частоте синхронизации можно получить
вложением циклов, как показано в
подпрограммеDELAY2, для
которой
(мкс).
DELAY1 MOV R2,#n
M1 DJNZ R2,M1
RET
DELAY2 MOV R1,#n
MET2 MOV R2,#m
MET1 DJNZ R2,MET1
DJNZ R1,MET2
RET
Отметим, что максимальное
время задержки, формируемой подпрограммой
DELAY2, будет составлять.
Список литературы
1. Сташин В.В. и др. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов, О.Ф.Мологонцева. М.: Энергоатомиздат, 1990.
2. Белов А.М. и др. Средства автоматизации программирования микропроцессорных устройств/ А.М.Белов, Е.А.Иванов, Л.Л.Муренко. М.: Энергоатомиздат, 1988.
3. Программирование микропроцессорных устройств: Сборник лабораторных работ/ Д.В.Андреев. Ульяновск: УлГТУ, 1994.
4. Андреев Д.В. Применение отладочных программных средств в курсе «Проектирование микропроцессорных устройств»// Сборник тезисов науч.-метод. конф. «Компьютерные технологии в высшем образовании». Ульяновск: УлГТУ, 1999.
5. Однокристальные микроЭВМ. М.: МИКАП, 1994.