|
||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Приклади мікроконтролерних програм широкого застосування
Терміни проектування прикладного програмного забезпечення мікроконтролерів 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;перехід до команди, що ;випливає за списком параметрів
Робота з таблицями констант. Існує досить широке коло задач, у яких використовуються великі багатомірні таблиці каліброваних констант, нелінійних параметрів і т.п. Підпрограма MATRX здійснює доступ до байтовх елементів двовимірної таблиці розмірності m´n (m,n£255), розміщеної в одномірній пам'яті програм мікроконтролера 8051 (мал.3), при цьому адреса ADR комірки ПП, що містить елемент , визначається по формулі: , де і є відповідно номер рядка і стовпця таблиці; 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(і-1) MOV A,B ADDC A,DPH MOV DPH,A;у DPH старший байт STRT+n(і-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,#0010xxxx;настроювання 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 MIT2: MOV R2,#m MIT1: DJNZ R2,MET1 DJNZ R1,MET2 RET Відзначимо, що максимальний час затримки, формованим підпрограмою DELAY2, буде складати . Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.) |