1. ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ ДЛЯ ПЕРШОГО МК51:
CS EQU Р3.7
RD EQU Р3.6
CONVST EQU Р3.5; глобальне привласнення
MAXS EQU 18h
MAXM EQU 19h
----------------------------------------------------------------------------------------------------
ORG 0H
JMP 30H
ORG 03H; вектор переривання INT0
JMP KLAVA; перехід на підпрограму KLAVA
ORG 0BH; вектор переривання таймера 0
JMP TIME_0; перехід на підпрограму TIME_0
ORG 01BH; вектор переривання таймера 1
JMP TIME_1; перехід на підпрограму TIME_1
ORG 30h
----------------------------------------------------------------------------------------------------
MOV TMOD, #00010001B; задання режимів для таймерів-лічильників
MOV SCON, #10010000B; задання режиму UART
MOV IE, #00011011B; дозвіл переривань
MOV IP, #00000001B; виставлення пріоритетів
MOV TH0, #0F8H; установка 0-го лічильника
MOV TL0, #035H
MOV TH1, #0FCH; установка 1-го лічильника
MOV TL1, #01EH
SETB EA; дозвіл всіх переривань
SETB P3.4; установка 1 на 4-у піні порту Р3
MOV TCON, #00010000B; дозвіл 0-го лічильника
JMP $; зациклення
----------------------------------------------------------------------------------------------------
TIME_0:CLR P3.4; очистка 4-го піну порту Р3
MOV TCON, #01000000B; запуск таймера 1
RETI; повернення з підпрограми обробки перер.
----------------------------------------------------------------------------------------------------
TIME_1: SETB P3.4; установка 1 на 4-м піні порту Р3
MOV TH0, #0F8H; установка 0-го счётчика
MOV TL0, #035H
MOV TH1, #0FCH; установка 1-го лічильника
MOV TL1, #01EH
MOV TCON, #00010000B; запуск таймера 0
RETI; повернення з підпрограми обробки перер.
-----------------------------------------------------------------------------------------------------
KLAVA: CLR EA; зняття блокування переривань
MOV P2, #11111110B; завантаження в порт константи
JNB P2.4, M0; якщо 0 то перехід на мітку М0
JNB P2.5, M1; якщо 0 то перехід на мітку М1
JNB P2.6, M2
JNB P2.7, M3
CLR P2.1; очистка 1-го піну порту Р2
SETB P 2.0; установка 1 на 0-му піні порту Р2
JNB P2.4, M4; якщо 0 то перехід на мітку М4
JNB P2.5, M5
JNB P2.6, M6
JNB P2.7, M7
CLR P 2.2; очистка 2-го піну порту Р2
SETB P2.1; установка 1 на 1-м піні порту Р2
JNB P2.4, M8; якщо 0 то перехід на мітку М8
JNB P2.5, M9
JNB P2.6, MA
JNB P2.7, MB
CLR P 2.3; очистка 3-го піну порту Р2
SETB P 2.2; установка 1 на 2-м піні порту Р2
JNB P2.4, MC; якщо 0 то перехід на мітку МС
JNB P2.5, MD
MOV 20h, #0EH
JMP DRB
M0: MOV 20h, #0H; записування коду нажатої клавіші
JMP DRB; перехід на DRB
M1: MOV 20h, #1H
JMP DRB
M2: MOV 20h, #2H; записування коду нажатої клавіші
JMP DRB; перехід на DRB
M3: MOV 20h, #3H
JMP DRB
M4: MOV 20h, #4H; записування коду нажатої клавіші
JMP DRB; перехід на DRB
M5: MOV 20h, #5H
JMP DRB
M6: MOV 20h, #6H; записування коду нажатої клавіші
JMP DRB; перехід на DRB
M7: MOV 20h, #7H
JMP DRB
M8: MOV 20h, #8H; записування коду нажатої клавіші
JMP DRB; перехід на DRB
M9: MOV 20h, #9H
JMP DRB
MA: MOV 20h, #0AH; записування коду нажатої клавіші
JMP DRB; перехід на DRB
MB: MOV 20h, #0BH
JMP DRB
MC: MOV 20h, #0CH; записування коду нажатої клавіші
JMP DRB
MD: MOV 20h, #0DH
JMP DRB
DRB:; п-ма видалення брязкоту контактів
MOV R2, #5
MOV R1, #250
U_2: DJNZ R1, U_1
U_1: DJNZ R2, U_2
WORK:
MOV A, P2
CJNE A, #0F0H, WORK; порівняння. акум. з #0F0H та перехід
CALL ACP
SETB EA
RETI
----------------------------------------------------------------------------------------------------
ACP:
MOV R2, 20H
MOV R1, #21H
MOV R0, #22H
L7880:
CLR CONVST; імпульс старту перетворення
SETB CONVST
MOV R5, #19; затримка на час перетворення (20 мкс)
DJNZ R5, $
CLR CS; CS=0
CLR RD; RD=0
MOV A,P1; Читаємо з порту P1 мл. и сp. тетради
MOV R4,A; зберігаємо їх в R4
MOV A,P0; читаємо з порту Р3 старшу тетраду
MOV R5, A; в R4R5 - результат
SETB RD; Установка RD в 1
SETB CS; Установка CS в 1
MOV A, R4;
MOV @R1, A
MOV A, R5
MOV @R0, A
DJNZ R2, L7880; декремент R2 та п-хід якщо на L7880
CALL SCHET; виклик підпрограми SCHET
RET; повернення з підпрограми
----------------------------------------------------------------------------------------------------
SCHET:
MOV R2, 20H
MOV R1, #21H
MOV R0, #22H
MOV MAXM, @R0
MOV MAXS, @R1
MM3:
INC R0; збільшення на 1 R0
INC R0
INC R1; збільшення на 1 R1
INC R1
MOV A, @R1
MOV R4, A
MOV A, @R0
MOV R3, A
MOV A, MAXS; записування МАХS в акумулятор
CLR C; скидання переносу
CJNE A, R4, MM1; зрівн. ак. з R4 и пер. на ММ1 якщо
JC MM2
JMP MM6
MM2:
MOV MAXS, @R1
MOV MAXM, @R0
JMP MM6
MM1:
MOV A, MAXM
CLR C
CJNE A, R3, MM6; зрівн. ак. с R3 и пер. на ММ6 якщо
JC MM5; перехід на ММ5 якщо перенос = 1
JMP MM6
MM5:
MOV MAXS, @R1
MOV MAXM, @R0
MM6:
DJNZ R2, MM3
MOV R5, #0FFH
MOV SBUF, MAXS; записування в рег. посл. порту MAXS
DJNZ R5, $; затримка
DJNZ R5, $
MOV SBUF, MAXM; записування в рег. посл. порту MAXМ
RET
4. ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ ДЛЯ ДРУГОГО МК51:
AD00.EQU 20H
DATIND.EQU P1.0; до виводу DI
CLKIND.EQU P1.1; до виводу SK
---------------------------------------------------------------------------------------------------
ORG 0H
JMP 30H
ORG 0BH; вектор переривання таймера 0
JMP TIME_0
ORG 01BH; вектор переривання таймера 1
JMP TIME_1
ORG 23H
JMP UART
ORG 30H
---------------------------------------------------------------------------------------------------
MOV DPTR, #200H
MOVX A, @DPTR
MOV R0, A; молодший байт тривалості імпульсів
INC DPTR
MOVX A, @DPTR
MOV R1, A; старший байт тривалості імпульсів
INC DPTR
MOVX A, @DPTR
MOV R2, A; молодший байт періоду імпульсів
INC DPTR
MOVX A, @DPTR
MOV R3, A; старший байт періоду імпульсів
----------------------------------------------------------------------------------------------------
MOV TMOD, #00010001B; задання режимів для таймерів-лічильників
MOV SCON, #01010000B; задання режиму UART
MOV IE, #00011010B; дозвіл переривань
MOV TL0, R0
MOV TH0, R1
MOV TL1, R2
MOV TH1, R3
SETB EA; дозвіл головних переривань
SETB P3.4
MOV TCON, #00010000B; запуск 0-го лічильника
JMP $; зациклення
----------------------------------------------------------------------------------------------------
TIME_0:
CLR P3.4
MOV TCON, #01000000B; запуск 1-го лічильника
RETI; повернення з п-ми обробки переривань
----------------------------------------------------------------------------------------------------
TIME_1:
SETB P3.4
MOV TH0, R1
MOV TL0, R0
MOV TH1, R3
MOV TL1, R2
MOV TCON, #00010000B; запуск 0-го счётчика
RETI; повернення з п-ми обробки переривань
-----------------------------------------------------------------------------------------------------
UART:; приймання даних
CLR EA
PUSH R0; завантаження в стек R0
PUSH R1; завантаження в стек R1
PUSH R2; завантаження в стек R2
PUSН R3; завантаження в стек R3
MOV R2, #FFH
MOV A, SBUF
MOV R0, A; читаємо старший байт
DJNZ R2, $
DJNZ R2, $
MOV A, SBUF
MOV R1, A; читаємо младший байт
MOV DPTR, #20E
MOVX @DPTR, R0; записуємо в зовн. пам’ять дан. стар. байт
INC DPTR
MOVX @DPTR, R1; записуємо в зовн. пам’ять дан. мол. байт
-----------------------------------------------------------------------------------------------------
; Перетворюємо число в формат: тисячі, сотні, десятки, одиниці
; Визначаємо кількість тисяч
4_TISYACHI:
CLR C; скидання переносу
MOV A, R1
SUBB A, #0A0H; віднімання з А константи та зайому
MOV R2, A
MOV A, R0
SUBB A, #0FH; віднімання з А константи та зайому
MOV R3, A
JNC 3_TISYACHI; перехід на 3_TISYACHI якщо перенос = 0
MOV 20H, #4
JMP SOTNI; перехід на підпрограму SOTNI
3_TISYACHI:
CLR C; скидання переносу
MOV A, R1
SUBB A, #0B8H; віднімання від А константи та зайому
MOV R2,A; записування в R2
MOV A, R0; записування в А з R0
SUBB A, #0BH; віднімання від А константи та зайому
MOV R3, A
JNC 2_TISYACHI перехід на 2_TISYACHI якщо перенос = 0
MOV 20H, #3
JMP SOTNI
2_TISYACHI:
CLR C; скидання переносу
MOV A, R1
SUBB A, #0B0H
MOV R2, A
MOV A, R0
SUBB A, #07H
MOV R3, A
JNC 1_TISYACHI
MOV 20h, #2
MP SOTNI
1_TISYACHI:
CLR C; скидання переносу
MOV A, R1
SUBB A, #0E8H
MOV R2, A
MOV A, R0
SUBB A, #03H
MOV R3, A
MOV 20H, #1
JMP SOTNI
-----------------------------------------------------------------------------------------------------
; Визначаємо кількість сотень
SOTNI:
9_SOTNI:
CLR C; скидання переносу
MOV A,R2
SUBB A, #84H
MOV R1, A
MOV A, R3
SUBB A, #03H
MOV R0, A
JNC 8_SOTNI
MOV 21H, #9
JMP DESATKI
8_SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #20H
MOV R1, A
MOV A, R3
SUBB A, #03H
MOV R0, A
JNC 7_SOTNI
MOV 21H,#8
JMP DESATKI
7_SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #0BCH
MOV R1,A
MOV A, R3
SUBB A, #02H
MOV R0, A
JNC 6_ SOTNI
MOV 21H, #7
JMP DESATKI
6_ SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #58H
MOV R1, A
MOV A, R3
SUBB A, #02H
MOV R0, A
JNC 5_SOTNI
MOV 21H, #6
JMP DESATKI
5_SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #0F4H
MOV R1, A
MOV A, R3
SUBB A, #01h
MOV R0, A
JNC 4_SOTNI
MOV 21H, #5
JMP DESATKI
4_SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #90H
MOV R1, A
MOV A, R3
SUBB A, #01H
MOV R0, A
JNC 8_SOTNI
MOV 21H, #4
JMP DESATKI
3_SOTNI:
CLR C; скидання переносу
MOV A, R2
SUBB A, #2CH
MOV R1, A
MOV A, R3
SUBB A, #01H
MOV R0, A
JNC 2_SOTNI
MOV 21H, #3
JMP DESATKI
2_SOTNI:
CLR C; скидання переносу
MOV A, R3
SUBB A, #0C8H
MOV R0, A
JNC 1_SOTNI
MOV 21H, #2
JMP DESATKI
1_SOTNI:
CLR C; скидання переносу
MOV A, R3
SUBB A, #64H
MOV R0, A
MOV 21H, #1
JMP DESATKI
-----------------------------------------------------------------------------------------------------
; Визначаємо кількість десятків
DESATKI:
9_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #5AH
MOV R3, A
JNC 8_DESATKI
MOV 22H, #9
JMP EDINITSA
8_DESATKI:
CLR C
MOV A, R0
SUBB A, #50H
MOV R3, A
JNC 7_DESATKI
MOV 22H, #8
JMP EDINITSA
7_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #46H
MOV R3, A
JNC 6_DESATKI
MOV 22H, #7
JMP EDINITSA
6_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #3CH
MOV R3, A
JNC 5_DESATKI
MOV 22H, #6
JMP EDINITSA
5_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #32H
MOV R3, A
JNC 4_DESATKI
MOV 22H, #5
JMP EDINITSA
4_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #28H
MOV R3, A
JNC 3_DESATKI
MOV 22H, #4
JMP EDINITSA
3_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #1EH
MOV R3, A
JNC 2_DESATKI
MOV 22H, #3
JMP EDINITSA
2_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #14H
MOV R3, A
JNC 1_DESATKI
MOV 22H, #2
JMP EDINITSA
1_DESATKI:
CLR C; скидання переносу
MOV A, R0
SUBB A, #0AH
MOV R3, A
MOV 22H, #1
JMP EDINITSA
; Визначаємо кількість одиниць
EDINITSA:
9_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #9H
JNC 8_EDINITSA; перехід якщо перенос = 0
MOV 23H, #9
JMP INDVIV
8_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #8H
JNC 7_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #8
JMP INDVIV
7_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #7h
JNC 6_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #7
JMP INDVIV
6_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #6H
JNC 5_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #6
JMP INDVIV
5_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #5H
JNC 4_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #5
JMP INDVIV
4_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #4H
JNC 3_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #4
JMP INDVIV
3_EDINITSA:
CLR C; скидання переносу
MOV A, R3
SUBB A, #3H
JNC 2_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #4
JMP INDVIV
2_EDINITSA:
CLR C
MOV A, R3
SUBB A, #2h
JNC 1_EDINITSA; перехід на EDINITSA, якщо перенос = 0
MOV 23H, #2
JMP INDVIV
1_EDINITSA:
CLR C
MOV A, R3
SUBB A, #1H
MOV 23H, #1
-----------------------------------------------------------------------------------------------------
; Вивід на індикатор
INDVIV:
MOV A, AD00+7; старший розряд
CALL SIMBOL1; другого числа
MOV A, AD00+6
CALL SIMBOL1
MOV A, AD00+5
CALL SIMBOL1
MOV A, AD00+4; молодший розряд
CALL SIMBOL1
MOV A, #0FH; код пропуску
CALL SIMBOL1
MOV A, #0FH
CALL SIMBOL1
MOV A, #0FH
CALL SIMBOL1
MOV A, #0FH
CALL SIMBOL1
MOV A, #0FH
CALL SIMBOL1
MOV A, #0FH
CALL SIMBOL1
SETB DATIND
POP R3; діставання з стеку
POP R2
POP R1
POP R0
SETB EA
RETI
SIMBOL1:
ANL A, #0000011111B; логічне “ І ” акум. і константи
CJNE A, #0, SIMB11
MOV A, #10
SJMP SIMB12
SIMB11:
CJNE A, #0FH,SIMB12
MOV A, #0
SIMB12:
CLR CLKIND
SWAP A
CALL BIT1
CALL BIT1
CALL BIT1
CALL BIT1
SETB CLKIND
RETI
BIT1:
RLC A
MOV DATIND, C; ввід даних в РК-дисплей
SETB CLKIND; імпульс
CLR CLKIND; защипування
SETB EA; дозвіл головного переривання
RETI; повернення з п-мы обробки переривань
END
5. Висновки
В результаті виконання розрахунково-графічної роботи була розроблена мікропроцесорна система, до складу якої увійшли два мікроконтролери К1816ВЕ51, клавіатура з 15 кнопок, 12-розрядний паралельний аналого-цифрового перетворювач AD7880 фірми Analog Devices, рідкокристаличний індикатор на основі контролера НТ1611 фірми HOLTEK, зовнішній постійний запам'ятовувальний пристрій 27С128, ємністю 16КБ, зовнішній оперативний запам'ятовувальний пристрій типу КР537РУ10, ємністю 2КБ
Написана програма, яка дозволяє усім компонентам системи працювати згідно з завданням.
В ході виконання цього курсового проекту були практично використані знання, отримані на лекційних і лабораторних заняттях з курсу “Цифрові пристрої та мікропроцесори”
Загалом, розроблена мікропроцесорна система являє собою функціонально закінчений пристрій і відповідає вимогам технічного завдання №15 на розрахунково-графічную роботу.
Література
1. Цевух I.В. Конспект лекцій, 2008г.
2. Сташин В.В. Проектирование цифровых устройств на однокристальных микроконтроллерах – М.: Энергоатомиздат, 1990.
3. А.В. Фрунзе, Микроконтроллеры? Это же просто! Т.1.- М.: ООО «ИД СКИМЕН», 2002г.
Навчальне видання