Автор работы: Пользователь скрыл имя, 30 Августа 2011 в 19:40, курсовая работа
Данный курсовой проект разрабатывается на основе микроконтроллера КР1816ВЕ31. Микросхемы КР1816ВЕ51, КМ1816ВЕ51, КР1816ВЕ31 являются наиболее производительными из выпускаемых отечественной промышленностью 8-разрядных однокристальных микро ЭВМ (ОЭВМ). ОЭВМ обладают встроенной памятью данных пользователя размером 128 байт, часть которой отводится под четыре банка рабочих регистров, причем каждый банк объединяет в себе восемь регистров. Во встроенной памяти данных имеется область 128 бит прямого доступа.
Введение 5
1. Выбор структуры построения проектируемой системы 7
2. Функциональная схема 9
3. Принципиальная схема 10
4. Алгоритмическое обеспечение 14
5. Программное обеспечение.. 15
6. Расчет потребляемой мощности 16
Заключение 17
Литература. 18
Приложение
Код
программы на Ассемблер.
Таблица векторов. | ||
0000h | LJMP START | Переход на метку основной программы |
0003h | LJMP INT0 | Переход на метку программы обработки прерываний по INT0 |
0013h | LJMP INT1 | Переход на метку программы обработки прерываний по INT1 |
Основная программа | ||
START: | MOV PSW, #00h | Выбор нулевого банка РОН |
MOV R0, #64h | Значение температуры по умолчанию 100, если пользователь нажал ПУСК не выбрав значение температуры | |
MOV DPTR, 9800#h | Выбор ККД. | |
MOV A, #0D3h | Команда сброс | |
MOVX @DPTR, A | ||
NOP | Задержка | |
NOP | ||
NOP | ||
MOV A, #01h | Установка режима ККД, вывод слева-направо, 8 символов, ввод информации с клавиатуры обнаружением двухклавишных сцеплений, дешифрированное сканирование | |
MOVX @DPTR, A | ||
DOOR: | JNB P1.4, START | Если дверь не закрыта, то переходим на метку DOOR |
MOV IE, #81 | Прерывания по INT0 разрешены, по INT1 запрещены | |
SPUSK: | JB P1.5, PUSK | Если пуск нажат то переходим на метку PUSK |
AJMP SPUSK | ||
PUSK: | MOV IE, #00 | Запрет прерываний |
MOV DPTR, #0000h | Сохранение данных из буфера 1 | |
MOVX A,@DPTR | ||
MOV R5, A | ||
MOV DPTR, #0800h | Сохранение данных из буфера 2 | |
MOVX A,@DPTR | ||
MOV R6, A | ||
MOV DPTR, #1000h | Сохранение данных из буфера 3 | |
MOVX A,@DPTR | ||
MOV R7, A | ||
MOV R1, #00h | Обнуление регистров | |
MOV R2, #02h | ||
MOV R3, #00h | ||
MOV R4, #00h | ||
JNB R6.0, TIME0,5 | Определение значения времени | |
JNB R6.1, TIME1 | ||
JNB R6.2, TIME1,5 | ||
JNB R6.3, TIME2 | ||
JNB R6.4, TIME3 | ||
JNB R6.5, TIME4 | ||
JNB R6.6, TIME5 | ||
JNB R6.7, TIME7 | ||
JNB R7.0, TIME10 | ||
JNB R7.1, TIME15 | ||
JNB R7.2, TIME20 | ||
JNB R7.3, TIME25 | ||
JNB R7.4, TIME30 | ||
JNB R7.5, TIME40 | ||
JNB R7.6, TIME50 | ||
JNB R7.7, TIME60 | ||
JNB R5.5, TIME70 | ||
JNB R5.6, TIME80 | ||
JNB R5.7, TIME90 | ||
TIME0,5: | MOV PSW, #10h | |
MOV R3, #03h | Сохранение значения времени в регистры R1,R2,R3,R4 второго банка РОН | |
AJMP S1 | ||
TIME1: | MOV PSW, #10h | |
MOV R2, #01h | ||
AJMP S1 | ||
TIME1,5: | MOV PSW, #10h | |
MOV R2, #01h | ||
MOV R3, #03h | ||
AJMP S1 | ||
TIME2: | MOV PSW, #10h | |
MOV R2, #02h | ||
AJMP S1 | ||
TIME3: | MOV PSW, #10h | |
MOV R2, #03h | ||
AJMP S1 | ||
TIME4: | MOV PSW, #10h | |
MOV R2, #04h | ||
AJMP S1 | ||
TIME5: | MOV PSW, #10h | |
MOV R2, #05h | ||
AJMP S1 | ||
TIME7: | MOV PSW, #10h | |
MOV R2, #07h | ||
AJMP S1 | ||
TIME10: | MOV PSW, #10h | |
MOV R1, #01h | ||
AJMP S1 | ||
TIME15: | MOV PSW, #10h | |
MOV R1, #01h | ||
MOV R2, #05h | ||
AJMP S1 | ||
TIME20: | MOV PSW, #10h | |
MOV R1, #02h | ||
AJMP S1 | ||
TIME25: | MOV PSW, #10h | |
MOV R1, #02h | ||
MOV R2, #05h | ||
AJMP S1 | ||
TIME30: | MOV PSW, #10h | |
MOV R1, #03h | ||
AJMP S1 | ||
TIME40: | MOV PSW, #10h | |
MOV R1, #04h | ||
AJMP S1 | ||
TIME50: | MOV PSW, #10h | |
MOV R1, #05h | ||
AJMP S1 | ||
TIME60: | MOV PSW, #10h | |
MOV R1, #06h | ||
AJMP S1 | ||
TIME70: | MOV PSW, #10h | |
MOV R1, #07h | ||
AJMP S1 | ||
TIME80 | MOV PSW, #10h | |
MOV R1, #08h | ||
AJMP S1 | ||
TIME90 | MOV PSW, #10h | |
MOV R1, #09h | ||
MOV PSW, #00h | Выбор нулевого банка РОН | |
S1: | JNB R5.0, POWER240 | Определение значения мощности |
JNB R5.1, POWER350 | ||
JNB R5.2, POWER540 | ||
JNB R5.3, POWER720 | ||
JNB R5.4, POWER900 | ||
POWER240: | MOV R5,#18 | Сохранение значения мощности в регистр R5 |
AJMP S2 | ||
POWER350: | MOV R5,#23 | |
AJMP S2 | ||
POWER540: | MOV R5,#36 | |
AJMP S2 | ||
POWER720: | MOV R5,#48 | |
AJMP S2 | ||
POWER900: | MOV R5,#5A | |
S2: | MOV DPTR, 2000#h | Выбор интервального таймера |
MOV A, #34h | Управляющее слово для нулевого канала | |
MOVX @DPTR, A | Отправка управляющего слова. | |
MOV A, #54h | Управляющее слово для первого канала | |
MOVX @DPTR, A | Отправка управляющего слова. | |
MOVX DPTR, #2300h | Запись коэффициента пересчета для канала 0 | |
MOV A, #40h | 9C40h -> 40 000 | |
MOVX @DPTR, A | ||
MOV A, #9Ch | ||
MOVX @DPTR, A | ||
MOVX DPTR, #2100h | Запись коэффициента пересчета для канала 1 | |
MOV A, #05h | 05h -> 5 | |
MOVX @DPTR, A | ||
IT: | SETB P1.3 | Запуск таймера |
MOVX DPTR, #3000h | Отправка мощности на ЦАП | |
MOV A, R5 | ||
MOVX @DPTR, A | ||
MOV IE, #84 | Прерывания по INT1 разрешены | |
MOVX DPTR,2800h | Определение текущего значения температуры. | |
MOVX A, DPTR | ||
F0: | JB P1.0, F1 | Ожидание преобразования. |
AJMP F0 | ||
F1: | SUBB A,R0 | Сравнение текущего значения с требуемым |
JZ OFF | ||
SETB P1.6 | Включение нагревателя | |
AJMP DOOR2 | ||
OFF: | CLP P1.6 | Выключение нагревателя |
DOOR2: | JB P1.4, IT | Если дверь закрыта то переходим на метку IT |
MOV IE, #00 | Запрет прерываний | |
CLP P1.3 | Запрещение работы каналов таймера | |
CLP P1.6 | Выключение нагревателя | |
AJMP DOOR2 | ||
Программа обработки прерываний по INT0. | ||
INT0: | PUSH A | |
PUSH PSW | ||
PUSH DPL | ||
PUSH DPH | ||
MOV PSW, #00h | Выбор нулевого банка РОН | |
MOV DPTR, 9800#h | Выбор ККД. | |
MOV PSW, #00h | Выбор нулевого банка РОН, в нем будут производиться действия по обработке клавиатуры. | |
MOV A, #50h | Отправляем в ККД слово, по которому ККД выдаст код нажатой клавиши | |
MOVX @DPTR, A | Отправление слова в ККД | |
MOV R0, A | Запись кода нажатой клавиши в регистр R0 | |
MOV A, #0FFh | Проверка для кнопки «100» | |
ANL A, R0 | ||
JZ L1 | Прыгаем в метку «L1» если кнопка “100” была нажата. | |
MOV A, #0FEh | Проверка для кнопки «120» | |
ANL A, R0 | ||
JZ L2 | Прыгаем в метку «L2» если кнопка “120” была нажата. | |
MOV A, #0FDh | Проверка для кнопки «140» | |
ANL A, R0 | ||
JZ L3 | Прыгаем в метку «L3» если кнопка “140” была нажата. | |
MOV A, #0FCh | Проверка для кнопки «160» | |
ANL A, R0 | ||
JZ L4 | Прыгаем в метку «L4» если кнопка “160” была нажата. | |
MOV A, #0FBh | Проверка для кнопки «180» | |
ANL A, R0 | ||
JZ L5 | Прыгаем в метку «L5» если кнопка “180” была нажата. | |
MOV A, #0FAh | Проверка для кнопки «200» | |
ANL A, R0 | ||
JZ L6 | Прыгаем в метку «L6» если кнопка “200” была нажата. | |
MOV A, #0F9h | Проверка для кнопки «220» | |
ANL A, R0 | ||
JZ L7 | Прыгаем в метку «L7» если кнопка “220” была нажата. | |
MOV A, #0F8h | Проверка для кнопки «250» | |
ANL A, R0 | ||
JZ L8 | Прыгаем в метку «L8» если кнопка “250” была нажата. | |
L1: | MOV R0, #64h | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L2: | MOV R0, #78h | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L3: | MOV R0, #8Сh | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L4: | MOV R0, #0A0h | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L5: | MOV R0, #0B4h | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L6: | MOV R0, #0C8h | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L7: | MOV R0, #0DCh | В R0 сохраняем значение нажатой клавиши. |
AJMP EXIT | ||
L8: | MOV R0, #0FAh | В R0 сохраняем значение нажатой клавиши. |
EXIT: | POP DPH | |
POP DPL | ||
POP PSW | ||
POP A |
Программа обработки прерываний по INT1.
INT1: | PUSH A | Сохранение контекста основной программы |
PUSH PSW | ||
PUSH DPL | ||
PUSH DPH | ||
MOV PSW, #10h | Выбор второго банка РОН | |
MOV A,R4 | Если секунда = 0, то переходим на метку SEC | |
JZ SEC | ||
DEC R4 | Декремент секунд. | |
AJMP SHOWTIME | Переход на метку отображения | |
SEC: | MOV R4,#09h | Секунда = 9 |
MOV A,R4 | Если десяток секунды = 0, то переходим на метку MIN | |
JZ MIN | ||
DEC R3 | Декремент десятка секунд. | |
AJMP SHOWTIME | Переход на метку отображения | |
MIN: | MOV R3,#09h | десятки секунд= 5 |
MOV A,R2 | Если минуты = 0, то переходим на метку DMIN | |
JZ DMIN | ||
DEC R2 | Декремент минут. | |
AJMP SHOWTIME | Переход на метку отображения | |
DMIN: | MOV R3,#09h | минуты= 9 |
MOV A,R1 | Если десяток минуты 0, то переходим на метку STOP. | |
JZ STOP | ||
DEC R1 | Декремент десятка секунд. | |
AJMP SHOWTIME | Переход на метку отображения | |
STOP: | SETB P1.7 | Программная установка кнопки СТОП |
AJMP START | Переход в начало программы. | |
SHOW: | MOV 31H, R1 | Сохраняем содержимое регистра по адресу 31H |
ACALL KOD | Вызываем подпрограмму определения кода цифр для вывода на дисплей | |
MOV R0, 32H | В регистр R0 сохраняем код цифры. | |
MOV 31H, R2 | Сохраняем содержимое регистра по адресу 31H | |
ACALL KOD | Вызываем подпрограмму определения кода цифр для вывода на дисплей | |
MOV R5, 32H | В регистр R5 сохраняем код цифры. | |
MOV 31H, R3 | Сохраняем содержимое регистра по адресу 31H | |
ACALL KOD | Вызываем подпрограмму определения кода цифр для вывода на дисплей | |
MOV R6, 32H | В регистр R6 сохраняем код цифры. | |
MOV 31H, R4 | Сохраняем содержимое регистра по адресу 31H | |
ACALL KOD | Вызываем подпрограмму определения кода цифр для вывода на дисплей | |
MOV R7, 32H | В регистр R7 сохраняем код цифры. | |
MOV DPTR, 9800#h | Выбор ККД. | |
MOV A, #90h | Третье слово ККД, для вывода на дисплей. | |
MOVX @DPTR, A | Отправляем третье слово в ККД | |
MOV DPTR, 1800#h | ||
MOV A,R1 | Загрузка данных для отображения в аккумулятор. | |
MOVX @DPTR, A | Отправка в ККД данных. | |
MOV A,R5 | Загрузка данных для отображения в аккумулятор. | |
MOVX @DPTR, A | Отправка в ККД данных. | |
MOV A,R6 | Загрузка данных для отображения в аккумулятор. | |
MOVX @DPTR, A | Отправка в ККД данных. | |
MOV A,R7 | Загрузка данных для отображения в аккумулятор. | |
MOVX @DPTR, A | Отправка в ККД данных. | |
MOV PSW, #00h | Выбор нулевого банка РОН | |
POP DPH | ||
POP DPL | ||
POP PSW | ||
POP A | ||
RETI | Возврат из подпрограммы аппаратных прерываний. | |
Подпрограмма определения кода для вывода на дисплей. | ||
КOD: | ||
MOV A, #00h | Сравниваем значение хранящееся по адресу 31H с "0" | |
XRL A, 31H | ||
JNZ K1 | Если значение не равно "0", то переходим на метку К1 | |
MOV 32H, #00h | Сохраняем код цифры 0 для вывода на дисплей по адресу 32H | |
K1: | RET | Возвращаемся в
программу обработки |
MOV A, #01h | Сравниваем значение хранящееся по адресу 31H с "1" | |
XRL A, 31H | ||
JNZ K2 | Если значение не равно "1", то переходим на метку К2 | |
MOV 32H, #06h | Сохраняем код цифры 1 для вывода на дисплей по адресу 32H | |
К2: | RET | Возвращаемся в
программу обработки |
MOV A, #02h | Сравниваем значение хранящееся по адресу 31H с "2" | |
XRL A, 31H | ||
JNZ K3 | Если значение не равно "2", то переходим на метку К3 | |
MOV 32H, #5Bh | Сохраняем код цифры 2 для вывода на дисплей по адресу 32H | |
К3: | RET | Возвращаемся в
программу обработки |
MOV A, #03h | Сравниваем значение хранящееся по адресу 31H с "3" | |
XRL A, 31H | ||
JNZ K4 | Если значение не равно "3", то переходим на метку К4 | |
MOV 32H, #4Fh | Сохраняем код цифры 3 для вывода на дисплей по адресу 32H | |
К4: | RET | Возвращаемся в
программу обработки |
MOV A, #04h | Сравниваем значение хранящееся по адресу 31H с "4" | |
XRL A, 31H | ||
JNZ K5 | Если значение не равно "4", то переходим на метку К5 | |
MOV 32H, #66h | Сохраняем код цифры 4 для вывода на дисплей по адресу 32H | |
К5: | RET | Возвращаемся в
программу обработки |
MOV A, #05h | Сравниваем значение хранящееся по адресу 31H с "5" | |
XRL A, 31H | ||
JNZ K6 | Если значение не равно "5", то переходим на метку К6 | |
MOV 32H, #6Dh | Сохраняем код цифры 5 для вывода на дисплей по адресу 32H | |
К6: | RET | Возвращаемся в
программу обработки |
MOV A, #06h | Сравниваем значение хранящееся по адресу 31H с "6" | |
XRL A, 31H | ||
JNZ K7 | Если значение не равно "6", то переходим на метку К7 | |
MOV 32H, #7Ch | Сохраняем код цифры 6 для вывода на дисплей по адресу 32H | |
К7: | RET | Возвращаемся в
программу обработки |
MOV A, #07h | Сравниваем значение хранящееся по адресу 31H с "7" | |
XRL A, 31H | ||
JNZ K8 | Если значение не равно "7", то переходим на метку К8 | |
MOV 32H, #07h | Сохраняем код цифры 7 для вывода на дисплей по адресу 32H | |
К8: | RET | Возвращаемся в
программу обработки |
MOV A, #08h | Сравниваем значение хранящееся по адресу 31H с "8" | |
XRL A, 31H | ||
JNZ K9 | Если значение не равно "8", то переходим на метку К9 | |
MOV 32H, #7Fh | Сохраняем код цифры 8 для вывода на дисплей по адресу 32H | |
К9: | RET | Возвращаемся в
программу обработки |
MOV 32H, #67h | Сохраняем код цифры 9 для вывода на дисплей по адресу 32H | |
RET | Возвращаемся в
программу обработки |
Информация о работе Контроллер микроволновой печи на МК К1816ВЕ31