Проект электронных весов с микропроцессорным управлением

Содержание



Введение

1. Построение структурной схемы

2. Выбор элементной базы

2.1 Выбор датчика

2.2 Выбор цифрового индикатора

2.3 Выбор микроконтроллера

3 Формирование принципиальной электрической схемы

4. Разработка алгоритма

5. Построение программы

Заключение

Список использованных источников

Приложение




Введение



Весы – прибор для определения массы тел по действующему на них весу. Различают весы: образцовые (для поверки гирь), лабораторные (аналитические, микроаналитические, пробирные и др.) и общего назначения; по принципу действия - рычажные, пружинные, электротензометрические (см. Тензометр), гидравлические и гидростатические. Вес тела– это сила, действующая на опору или подвес со стороны тела. Т.е, если встать на весы в момент старта лифта вверх, показания будут больше, чем в состоянии покоя, а если в момент старта вниз – меньше. Это происходит за счёт того, что помимо ускорения свободного падения действует ещё и другое ускорение, направленное либо в ту же, либо а противоположную сторону.

Рассмотрим весы общего назначения. Существует целое множество разнообразных конструкций весов, среди которых:

Весы с чашечками – груз кладётся на одну чашечку, а эталонные гири на другую. Необходимо добиться равновесия, при этом вес груза будет равен весу гирек. Это неудобно, т.к. добиться равновесия довольно трудно. В данном случае точность измерения веса зависит от чувствительности весов и от номинала гирек.

Весы со стрелкой – груз, весом до одного килограмма взвешивается без дополнительных гирек, а свыше требует установки противовеса, в этом случае вес груза вычисляется как сумма веса гирек и показаний стрелки. Точность измерения зависит от чувствительности стрелки (на какое расстояние она смещается при каком весе).

Электрические весы – Существует чувствительный элемент, который реагирует на изменение веса, этой реакцией может быть: изменение сопротивления, изменение напряжения, изменение тока, редко изменение потребляемой мощности. В случае изменения сопротивления, необходимо нагрузить этот элемент на источник питания, и последовательно с ним поставить амперметр. Значение тока будет пропорционально значению веса. Если изменяется напряжение, просто можно поставить вольтметр. Точность измерения зависит от чувствительности амперметра (вольтметра).

Электронные весы – наиболее удобный в эксплуатации прибор. Необходимо только положить груз на весы, а дальше они сделают всё сами. При просмотре значения веса на электронных весах нет неоднозначности, как в случае со стрелкой (никогда нельзя однозначно сказать, на какое значение она указывает), значение выводится в понятном цифровом виде.

Микропроцессорное управление весов позволяет обеспечить большую точность измерения по сравнению с механическим прибором, электронные весы более долговечны, т.к. практически не имеют изнашивающихся деталей.

Немаловажным является тот фактор, что точность измерения во многих весах зависит от положения объекта на них (чем дальше от центра, тем меньше точность), это происходит за счёт того, что в них датчик веса или один и стоит посередине, или четыре и стоят по углам. В случае четырех датчиков микроконтроллер вычисляет среднее арифметическое от их показаний, это и есть результат.

В данной работе эта проблема решена следующим образом: измеряется не вес, а давление, оказываемое объектом на подушку с водой, посредством пластины, к подушке подсоединен датчик, измеряющий давление воды. Всё это обеспечивает независимость показаний от позиции объекта на весах.




1. Построение структурной схемы



Согласно техническому заданию, в электронные весы должны входить следующие компоненты:

Датчик давления – первичный преобразователь давления в электрическое напряжение

Индикатор – элемент, отображающий значение веса в виде десятичных цифр

Микроконтроллер – элемент, управляющий электронными весами, т.е. опрашивающий датчик с некоторой периодичностью и преобразующий его аналоговый электрический сигнал в цифровой. А также выводящий это значение на индикатор

Батарея питания – элемент, питающий электронные весы

Структурная схема электронных весов имеет следующий вид:





Рис. 1. Структурная схема




2. Выбор элементной базы



Для электронных весов необходимо выбрать следующие компоненты:

Датчик давления,

Индикатор,

Микроконтроллер.



2.1 Выбор датчика



Как уже было сказано в введении необходимо выбрать не датчик веса, а датчик давления. Рассчитаем необходимые параметры. Для начала вычислим диапазон измеряемого давления. Давление это отношение силы давления к площади соприкосновения. В нашем случае сила давления – это сила тяжести, вычисляемая по формуле



F=mg,



где m-масса объекта,

g-ускорение свободного падения, равное, для нашего региона 9,8 м/c2.

Площадь прикосновения в нашем случае равна площади пластины, лежащей на подушке, т.е. 0,25 м2 . Согласно техническому заданию измеряемая масса может быть в диапазоне от 0 до 250 кг, давление соответственно от 0 до 10 кПа. Погрешность, должна составлять не более 0,5 кг., а значит 20 Па. Напряжение питания – 5 В.

Существуют разнообразные датчики давления (согласно [1]):

Датчик абсолютного давления. Абсолютное давление, такое как барометрическое давление, измеряется относительно вакуума во встроенной в кристалл датчика полости.

Датчик дифференциального давления. Дифференциальное давление, такое как падение давления в регуляторе тяги или на фильтре в воздушном канале, измеряется подачей давления с противоположных сторон чувствительного элемента датчика.

Датчик относительного давления. Относительное давление, как в случае измерения кровяного давления, является частным случаем дифференциального, в котором в качестве давления сравнения служит атмосферное давление.

В нашем случае нужно выбрать датчик абсолютного давления. Рассмотрим датчик DMP330H, имеющий следующие характеристики (согласно [2]):

Диапазон измерений – от 0..100 кПа до 0..16 МПа,

Относительная погрешность – 1%,

Выходной сигнал – 4..20 мА или 0..10 В,

Температура -25..85 °С,

Напряжение питания – 12..36 В;

Данный датчик не подходит, т.к. напряжение питания у него не 5 В.

Рассмотрим датчик DMP331, имеющий следующие характеристики (согласно [3]):

Диапазон измерений – от 0..4 кПа до 0..4 МПа,

Относительная погрешность – 0,35%,

Выходной сигнал – 4..20 мА или 0..10 В,

Температура -25..125 °С,

- Напряжение питания – 14..36 В;

Данный датчик не подходит, т.к. напряжение питания у него не 5 В.

Рассмотрим датчик DMP341, имеющий следующие характеристики (согласно [4]):

Диапазон измерений – от 0..0,6 кПа до 0..10 кПа,

Относительная погрешность – 1%,

Выходной сигнал – 4..20 мА или 0..10 В,

Температура -40..125 °С,

- Напряжение питания – 12..36 В;

Данный датчик не подходит, т.к. напряжение питания у него не 5 В.

Рассмотрим датчик DPS100, имеющий следующие характеристики (согласно [5]):

Диапазон измерений – от 0 до 6 кПа,

Относительная погрешность – 1%,

Выходной сигнал – 4..20 мА или 0..10 В,

Температура 0..60 °С,

- Напряжение питания – 19..31 В;

Данный датчик не подходит, т.к. не обеспечивает необходимого диапазона измеряемого давления и напряжение питания у него не 5 В.

Рассмотрим датчик MPX5010 GVP, имеющий следующие характеристики (согласно [1]):

Диапазон измерений – от 0 до 10 кПа,

Относительная погрешность – 0,1%,

Выходной сигнал – 0..5 В,

Температура -40..125 °С,

- Напряжение питания – 5 В;

Данный датчик подходит по всем критериям.





Рис. 2. Внешний вид датчика




Рис. 3. Схема датчика



Датчик оснащён схемой нормализации выходного напряжения, которая реализована посредством четырёхкаскадного биполярного линейного усилителя с использованием тонкоплёночной технологии и интерактивной лазерной подгонкой, она имеет следующий вид:





Рис. 4. Принципиальная схема нормализации выходного напряжения




2.2 Выбор цифрового индикатора



Согласно техническому заданию, индикатор должен отображать значения веса от 0 до 250 кг., с точностью 0,5 кг, а значит индикатор должен быть четырёхразрядным и иметь десятичную точку. Входное напряжение – 5 В. Существуют следующие виды индикаторов:

Семисегментные индикаторы – индикаторы, у которых управляется каждый сегмент:





Рис. 5. Семисегментный индикатор



- Двоично-десятичные индикаторы – индикаторы, управляемые шестнадцатеричным кодом, т.е. могут выводиться числа от 0 до 9 и буквы английского алфавита от A до F.





Рис. 6. Двоично-десятичный индикатор



- Индикаторы с динамической индикацией – индикаторы, у которых все разряды выводятся по очереди (минимальная частота обновления 30 Гц)




Рис.7. Индикатор с динамической индикацией



- Программируемые индикаторы – индикаторы, управляемые микропроцессорами. Пример подключения программируемого индикатора к контроллеру [6]:





Рис.8. Подключение LCD-дисплея к микроконтроллеру серии MCS-51



Для электронных весов нужно выбрать семисегментный индикатор, имеющий четыре разряда.

Рассмотрим индикатор LFD2110-XX, имеющий следующие характеристики (согласно [7]):

Число разрядов – 4,

Входное напряжение –1, 5..3 В

Высота цифр – 7 мм;

Данный индикатор не подходит, т.к. входное напряжение не 5 В.

Рассмотрим индикатор LFD3162-XX, имеющий следующие характеристики (согласно [7]):

Число разрядов – 4,

Входное напряжение –1, 5..3 В

Высота цифр – 9,2 мм;

Данный индикатор не подходит, т.к. входное напряжение не 5 В.

Рассмотрим индикатор LFD3164-XX, имеющий следующие характеристики (согласно [7]):

Число разрядов – 4,

Входное напряжение –1, 5..3 В

Высота цифр – 9,2 мм;

Данный индикатор не подходит, т.к. входное напряжение не 5 В.

Индикатор HD44780 не подходит, т.к. он программируемый, в данной работе не нужен весь спектр его возможностей.

Рассмотрим индикатор DE-119, имеющий следующие характеристики (согласно [8]):

Число разрядов – 4,

Входное напряжение –5 В

- Высота цифр – 12,7 мм;

Данный индикатор подходит по всем критериям. Он является жидкокристаллическим, эти индикаторы характеризуются низким энергопотреблением по сравнению со светодиодными, но у них есть и недостатки: плохая видимость пли плохом освещении, плохая работоспособность при низкой температуре. Индикатор DE-119 имеет следующий вид:




Рис. 9. Габаритные размеры индикатора DE-119



2.3 Выбор микроконтроллера



Микроконтроллер для электронных весов должен иметь встроенный десятиразрядный АЦП (Аналогово-цифровой преобразователь), четыре восьмиразрядных порта ввода/вывода, напряжение питания 5 В.

Существуют разнообразные виды управляющих микроконтроллеров (согласно [9]). Контроллеры классифицируют по разрядности:

Четырехразрядные – самые простые и дешёвые устройства, предназначенные для замены несложных схем на “жёсткой” логике в системах с невысоким быстродействием. Типичные случаи применения- часы, калькуляторы, игрушки, простые устройства управления.

Восьмиразрядные – наиболее многочисленная группа (оптимальное сочетание цены и возможностей). К этой группе относятся микроконтроллеры серии MCS-51 (Intel) и совместимые с ними: PIC (MicroChip), HC68 (Motorola), Z8 (Zilog) и др.

Шестнадцатиразрядные – MCS-96 (Intel) и др. – более высокопроизводительные, но более дорогостоящие и менее распространённые.

Тридцатидвухразрядные – обычно являющиеся модификациями универсальных микропроцессоров, например i80186 или i386EX.

Для электронных весов будем выбирать восьмиразрядный микроконтроллер семейства MCS-51, т.к. это семейство является несомненным чемпионом по количеству разновидностей и количеству компаний, выпускающих его модификации.

Рассмотрим микроконтроллер AT80C5112, имеющий следующие характеристики (согласно [10]):

ПЗУ - нет,

Напряжение питания - 2,7-5,5 В,

Порты ввода/вывода - 3,

Рабочая частота - 60 МГц,

16-разрядный таймер – 2,

АЦП – нет,

UART – нет;

Данный микроконтроллер не подходит, т.к. не обладает АЦП.

Рассмотрим микроконтроллер AT89LV52, имеющий следующие характеристики (согласно [10]):

ПЗУ – 8 Кб,

Напряжение питания - 2,7-5,5 В,

Порты ввода/вывода - 5,

Рабочая частота - 16 МГц,

16-разрядный таймер – 3

АЦП – нет,

UART – 1;

Данный микроконтроллер не подходит, т.к. не обладает АЦП.

Рассмотрим микроконтроллер 5.0.4.8XC51GB, имеющий следующие характеристики (согласно [9]):

ПЗУ – нет,

Напряжение питания - 5 В,

Порты ввода/вывода - 6,

Рабочая частота - 12 МГц,

16-разрядный таймер – 3

АЦП – 8-разрядов,

UART – 2;

Данный микроконтроллер не подходит, т.к. обладает 8-разрядным АЦП.

Рассмотрим микроконтроллер AT89C5AC2, имеющий следующие характеристики (согласно [11]):

ПЗУ – 32 Кб,

Напряжение питания - 3-5,5 В,

Порты ввода/вывода - 5,

Рабочая частота – 20 либо 40 МГц,

16-разрядный таймер – 3

АЦП – 10 разрядов,

UART – 1;





Рис. 10. Блок-схема микроконтроллера AT89C5AC2


Данный микроконтроллер подходит по всем критериям. Помимо вышеперечисленных характеристик AT89C5AC2 обладает:

ОЗУ 256 байт на кристалле,

PCA – Программируемый массив счётчиков,

Диапазон рабочих температур -40 – 85 °С.




3 Формирование принципиальной электрической схемы



На принципиальной электрической схеме должны быть отражены все электрические связи, т.е. датчика с микроконтроллером, микроконтроллера с индикатором, источника питания с датчиком и микроконтроллером. Также должна быть отражена кнопка “Reset”, сбрасывающая микроконтроллер.

Список выводов датчика давления:



Табл. 1. Распиновка датчика давления

Название

Описание

Номер

Vcc

К этому выводу подключается напряжение питания (5 В)

3

+Vout

Выходной сигнал

2

-Vout

Выходной сигнал

4

Gnd

Заземление

1



Вывод Vcc подсоединим к источнику питания, +Vout к 7 каналу АЦП, -Vout к контакту VAGND АЦП, Gnd к “земле”.

Список выводов микроконтроллера:



Табл. 2. Распиновка микроконтроллера

Название

Описание

Номер

Vcc

Напряжение питания

42

VAREF

Опорное напряжение для АЦП

2

AN0..AN7

Входы АЦП

3..10

XTAL1

Подключение кварцевого резонатора

41

XTAL2

Подключение кварцевого резонатора

40

Gnd

Заземление

43

VAGND

Аналоговая земля

1

P0

Порт ввода/вывода

30..37

P1

Порт ввода/вывода

3..10

P2

Порт ввода/вывода

29..22

P3

Порт ввода/вывода

12..19

P4

Порт ввода/вывода

20,21

Rst

Вход сброса микроконтроллера

44


К выводу опорного напряжения VAREF (это будет максимальное значение входного напряжения, т.е. “111111111b”) подключим 5 В.

К выводу напряжения питания Vcc подключим также 5 В.

К выводам XTAL1, XTAL2 подключим кварцевый резонатор, частотой 20 МГц.

Вывод Gnd подключим к “земле”.

На схеме присутствует кнопка “Reset”, сбрасывающая микроконтроллер (выполнение программы начинается сначала), это необходимо в случае зацикливания программы или какого-нибудь другого сбоя.

К порту P0 подключим 2-й разряд индикатора (сотни), сегменты с “a” по “g” (см. рис. 5). Если на соответствующем выводе P0 “единица”, то сегмент светится, если “ноль”, то нет.

К порту P1 подключим 1-й разряд индикатора (десятки), сегменты с “a” по “g” (см. рис. 5). Если на соответствующем выводе P1 “единица”, то сегмент светится, если “ноль”, то нет.

К порту P2 подключим 0-й разряд индикатора (единицы), сегменты с “a” по “g” (см. рис. 5). Если на соответствующем выводе P2 “единица”, то сегмент светится, если “ноль”, то нет. К выводу P2.7 вход десятичной точки 0-го разряда.

К порту P3 подключим -1-й разряд индикатора (десятые), сегменты с “a” по “g” (см. рис. 5). Если на соответствующем выводе P0 “единица”, то сегмент светится, если “ноль”, то нет.




Рис. 11. Схема электрическая принципиальная



Теперь рассмотрим индикатор:



Табл. 3. Распиновка индикатора

Описание

Вывод

4A

21

4B

20

4C

19

4D

18

4E

17

4F

22

4G

23

3A

25

3B

24

3C

15

3D

14

3E

13

3F

26

3G

27

2A

30

2B

29

2C

11

2D

10

2E

9

2F

31

2G

32

DP3

16

1A

35

1B

34

1C

7

1D

6

1E

5

1F

36

1G

37




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;

1