Speccy Опубликовано 29 апреля, 2007 Поделиться Опубликовано 29 апреля, 2007 Доброго времени суток. Хочу поделиться теорией и практическими наработками по теме. Перевод двоичного числа в двоично-десятичный вид. Теория: двоичное n-разрядное число вида An-1*2^(n-1)+An-2*2^(n-2)+...+A1*2+A0 можно переписать в альтернативном виде: (...(An-1*2+An-2)*2+...+A1)*2+A0. Значит, для перевода потребуется прибавлять значение бита двоичного числа к результату, умножать результат на два, и выполнять его двоично-десятичную коррекцию столько раз, сколько разрядов в исходном числе. Алгоритм: 1. Сдвинуть источник влево через флаг переноса. 2. Умножить результат на 2 и прибавить флаг переноса. 3. Выполнить десятичную коррекцию результата. 4. Повторять с п.1 пока не все разряды источника. Практика: ; =============================================================================== ; i8051, BIN2DEC, Speccy. ; Подпрограмма перевода двухбайтного двоичного числа в двоично-десятичный вид. ; Данные в подпрограмму передаются через переменные: ; CALCBUFL = младший байт двоичного числа, ; CALCBUFM = старший байт двоичного числа. ; Подпрограмма возвращает результат в ячейках: ; CALCBUFL = младший байт двоично-десятичного числа, ; CALCBUFM = средний байт двоично-десятичного числа. ; CALCBUFH = старший байт двоично-десятичного числа. ; Подпрограмма не влияет на регистры и флаги. ; Программист обязан сам объявить переменные в прямоадресуемой памяти данных, ; например: ; CALCBUFL DATA 032h ; CALCBUFM DATA 031h ; CALCBUFH DATA 030h ; =============================================================================== BIN2DEC: push PSW push ACC push B push DPH push DPL mov DPH,CALCBUFM mov DPL,CALCBUFL mov CALCBUFH,#000h mov CALCBUFM,#000h mov CALCBUFL,#000h mov B,#010h BIN2DEC_1: mov A,DPL rlc A mov DPL,A mov A,DPH rlc A mov DPH,A mov A,CALCBUFL rlc A da A mov CALCBUFL,A mov A,CALCBUFM rlc A da A mov CALCBUFM,A mov A,CALCBUFH rlc A da A mov CALCBUFH,A djnz B,BIN2DEC_1 pop DPL pop DPH pop B pop ACC pop PSW ret Перевод двоично-десятичного числа в двоичный вид. Теория: десятичное n-разрядное число вида An-1*10^(n-1)+An-2*10^(n-2)+...+A1*10+A0 можно переписать в альтернативном виде: (...(An-1*10+An-2)*10+...+A1)*10+A0. Значит, для перевода потребуется прибавлять значение тетрады двоично-десятичного числа к результату, умножать результат на десять, столько раз, сколько тетрад в исходном числе. Алгоритм: 1. Взять старшую тетраду источника. 2. Сдвинуть источник влево на одну тетраду. 3. Прибавить тетраду к результату. 4. Если тетрада не последняя, то умножить результат на 10. 5. Повторять с п.1 пока не все тетрады источника. Практика: ; =============================================================================== ; i8051, DEC2BIN, Speccy. ; Подпрограмма перевода трехбайтного двоично-десятичного числа в двоичный вид. ; Данные в подпрограмму передаются через переменные: ; CALCBUFL = младший байт двоично-десятичного числа, ; CALCBUFM = средний байт двоично-десятичного числа. ; CALCBUFH = старший байт двоично-десятичного числа. ; Подпрограмма возвращает результат в ячейках: ; CALCBUFL = младший байт двоичного числа, ; CALCBUFM = средний байт двоичного числа. ; CALCBUFH = старший байт двоичного числа. ; Подпрограмма не влияет на регистры и флаги. ; Программист обязан сам объявить переменные в прямоадресуемой памяти данных, ; например: ; CALCBUFL DATA 032h ; CALCBUFM DATA 031h ; CALCBUFH DATA 030h ; =============================================================================== DEC2BIN: push PSW push ACC push aR7 push aR6 push aR5 push aR4 push aR3 push aR2 push aR1 push B mov R7,#000h mov R6,#000h mov R5,#000h mov B,#006h DEC2BIN_4: mov A,CALCBUFH anl A,#0F0h swap A push ACC mov R1,#004h DEC2BIN_1: mov A,CALCBUFL rlc A mov CALCBUFL,A mov A,CALCBUFM rlc A mov CALCBUFM,A mov A,CALCBUFH rlc A mov CALCBUFH,A djnz R1,DEC2BIN_1 mov R4,#000h mov R3,#000h pop aR2 call DEC2BIN_ADD djnz B,DEC2BIN_2 mov CALCBUFH,R7 mov CALCBUFM,R6 mov CALCBUFL,R5 pop B pop aR1 pop aR2 pop aR3 pop aR4 pop aR5 pop aR6 pop aR7 pop ACC pop PSW ret DEC2BIN_2: mov R4,aR7 mov R3,aR6 mov R2,aR5 mov R1,#009h DEC2BIN_3: call DEC2BIN_ADD djnz R1,DEC2BIN_3 jmp DEC2BIN_4 DEC2BIN_ADD: mov A,R5 add A,R2 mov R5,A mov A,R6 addc A,R3 mov R6,A mov A,R7 addc A,R4 mov R7,A ret На этом всё. Достоинством этих процедур-примеров является то, что время их выполнения зависит только от кол-ва разрядов источника. Те, кто разобрался, смогут легко адаптировать процедуры под конкретный МК и для конкретной разрядности чисел. -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ErtErt Опубликовано 29 апреля, 2007 Поделиться Опубликовано 29 апреля, 2007 Большой респект! Уже пригодилось! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
LostGuard Опубликовано 27 января, 2012 Поделиться Опубликовано 27 января, 2012 про перевод из двоично-десятичного числа в двоичное в формуле под An думаю понимается не разряд а тетрада. или я ошибаюсь? Сорри что поднимаю старую тему, просто мне это необходимо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.