4. Разработка алгоритма
Алгоритм работы электронных весов должен быть следующим:
Подготовка АЦП – настройка АЦП (номер канала AN1..AN7, режим работы: стандартный или точный, прерывания), старт преобразования.
Считывание данных с АЦП. Преобразованное число хранится в регистрах ADDH и ADDL (старший и младший байты соответственно)
Преобразование кода младшего разряда в код семисегментного индикатора. Так как по техническому заданию необходимо обеспечить точность 0,5 кг., младший разряд (десятые) будет принимать значения “0” или “5”. Код, который нужно преобразовать находится в двух младших разрядах ADDL.
Вывод младшего разряда. Выводим преобразованное число на порт P3, т.е. на -1-й разряд индикатора.
Преобразование кода остальных разрядов в двоично-десятичный код. То есть преобразование двоичного восьмиразрядного числа в двоично-десятичное (число, в котором каждая десятичная цифра представлена четырьмя битами).
Преобразование кода остальных разрядов в код семисегментного индикатора. Каждая цифра двоично-десятичного должна быть представлена семиразрядным эквивалентом, для последующего вывода на индикатор.
Вывод остальных разрядов. Вывод 2-го, 1-го и 0-го разрядов на индикатор.
Переход на пункт 4.2 и повторение алгоритма.
Блок-схема алгоритма имеет следующий вид:
Рис. 12. Блок-схема алгоритма
5. Построение программы
Настройка АЦП заключается в записи данных в соответствующие регистры (согласно [11]). Регистр ADCF (конфигурация АЦП):
Табл. 4. Регистр ADCF
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
CH7 | CH6 | CH5 | CH4 | CH3 | CH2 | CH1 | СH0 |
Номер бита | Название бита | Описание | |||||
7-0 | CH 0:7 | При установленном бите P1.x используется в качестве входа АЦП, при сброшенном бите P1.x используется в качестве стандартного порта ввода/вывода. |
В данном регистре установим бит 7, т.к. будем использовать P1.7 в качестве входа АЦП.
Регистр IEN0 (регистр прерываний):
Табл.5 Регистр IEN0
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EA | EC | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
Номер бита | Название бита | Описание | |||||
7 | EA | Разрешение всех прерываний | |||||
6 | EC | Разрешение прерывания от PCA | |||||
5 | ET2 | Разрешение прерывания от таймера 2 | |||||
4 | ES | Разрешение прерывания от UART | |||||
3 | ET1 | Разрешение прерывания от таймера 1 | |||||
2 | EX1 | Разрешение внешнего прерывания INT1 | |||||
1 | ET0 | Разрешение прерывания от таймера 2 | |||||
0 | EX0 | Разрешение внешнего прерывания INT2 |
В данном регистре установим бит 7, разрешив этим самым все прерывания.
Регистр IEN1 (регистр прерываний):
Табл.6 Регистр IEN1
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | - | - | - | - | - | EADC | - |
Номер бита | Название бита | Описание | |||||
7-2 | - | Зарезервировано. Эти биты нельзя устанавливать | |||||
1 | EADC | Разрешение прерывания от АЦП | |||||
0 | - | Зарезервировано. Этот бит нельзя устанавливать |
В данном регистре установим бит 1, разрешив этим самым прерывание от АЦП.
Регистр ADCON (регистр управления АЦП):
Табл.6 Регистр ADCON
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | PSIDLE | ADEN | ADEOC | ADSST | SCH2 | SCH1 | SCH0 |
Номер бита | Название бита | Описание | |||||
6 | PSIDLE | Режим псевдо холостого хода | |||||
5 | ADEN | Включение АЦП | |||||
4 | ADEOC | Преобразование завершено | |||||
3 | ADSST | Старт преобразования | |||||
2 | SCH2 | Выбор аналогового входа | |||||
1 | SCH1 | ||||||
0 | SCH0 |
В данном регистре будем задавать 7-й аналоговый вход (SCH2=”1”, SCH1=”1”, SCH0=”1”). Далее нужно перевести контроллер в режим псевдо холостого хода PSIDLE=”1”(это необходимо для более точного преобразования, уменьшаются шумы) и начать преобразование ADSST=”1”.
После завершения преобразования сработает прерывание от АЦП и контроллер выйдет из режима холостого хода, и нужно будет переписать преобразованное число из регистров ADDH и ADDL в регистры R2 и R1.
Теперь необходимо преобразовать -1-й разряд числа в семисегментный код и вывести на P3 (-1-й разряд хранится в двух младших битах младшего байта числа)
Табл. 7. Таблица преобразования -1-го разряда.
Двоичный код | Семисегментный код |
00 | 01101101 (5) |
01 | 01101101 (5) |
10 | 01111110 (0) |
11 | 01111110 (0) |
Необходимо сдвинуть 2 старших разряда числа (находящихся в R2) в R1, а два младших разряда убрать, т.к. они уже выведены на индикатор. Это можно сделать два раза сдвинув вправо через флаг переноса регистры R2 и R1, т.к. операцию сдвига можно осуществлять только над аккумулятором, предварительно запишем в него содержимое регистров R2 и R1. Весь алгоритм будет выглядеть следующим образом:
Записать содержимое R2 в аккумулятор,
Сдвинуть аккумулятор на один бит вправо,
Записать содержимое аккумулятора в R2,
Записать содержимое R1 в аккумулятор,
Сдвинуть аккумулятор на один бит вправо,
Записать содержимое аккумулятора в R1,
Записать содержимое R2 в аккумулятор,
Сдвинуть аккумулятор на один бит вправо,
Записать содержимое аккумулятора в R2,
Записать содержимое R1 в аккумулятор,
Сдвинуть аккумулятор на один бит вправо,
Записать содержимое аккумулятора в R1;
Теперь необходимо преобразовать код остальных разрядов в двоично-десятичный код, что согласно [12] делается следующим образом:
Делим исходное число на 10, остатком от деления будет двоично-десятичный код 0-го разряда.
Результат деления снова делим на 10, остатком от деления будет двоично-десятичный код 1-го разряда.
Результат деления снова делим на 10, остатком от деления будет двоично-десятичный код 2-го разряда.
Двоично-десятичный код запомним в регистрах R4, R3, R2, теперь его нужно преобразовать в код семисегментного индикатора, для этого будем использовать подпрограмму PR, предварительно записав преобразуемое число в стек, после вызова PR в стеке будет содержаться уже преобразованное число. Преобразование будет осуществляться методом простого перебора всех вариантов.
Табл. 8. Таблица преобразования в семисегментный код
Десятичный код | Двоично-десятичный код | Код семисегментного индикатора |
0 | 0000 | 01111110 |
1 | 0001 | 00000110 |
2 | 0010 | 01011011 |
3 | 0011 | 01001111 |
4 | 0100 | 01100110 |
5 | 0101 | 01101101 |
6 | 0110 | 01111101 |
7 | 0111 | 00000111 |
8 | 1000 | 01111111 |
9 | 1001 | 01101111 |
После вызова подпрограммы PR, считываем данные из стека и выводим их на соответствующий порт, также необходимо вывести десятичную точку P2.7.
Заключение
В результате проделанной работы были разработаны электронные весы с диапазоном измерения от 0 до 250 килограмм, с точностью измерения 500 грамм, с микропроцессорным управлением. Точность измерения не зависит от положения объекта на весах. Габаритные размеры весов 5000x5000 мм. Электронные весы работают от источника напряжения 5 В. Потребляемая мощность – 1,05 Вт. Потребляемый ток – 210 мА
Список использованных источников
1 www.gaw.ru/html/cgi/txt/pub/sensor/index.html
2 dmp330h.pdf – Техническая документация к датчику давления DMP330H.
3 dmp331.pdf – Техническая документация к датчику давления DMP331.
dmp341.pdf – Техническая документация к датчику давления DMP341.
dps100.pdf – Техническая документация к датчику давления DPS100.
6 sub.chipdoc.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
7 www.powerlight.ru
8 de119.pdf – Техническая документация к ЖК-индикатору DE-119
9 mcs51.pdf – Техническая документация к микроконтроллерам серии MCS-51.
10 www.atmel.com
11 doc4127.pdf – Техническая документация к микроконтроллеру AT89C5AC2
12 А.В.Фрунзе, А.А.Фрунзе. Микроконтроллеры? Это же просто!, ООО “ИД СКИМЕН”, 2003г.
Приложение
Текст программы
MOV ADCF, #1000000B; 7 канал – АЦП, остальные – порт
SETB IEN0.7; Разрешение прерываний
SETB IEN1.1; Разрешение прерывания от АЦП
BEGIN: ANL ADCON, #11111000B; Сброс канала
ORL ADCON, #00000111B; Задание 7-го канала АЦП (P1.7)
ORL ADCON,#01001000B; Перевод контроллера в режим pseudo-idle и
; начало преобразования
MOV R1, ADDL; Запись в R1 младшего байта АЦП
ANL R1, #02H; Сброс всех битов R1, кроме 0-го и 1-го
MOV R0, ADDL; Запись в R0 младшего байта АЦП
MOV R2, ADDH; Запись в R2 старшего байта АЦП
MOV A, R2; Запись R2 в аккумулятор
RRC A; Сдвиг аккумулятора на один бит вправо
MOV R2, A; Запись аккумулятора в R2
MOV A, R0; Запись R0 в аккумулятор
RRC A; Сдвиг аккумулятора на один бит вправо
MOV R0, A; Запись аккумулятора в R0
MOV A, R2; Запись R2 в аккумулятор
RRC A; Сдвиг аккумулятора на один бит вправо
MOV R2, A; Запись аккумулятора в R2
MOV A, R0; Запись R0 в аккумулятор
RRC A; Сдвиг аккумулятора на один бит вправо
MOV R0, A; Запись аккумулятора в R0
MOV A, R1; Запись R1 в аккумулятор
SUBB A, #11B;
JZ ML5; Переход, если R1 = #11B
MOV A, R1; Запись R1 в аккумулятор
SUBB A, #10B;
JZ ML5; Переход, если R1 = #10B
MOV A, R1; Запись R1 в аккумулятор
SUBB A, #01B;
JZ ML0; Переход, если R1 = #01B
MOV A, R1; Запись R1 в аккумулятор
SUBB A, #00B;
JZ ML0; Переход, если R1 = #00B
ML0: MOV P3, #01111110B; Вывод “0” в младший разряд индикатора
SJMP NEXT;
ML5: MOV P3, #01101101B; Вывод “5” в младший разряд индикатора
NEXT: MOV A, R0; Запись R0 в аккумулятор
MOV B, #10; Запись #10 в B
DIV AB; Деление аккумулятора на B
MOV R2, B; Запись B в R2 (единицы)
MOV B, #10; Запись #10 в B
DIV AB; Деление аккумулятора на B
MOV R3, B; Запись B в R3 (десятки)
MOV B, #10; Запись #10 в B
DIV AB; Деление аккумулятора на B
MOV R4, B; Запись B в R4 (сотни)
PUSH R2; Запись R2 в стек
LCALL PR; Вызов подпрограммы преобразования числа
POP P2; Вывод на индикатор 0-го разряда (единицы)
SETB P2.7; Вывод на индикатор десятичной точки
PUSH R3; Запись R3 в стек
LCALL PR; Вызов подпрограммы преобразования числа
POP P1; Вывод на индикатор 1-го разряда (десятки)
PUSH R4; Запись R4 в стек
LCALL PR; Вызов подпрограммы преобразования числа
POP P0; Вывод на индикатор 2-го разряда (сотни)
SJMP BEGIN; Переход на начало
PR: ;Подпрограмма преобразования двоично-десятичного числа в число с кодом
;семисегментного индикатора
POP R5; Запись в R5 содержимого стека
MOV A, R5;
SUBB A, #0;
JZ SEG0; Переход на SEG0, если R5 = 0
MOV A, R5;
SUBB A, #1;
JZ SEG1; Переход на SEG1, если R5 = 1
MOV A, R5;
SUBB A, #2;
JZ SEG2; Переход на SEG2, если R5 = 2
MOV A, R5;
SUBB A, #3;
JZ SEG3; Переход на SEG3, если R5 = 3
MOV A, R5;
SUBB A, #4;
JZ SEG4; Переход на SEG4, если R5 = 4
MOV A, R5;
SUBB A, #5;
JZ SEG5; Переход на SEG5, если R5 = 5
MOV A, R5;
SUBB A, #6;
JZ SEG6; Переход на SEG6, если R5 = 6
MOV A, R5;
SUBB A, #7;
JZ SEG7; Переход на SEG7, если R5 = 7
MOV A, R5;
SUBB A, #8;
JZ SEG8; Переход на SEG8, если R5 = 8
MOV A, R5;
SUBB A, #9;
JZ SEG9; Переход на SEG9, если R5 = 9
SEG0: MOV A, #00111111B;
PUSH A; Запись в стек 0 в коде семисегментного индикатора
SJMP KON;
SEG1: MOV A, #00000110B;
PUSH A; Запись в стек 1 в коде семисегментного индикатора
SJMP KON;
SEG2: MOV A, #01011011B;
PUSH A; Запись в стек 2 в коде семисегментного индикатора
SJMP KON;
SEG3: MOV A, #01001111B;
PUSH A; Запись в стек 3 в коде семисегментного индикатора
SJMP KON;
SEG4: MOV A, #01100110B;
PUSH A; Запись в стек 4 в коде семисегментного индикатора
SJMP KON;
SEG5: MOV A, #01101101B;
PUSH A; Запись в стек 5 в коде семисегментного индикатора
SJMP KON;
SEG6: MOV A, #01111101B;
PUSH A; Запись в стек 6 в коде семисегментного индикатора
SJMP KON;
SEG7: MOV A, #00000111B;
PUSH A; Запись в стек 7 в коде семисегментного индикатора
SJMP KON;
SEG8: MOV A, #01111111B;
PUSH A; Запись в стек 8 в коде семисегментного индикатора
SJMP KON;
SEG9: MOVA, #01101111B;
PUSH A; Запись в стек 9 в коде семисегментного индикатора
KON: RET;
... ЗФ КП.ХХХХХХ.008 ПЭ3 Плата микроконтроллера. Перечень элементов..............................................................................................................20 1 ВВЕДЕНИЕ Применение микропроцессорных средств позволяет строить универсальные устройства управления электронными весами, легко перестраиваемые на различные режимы его работы. Анализ технического задания показывает, ...
... . Целью дипломного проекта является разработка и исследование автоматической системы регулирования (АСР) асинхронного высоковольтного электропривода на базе автономного инвертора тока с трехфазным однообмоточным двигателем с детальной разработкой программы высокого уровня при различных законах управления. В ходе конкретизации из поставленной цели выделены следующие задачи. Провести анализ ...
... . Подставляя значение Н в (8.6), получим м. Округляем значение до L = 0,135 м. Полученные значения размеров ЛП соответствуют размерам корпуса блока управления электромеханическим замком, полученным в результате компоновочного расчета 9 Мероприятия по защите от коррозии, влаги, электрического удара, электромагнитных полей и ...
... характер сигналов интерфейса и их временную диаграмму, а также описание электрофизических параметров сигналов. На рис. 2.2 представлена общая схема сопряжения МП с устройствами ввода-вывода УВВ и ОЗУ в микропроцессорной системе. Рис 2.2. Схема интерфейсных связей микропроцессора Связь МП с УВВ требует пять групп связей, обеспечиваемых через выводы корпуса МП. По группе шин 1 передается ...
0 комментариев