Автор работы: Пользователь скрыл имя, 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