у складі якого є ПЗП і ОЗП (див. додаток 1), зовнішніх пристроїв ОЗП та ПЗП ми не використовуватимемо.
В даному МК області ПЗП і ОЗП розділені між собою, причому для них застосовуються різні методи адресації (рис. 2).
Рис. 2. Структурна схема МК.
В даній роботі, ми використовуватимо внутрішній ПЗП МК, РЗП та ОЗП.
3.4. Підключення ЦАП
Для реалізації портів вводу-виводу будемо застосовувати вбудовані порти МК. Для підєднання ЦАП використовується порт P2, до якого безпосредньо підєднано ІМС ЦАП.
3.5. Підключення іникаторів
Для реалізації індикації застосуємо ІМС АЛС324Б, які являють собою семисегментний індикатор.
Таким чином для індикації нам необхідно використати вихідний восьмирозрядний порт. Для цієї мети використаємо порт Р1. Для керування індикацією використаємо порт Р0.
3.6. Розрахунок вихідного підсилювача
Амплітуда вихідної напруги складає 14В. На виході ЦАП при вхідному коді 255 та опорній напрузі 14В буде напруга 14В. Тому вихідне підсилення не потрібне.
3.7. Остаточна електрична принципова схема
При складанні електричної принципової схеми враховуючи усі схемні рішення вибрані у попередніх пунктах одержуємо схему зображену у додатку 2.
4. Розробка програмної частини
Програмна частина складається з головної програми ініціалізації та підпрограми обробки переривання від таймера-лічильника Т0.
4.1. Головна програма ініціалізації
В цій частині в РЗП заносяться початкові значення, задається режим роботи таймера-лічильника та заносяться початкові значення періоду переривань, а також задається дозвіл на переривання тільки від таймера.
4.2. Підпрограма обробки переривання
При переповненні таймера виникає переривання, яке викликає п.п. обробки переривання. В цій п.п. в ЦАП заноситься черговий відлік сигналу, переключається індикаторний пристрій та опитується стан клавіатури.
При реалізації підпрограми обробки нажаття першої клавіші застосовано алгоритм показаний на рис.3, для другої - рис.4.
Рис.3. Підпрограма обробки нажаття другої клавіші | Рис.4. Підпрограма обробки нажаття першої клавіші
4.4. Програма на мові асемблера
Згідно вище приведеного опису написано програму на мові асемблера для мікроконтролера Intel 8051. Лістинг програми приведений у додатку 3.
Після написання програми визначаємо, що в найгіршому випадку час виконання п.п. обробки переривання від таймера не перевищує 100 машинних циклів, тобто 100 мкс. Тому вибираємо цей час, як період дискретизації сигналу.
Враховуючи, що таймер в МК Intel 51 рахує машинні цикли шляхом інкрементування вираховуємо число, необхідне за забезпечення затримки в 50 мкс. Прийнятий час дискретизації займе 100 машинних циклів, тому для того, щоб за цей час відбулось переповнення необхідно в таймер занести число:
FFFF16 – 10010 = FFFF16 - 6416-= FF9716
Крім того необхідно врахувати час ініціалізації таймерів при кожному перериванні (4 цикли):
FF9716 – 416 = FF9316
Результат такої дискретизації показаний на мал.1
Для часу дискретизації 2Т та 4Т це значення буде відповідно рівне:
FFFF16 – 20010 – 416 = FFFF16 – С816-- 416 = FF3316
FFFF16 – 40010 - 416 = FFFF16 - 19016-– 416 = FE6B16
Призначення використаних регістрів:
R1 | Лічильник переривань для динамічної індикації
R2 | Попередній стан кнопок
R3 | Вибір індикатора
R4 | Віднімаючий лічильник відліків
R5 | Додаючий лічильник відліків
R6 | Амплітуда сигналу
R7 | Період сигналу
Для виведення інформації на індикатори числа необхідно перекодувати з двійкового коду в 7 – сегментний.
5. Висновки
В результаті виконання роботи розроблено принципову електричну схему та програму на мові асемблера функціонального генератора інфранизької частоти на базі мікроконтролера Intel 8051.
Через дискретність часових відліків похибка, котра зумовлює зміну періоду повторення сигналу становить не більше, як половину часу дискретизації. тобто 25 мкс, що відповідає 0.3 %.
За рахунок шумів квантування виникає похибка у визначенні амплітуди, але оскільки вона значно менша за похибку зумовлену аналоговою частиною схеми, то нею ми можемо знехтувати.
Таким чином можна стверджувати, що усі вимоги технічного завдання виконано.
Додаток1
Додаток 3. Лістинг програми
.SPACES ON
.LIST ON
.GLOBALS ON
.LLCHAR _
.DATA
.ORG 30H
T0_H DB 0FFh
T0_L DB 97h
Count DB 20
.CODE
.ORG 00H
AJMP Reset
; Пiдпрограма обробки переривань по таймеру T0 :
; Частота кварцевого резонатора - 24 МГц
; Перiод тактовоi частоти - 0,5 мксек
; Переривання вiдбуваються з частотою – 0,05 мсек
.ORG 0BH
IntT0: mov TH0, #<T0_H ;timer initialization
mov TL0, #<T0_L ;
mov A, #LOW(Signal) ;load data
add A, R5 ;
movp A, @A ;
mov B, R6 ;
div AB ;calculate Voltage
mov P2, A ;
inc R5 ;
djnz R4, Ind ;decrement counter
clr A ;
mov R5, A ;
mov R4, #<Count ;
Ind: djnz R1, kbd ; dinamic indication
mov R1, #80 ; Find = 500 Hz
mov A, R3 ;
mov P0, #00 ;
jz Ind_T ;
mov R3, #00 ;
mov A, R6 ;
call Decode ;convert binary to
mov P1, A ;7-segment
mov P0, #02 ;Out
jmp kbd ;
Ind_T: mov R3, #01 ;show T
mov A, R7 ;
call Decode ;convert binary to 7-segment code
mov P1, A ; Out
mov P0, #01 ;turn on indicator
kbd: mov A, P3 ;check keyboard
anl A, #00000011b ;mask
mov R1, A ;
xrl A, R2 ;
jz Exit2 ;no change
jb ACC.0, check_T ;key1 chenged
mov A, R2 ;
jb ACC.1, Exit3 ;
mov A, R6 ;
jb ACC.0, A1 ;
jb ACC.1, A2 ;
mov R6, #01 ;set A=A0
jmp End_a ;
A2: mov R6, #04 ;set A=A0/4
jmp End_a ;
A1: mov R6,#02 ;set A=A0/2
End_a: mov R5, #00 ;reset counter
mov R4, #<Count ;
jmp Exit2 ;
check_T:mov A, R2 ;
jb ACC.0, End_t ;
mov A, R7 ;
jb ACC.0, T1 ;
jb ACC.1, T2 ;
mov R7, #01 ;set T=1
mov <T0_H, #FFh ;set delay
mov <T0_L, #97h ;
jmp End_t ;
T2: mov R7, #04 ;set T=4
mov <T0_H, #FFh ;set delay
mov <T0_L, #33h ;
jmp End_t ;
T1: mov R7, #02 ;set T=2
mov <T0_H, #FEh ;set delay
mov <T0_L, #6Bh ;
End_t: mov R5, #00 ;reset counter
mov