- •Требования к содержанию и оформлению курсового проекта
- •Перечень 3аданий для курсовых проектов
- •3. Программный счетчик числа продукции за определенное время с индикацией результата измерения (сложность 4 балла).
- •6. Программный реверсивный счетчик (сложность 4 балла).
- •7. Программный суммирующий счетчик с ручной начальной загрузкой (сложность 4 балла).
- •8. Программный реверсивный счетчик с ручной начальной
- •Общие принципы разработки программного обеспечения
- •Правила записи программ на языке ассемблера msc 51
- •Директивы (псевдокоманды ассемблера)
- •Общие сведения о системе команд микроконтроллера msc 51
- •Методические указания по работе с литературой
- •Библиографический список
Директивы (псевдокоманды ассемблера)
Ассемблирующая программа транслирует исходную программу в объектные коды. Хотя транслирующая программа берет на себя многие рутинные задачи программиста, такие как присвоение действительных адресов, преобразование чисел, присвоение действительных значений символьным переменным и т.п., программист все же должен указать ей некоторые параметры: начальный адрес прикладной программы, конец ассемблирующей программы, форматы данных и т.д. Всю эту информацию программист вставляет в исходный текст своей прикладной программы в виде директив ассемблера, которые только управляют процессом трансляции и не преобразуются в коды объектной программы.
Псевдокоманда ORG 10H задает ассемблеру адрес ячейки памяти (10H), в которой должна быть расположена следующая за ней команда прикладной программы.
Псевдокомандой EGU можно любому символическому имени, используемому в программе, поставить в соответствие определенный операнд. Например запись:
MOD EGU 20
приводит к тому, что в процессе ассемблирования всюду, где встретится символическое имя MOD, оно будет заменено числом 20.
Символические имена операндов, переопределяемых в процессе исполнения программы, определяются псевдокомандой SET:
ALFA SET 3
…..
…..
ALFA SET ALFA+1
Ассемблер MSC 51 позволяет определить символическое имя как адрес внутренних (псевдокоманда DATA), внешних (XDATA) данных или адрес бита (псевдокоманда BIT). Например, директива
FLAG BIT 25H.3
определяет символическое имя FLAG как третий вит ячейки ОЗУ с адресом 25H.
Псевдокоманда DB обеспечивает занесение в память программ микроконтроллера константы, представляющей собой байт.
Псевдокомандой END программист дает ассемблеру указание об окончании трансляции.
В результате трансляции должна быть получена карта памяти программы, где для каждой ячейке ПЗУ микроконтроллера указан хранящийся в ней код.
В соответствии с форматом команд для представления их объектных кодов отводятся одна, две или три ячейки памяти программ. В первой ячейке располагается код операции, во второй и третьей – непосредственный операнд, адрес прямоадресуемого операнда или смещение (для команд передачи управления). Для команд LCALL и LJMP во втором и третьем байтах объектного кода указывается адрес передачи управления (во втором старшая часть, в третьем – младшая).
Общие сведения о системе команд микроконтроллера msc 51
Система команд микроконтроллера MSC 51 содержит 111 базовых команд, которые по функциональному признаку разделяются на пять групп: команды передачи данных, арифметических операций, логических операций, передачи управления и операций с битами. Большинство команд (94) имеет формат один или два байта и выполняются за один или два машинных цикла (при тактовой частоте 12 МГц длительность машинного цикла составляет 1 мкс).
Команды передачи данных представлены в табл. 9.
Таблица 9
НАЗВАНИЕ КОМАНДЫ |
МНЕМОНИКА |
ОПЕРАЦИЯ |
Пересылка в аккумулятор из регистра (n=0...7) |
MOV А,Rn |
(А) ← (Rn) |
Пересылка в аккумулятор прямоадресуемого байта |
MOV A,ad |
(А) ← (ad) |
Пересылка в аккумулятор байта из внут. ОЗУ (i=0, 1) |
MOV A,@Ri |
(A) ← (( Ri )) |
Загрузка в аккумулятор константы |
MOV A,#data8 |
(А) ← #data8 |
Пересылка в регистр из аккумулятора |
MOV Rn,А |
(Rn) ← (А) |
Пересылка в регистр прямоадресуемого байта |
MOV Rn,аd |
(Rn) ← (ad) |
Загрузка в регистр константы |
MOV Rn,#dаtа8 |
(Rn) ← #data8 |
Пересылка по прямому адресу аккумулятора |
MOV ad,A |
(ad) ← (А) |
Пересылка по прямому адресу регистра |
MOV аd,Rn |
(ad) ← (Rn) |
Пересылка прямоадресуемого байта по прямому адресу |
MOV add,ads |
(add) ← (ads) |
Пересылка байта из внут. ОЗУ по прямому адресу |
MOV ad,@Ri |
(ad) ← (( Ri )) |
Пересылка по прямому адресу константы |
MOV ad,#data8 |
(ad) ← #data8 |
Пересылка во внут. ОЗУ из аккумулятора |
MOV @Ri,A |
(( Ri )) ← (А) |
Пересылка во внут. ОЗУ прямоадресуемого байта |
MOV @Ri,ad |
(( Ri )) ← (ad) |
Пересылка во внут. ОЗУ константы |
MOV @Ri,#data8 |
(( Ri )) ← #data8 |
Загрузка указателя данных |
MOV DPТR,#data16 |
(DPТR) ← #data16 |
Пересылка в аккумулятор байта из памяти программ |
MOVC A,@A+DPТR |
(А) ← ((А) + (DPТR)) |
Пересылка в аккумулятор байта из памяти программ |
MOVC А,@А+РС |
(РС)←(РС) + 1; (А)←((А) +(РС)) |
Пересылка в аккумулятор байта из внеш. ОЗУ |
MOVX A,@Ri |
(А) ← (( Ri )) |
Пересылка в аккумулятор байта из расширенного внеш.ОЗУ |
MOVX A,@DPТR |
(А) ← ((DPТR)) |
Пересылка во внеш. ОЗУ из аккумулятора |
MOVX @Ri,A |
(( Ri )) ← (А) |
Пересылка в расширенное внеш. ОЗУ из аккумулятора |
MOVX @DPТR,A |
((DPТR)) ← (А) |
Загрузка в стек |
PUSH ad |
(SP) ← (SP) + 1; ((SP)) ← (ad) |
Извлечение из стека |
РОР ad |
(ad) ← ((SP)); (SP) ← (SP) - 1 |
Обмен аккумулятора с регистром |
ХСН A,Rn |
(А) ↔ (Rn) |
Обмен аккумулятора с прямоадресуемым байтом |
ХСН ,ad |
(А) ↔ (ad) |
Обмен аккумулятора с байтом из внут. ОЗУ |
ХСН A,@Ri |
(А) ↔ (( Ri )) |
Обмен мл. тетрады аккумулятора с мл. тетрадой байта внут. ОЗУ |
ХСНD A,@Ri |
(А0...3) ↔ ((Ri0...3)) |
В табл.9 используются следующие обозначения:
А – аккумулятор;
Ri – адресный регистр текущего банка (i = 0 или 1);
Rn – регистр общего назначения (РОН) текущего банка; n = 0 ÷ 7;
PC – счетчик команд;
DPTR – регистр-указатель данных;
ad – адрес или мнемоническое обозначение 8-битного операнда (ячейка ОЗУ, регистры специальных функций);
add – адрес или мнемоническое обозначение 8-битного операнда-приемника данных (ячейка ОЗУ, регистры специальных функций);
ads – адрес или мнемоническое обозначении 8-битного операнда-источника данных (ячейка ОЗУ, регистры специальных функций);
#data8 – 8-битное число (константа);
#data16 – 16-битное число (константа);
SP – указатель стека;
@ – префикс косвенной адресации;
Примечание к табл. 9. Регистры специальных функций (в том числе и порты ввода-вывода) адресуются только прямым способом. Байты памяти (ОЗУ и ПЗУ) адресуются также и косвенным способом через адресные регистры R0, R1, DPTR и PC.
В табл. 9 не приведены сведения о кодах операций, количестве байтов и циклов каждой команды.
Символическое описание выполняемой команды приведено в 3 столбце табл.9. Обозначение операнда в одинарных скобках указывает на содержимое ячейки, адрес которой указан в скобках, а стрелка – направление пересылки данных. Обозначение операнда в двойных скобках указывает на ячейку, в которой в свою очередь содержится адрес ячейки с данными, подлежащими пересылке (косвенная адресация).
Арифметические команды представлены в табл. 10.
Таблица 10
НАЗВАНИЕ КОМАНДЫ |
МНЕМОНИКА |
ОПЕРАЦИЯ |
Сложение аккумулятора с регистром (n=0...7) |
АDD A,Rn |
(А) ← (А) + (Rn) |
Сложение аккумулятора с прямо адресуемым байтом |
АDD A,ad |
(А) ← (А) + (ad) |
Сложение аккумулятора с байтом из внут. ОЗУ (i = 0, 1) |
АDD A,@Ri |
(А) ← (А) + (( Ri )) |
Сложение аккумулятора с константой |
АDD A,#data8 |
(А) ← (А) + #data8 |
Сложение аккумулятора с регистром и переносом |
АDDC A,Rn |
(А) ← (А) + (Rn) + (C) |
Сложение аккумулятора с прямоадресуемым байтом и переносом |
АDDC A,ad |
(А) ← (А) + (ad) + (C) |
Сложение аккумулятора с байтом из внут. ОЗУ и переносом |
АDDC A,@Ri |
(А) ← (А) + (( Ri )) + (C) |
Сложение аккумулятора с константой и переносом |
АDDC A,#data8 |
(А) ← (А) + #data8 + (C) |
Десятичная коррекция аккумулятора |
DА А |
Если (А0 -3)>9 V ((C) = 1), то (А0-3) ← (А0-3)+6. Затем если (А4-7)>9 V ((C) = 1), то (А4-7) ← (А4-7)+6 |
Вычитание из аккумулятора регистра и заёма |
SUBB A,Rn |
(А) ← (А) - (Rn) - (C) |
Вычитание из аккумулятора прямоадресуемого байта и заёма |
SUBB A,ad |
(А) ← (А) - (ad) - (C) |
Вычитание из аккумулятора байта из внут. ОЗУ и заёма |
SUBB A,@Ri |
(А) ← (А) - (( Ri )) - (C) |
Вычитание из аккумулятора константы и заёма |
SUBB A,#data8 |
(А) ← (А) - #data8 - (C) |
Инкремент аккумулятора |
INC А |
(А) ← (А) + 1 |
Инкремент регистра |
INC Rn |
(Rn) ← (Rn) + 1 |
Инкремент прямоадресуемого байта |
INC ad |
(ad) ← (ad) + 1 |
Инкремент байта из внут. ОЗУ |
INC @Ri |
(( Ri )) ← (( Ri )) + 1 |
Инкремент указателя данных |
INC DPTR |
(DPTR) ← (DPTR) + 1 |
Декремент аккумулятора |
DЕС А |
(А) ← (А) - 1 |
Декремент регистра |
DЕС Rn |
(Rn) ← (Rn) - 1 |
Декремент прямоадресуемого байта |
DЕС ad |
(ad) ← (ad) - 1 |
Декремент байта из внут. ОЗУ |
DЕС @Ri |
(( Ri )) ← (( Ri )) - 1 |
Умножение аккумулятора и регистра В |
MUL AB |
(В)(А) ← (А) * (В) |
Деление аккумулятора на регистр В |
DIV AB |
(А),(В) ← (А) / (В) |
Обозначения в табл.10: V – логическое ИЛИ.
Приведенные команды не требуют пояснения за исключением одной – команды десятичной коррекции аккумулятора (DА А). Эта команда используется только при сложении двух двоично-десятичных[ чисел, хранящихся в аккумуляторе и другой ячейке памяти. Команда корректирует предшествующую ей операцию сложения ADD или ADDC.
Логические команды представлены в табл. 11.
Таблица 11
НАЗВАНИЕ КОМАНДЫ |
МНЕМОНИКА |
ОПЕРАЦИЯ |
Логическое И аккумулятора и регистра (n=0...7) |
ANL A,Rn |
(А) ← (А) ^ (Rn) |
Логическое И аккумулятора и прямоадресуемого байта |
ANL A,ad |
(А) ← (А) ^ (ad) |
Логическое И аккумулятора c байтoм из внут. ОЗУ (i = 0,1) |
ANL A,@Ri |
(А) ← (А) ^ (( Ri )) |
Логическое И аккумулятора и константы |
ANL A,#data8 |
(А) ← (А) ^ #data8 |
Логическое И прямоадресуемого байта и аккумулятора |
ANL ad,A |
(ad) ← (ad) ^ (А) |
Логическое И прямоадресуемого байта и константы |
ANL ad,#data8 |
(ad) ← (ad) ^ #data8 |
Логическое ИЛИ аккумулятора и регистра (n = 0...7) |
ORL A,Rn |
(А) ← (А) V (Rn) |
Логическое ИЛИ аккумулятора и прямоадресуемого байта |
ORL A,ad |
(А) ← (А) V. (ad) |
Логическое ИЛИ аккумулятора с байтом из внут. ОЗУ (i = 0, 1) |
ORL A,@Ri |
(А) ← (А) V. (( Ri )) |
Логическое ИЛИ аккумулятора и константы |
ORL A,#data8 |
(А) ← (А) V #data8 |
Логическое ИЛИ прямоадресуемого байта и аккумулятора |
ORL ad,A |
(ad) ← (ad) V (А) |
Логическое ИЛИ прямоадресуемого байта и константы |
ORL ad,#data8 |
(ad) ← (ad) V #data8 |
Исключающее ИЛИ аккумулятора и регистра (n = 0...7) |
XRL A,Rn |
(А) ← (А) ИЛИ искл. (Rn) |
Исключающее ИЛИ аккумулятора и прямоадресуемого байта |
XRL A,ad |
(А) ← (А) ИЛИ искл. (ad) |
Исключающее ИЛИ аккумулятoра c байтoм из внут. ОЗУ (i = 0,1) |
XRL A,@Ri |
(А) ← (А) ИЛИ искл. (( Ri )) |
Исключающее ИЛИ аккумулятора и константы |
XRL A,#data8 |
(А) ← (А) ИЛИ искл. #data8 |
Исключающее ИЛИ прямоадресуемого байта и аккумулятора |
XRL ad,A |
(ad) ← (ad) ИЛИ искл. (А) |
Исключающее ИЛИ прямоадресуемого байта и константы |
XRL ad,#data8 |
(ad) ← (ad) ИЛИ искл. #data8 |
Сброс аккумулятoра |
CLR A |
(А) ← 0 |
Инверсия аккумулятора |
CPL A |
(А) ← (инв. А) |
Сдвиг аккумулятора влево циклический |
RL A |
(А.n+1) ← (А.n), n=0-6; (А.0) ← (А.7) |
Сдвиг аккумулятора влево через перенос |
RLC A |
(А.n+1)← (А.n), n=0-6; (А.0)←(С); (С)←(А.7) |
Сдвиг аккумулятора вправо циклический |
RR A |
(А.n) ← (А.n+1), n=0-6; (А.7) ← (А.0) |
Сдвиг аккумулятора вправо через перенос |
RRC A |
(А.n)←(А.n+1), n=0-6; (А.7)←(С); (С) ←(А.0) |
Обмен местами тетрад в аккумуляторе |
SWAP A |
(А.1, А.1, А.2, А.З) ↔ (А.4, А.5, А:6, А.7) |
Обозначения в табл.11: V – логическое ИЛИ; ^ – логическое И;
Команды с битами представлены в табл. 12
Таблица 12
НАЗВАНИЕ КОМАНДЫ |
МНЕМОНИКА |
ОПЕРАЦИЯ |
Сброс переноса |
CLR C |
(С) ← 0 |
Сброс бита |
CLR bit |
(bit) ← 0 |
Установка переноса |
SEТВ С |
(С) ← 1 |
Установка бита |
SEТВ bit |
(bit) ← 1 |
Инверсия переноса |
CPL C |
(С) ← инв. (С) |
Инверсия бита |
CPL bit |
(bit) ← инв. (bit) |
Логическое И бита и переноса |
ANL C,bit |
(С) ← (С) ^ (bit) |
Логическое И инверсии бита и переноса |
ANL C,/bit |
(С) ← (С) ^ инв.(bit) |
Логическое ИЛИ бита и переноса |
ORL C,bit |
(С) ← (С) V (bit) |
Логическое ИЛИ инверсии бита и переноса |
ORL C,/bit |
(С) ← (С) V инв.(bit) |
Пересылка бита в перенос |
MOV C,bit |
(С) ← (bit) |
Пересылка переноса в бит |
MOV bit,С |
(bit) ← (С) |
Примечание к табл. 12. Если в качестве операнда bit используется бит аккумулятора, то его мнемоническое обозначение следует представлять в виде ACC.n (n=0÷7).
Группа команд передачи управления указана в табл. 13
Таблица 13
НАЗВАНИЕ КОМАНДЫ |
МНЕМОНИКА |
ОПЕРАЦИЯ |
Длинный абсолютный переход в полном объеме памяти программ |
LJMP ad16 |
(РС) ← ad16 |
Абсолютный переход внутри двухкилобайтной страницы |
АJMP ad11 |
(РС) ← (РС)+2, затем (РС 0-10) ← ad11 |
короткий относительный переход внутри страницы 256 байт |
SJMP rel |
(РС) ← (РС)+2, затем (РС) ← (РС)+геl |
Косвенный относительный переход |
JMP @A+DPТR |
(РС) ← (A)+(DP1R) |
Переход, если аккумулятор равен 0 |
JZ rel |
(РС) ← (РС)+2, затем если (А)=0, то (РС)←(РС)+геl |
Переход, если аккумулятор не равен 0 |
JNZ rel |
(РС)← (РС)+2,затем если (А)<>0,то (РС)←(РС)+rеl |
Переход, если перенос равен единице |
JC rel |
(РС)← (РС)+2, затем если (C)=1,то (РС)←(РС)+rеl |
Переход, если перенос равен нулю |
JNC rel |
(РС)← (РС)+2, затем если (C)=0,то (РС)←(РС)+rеl |
Переход, если бит равен единице |
JB bit,rel |
(РС)← (РС)+3, затем если bit=1,то (РС)←(РС)+rеl |
Переход, если бит равен нулю |
JNB bit,rel |
(РС)← (РС)+3, затем если bit=0,то (РС)←(РС)+rеl |
Переход, если бит установлен, с последующим сбросом бита |
JBC bit,rel |
(РС)← (РС)+3, затем если bit=1, то (РС)←(РС)+rеl, (bit) ← 0 |
Декремент регистра и переход, если не нуль |
DJNZ Rn,rel |
(РС) ← (РС)+2, (Rn) ← (Rn) -1, затем если (Rn)<>0, то (РС) ← (РС)+геl |
Декремент прямоадресуемого байта и переход, если не нуль |
DJNZ ad,rel |
(РС) ← (РС)+2, (ad) ← (ad) -1, затем если (ad)<>0, то (РС) ← (РС)+геl |
Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равно |
CJNE A,ad,rel |
(РС) ← (РС)+3, если (А)<> (ad), то (РС) ← (PC)+rel, при этом если (A) < (ad), то (С) ← 1, иначе (С) ← 0 |
Сравнение аккумулятора с константой и переход, если не равно |
CJNE A,#data8,rel |
(РС)←(РС)+З, если (A)<>#data8, то (РС) ←(PC)+rel,при этом если (A)<#data8. то (С) ← 1, иначе (С) ←0 |
Сравнение регистра с константой и переход, если не равно |
CJNE Rn,#dаtа8,геl |
(РС)←(РС)+З, если (Rn)<>#data8, то (РС) ←(PC)+rel, при этом если (Rn)<#data8. то (С) ← 1, иначе (С) ←0 |
Сравнение байта во внутреннем ОЗУ с константой и переход, если не равно |
CJNE @Ri,#data8,rel |
(РС)←(РС)+З, если ((Ri))<>#data8, то (РС) ←(PC)+rel, при этом если ((Ri))<#data8. то (С) ← 1, иначе (С) ←0 |
Длинный абсолютный вызов подпрограммы |
LCALL ad16 |
(РС) ← (РС)+3; (SP) ← (SP)+1 и ((SP)) ← (РС 0-7); затем (SP) ← (SP)+1 и ((SP)) ← (РС 8-15); затем (РС) ← ad16 |
Абсолютный вызов подпрограммы внутри двухкилобайтной страницы |
ACALL ad11 |
(РС) ← (РС)+3; (SP) ← (SP)+1 и ((SP)) ← (РС 0-7);затем (SP) ← (SP)+1 и ((SP)) ← (РС 8-15); затем (РС 0-10) ← ad11 |
Возврат из подпрограммы |
RET |
(РС 8-15) ← ((SP)); (SP) ← (SP)-1; затем (РС 0-7) ← ((SP)); (SP) ← (SP)-1 |
Возврат из подпрограммы обработки прерывания |
RETI |
(РС 8-15) ← ((SP)); (SP) ← (SP)-1; затем (РС 0-7) ← ((SP)); (SP) ← (SP)-1 |
Холостая команда |
NOP |
(PC) ← (PC)+1 |
Примечание к табл. 13. Под символическим обозначением операнда ad16, ad11, rel в командах прикладной программы, как правило, используется имя метки. Некоторые ассемблеры MCS 51 позволяют использовать вместо команд безусловных переходов LJMP, AJMP, SJMP обобщенную команду JMP. В противном случае можно для все случаев рекомендовать к применению команду LJMP.
Команды, модифицирующие флаги результата.
Регистр состояния микроконтроллера PSW содержит 4 флага:CY – переноса, АС – вспомогательного переноса, ОV – переполнения, и Р – флаг паритета.
Флаг АС устанавливается в случае, если при выполнении операций сложения или вычитания между тетрадами байта аккумулятора возник перенос или заем.
Флаг CY устанавливается, если перенос или заем возникает в старшем бите результата. При выполнении операций умножения и деления флаг CY сбрасывается.
Флаг OV устанавливается, если результат операции сложения или вычитания не укладывается в семи младших битах аккумулятора, и содержимое старшего бита изменяется в сравнении с исходным. Флаг устанавливается также если результат умножения больше 255 или в случае деления на 0. Если делитель не равен нулю, то независимо от результата деления флаг OV сбрасывается.
Флаг паритета Р зависит от текущего значения аккумулятора. Если число единичных бит аккумулятора нечетное, то флаг Р устанавливается в 1, а если нечетное – то сбрасывается.
В табл. 14 перечислены команды, при выполнении которых происходит модификация перечисленных флагов. Следует отметить, что отсутствующий в табл. 14 флаг паритета модифицируют все команды, изменяющие состояние аккумулятора. В табл. 14 также не приведены:
– команды, в которых местом назначения результата является регистр состояния PSW или его отдельные биты;
– команды операций над битами регистра PSW.
Таблица 14
КОМАНДЫ |
МОДИФИЦИРУЕМЫЕ ФЛАГИ |
ADD |
CY,OV,AC |
ADDC |
CY,OV,AC |
SUBB |
CY,OV,AC |
MUL |
CY=0, OV |
DIV |
CY=0, OV |
DA A |
CY |
RRC |
CY |
RLC |
CY |
SETB C |
CY=1 |
CLR C |
CY=0 |
CPL C |
CY = /CY |
ANL C,bit |
CY |
ANL C,/bit |
CY |
ORL C,bit |
CY |
ORL C,/bit |
CY |
MOV C,bit |
CY |
CJNE |
CY |