Перейти к содержанию

Сортировка элементов массива


erbi

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 80
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Извините, что еще раз обращаюсь, вот была лабораторная работа, и мы выводили свою ФИО на экран ЖКИ, спасибо Вам что написали программу, У нас все получилось, только преподаватель еще дал, сказал чтобы мы вывели ФИО, только с подпрограмммой SEND_STRING, я поискал в интернете, но что это за подпрогрмма я так и не нашел. В его методичке про это вообще ничего не сказано, там он выводит по буквенно. Причем после каждой буквы пишет метку на подпрограмму SYMB:

SYMB: mov DPTR, #7FC2H

movx @DPTR, A

call Delay_15ms

ret

Эта подпрограмам называется вывод на экран ЖКИ принятого в аккумулятор МК символа. Скажите, а вот в программе по вывода значений АЦП эта подпрогрмаам не нужна.

Ну здравствуй. И хватит извиняться.

Сейчас, как вижу, все встало на свои места. И адреса появились и подпрограммы.

SEND_STRING можешь в инете не искать. Смысл этой подпрограммы в том, что она выводит строку символов на ЖКИ. При входе в подпрограмму надо например указать начало строки в памяти. Конец строки определять например по символу с кодом 0. А внутри подпрограммы каждый символ друг за другом отправляется в регистр данных ЖКИ. Это может быть сделано даже в виде еще одной подпрограммы, как у тебя в методичке SYMB.

Если нужно оформит подпрограммой и назвать её SEND_STRING то так и сделаем.

А вот в примере про АЦП я программу писал так, что мне точно была известна длина строки символов (она была фиксированной). И все 10 значений я поместил в память ЖКИ одновременно. А потом, для отображения нужного показания, давал команду для ЖКИ "сдвиг дисплея на N символов". При этом на экране появлялось следующее показание. И оформлено всё в виде одной большой подпрограммы, внутри которой, если присмотреться, есть строки, указанные тобой выше (а именно movx).

Тут надо понимать как организовано отображение 80-и ячеек памяти в ЖКИ. А для этого надо посмотреть даташит hd44780u.pdf (стр.10-12). Там для однострочного и двустрочного дисплея приведены примеры.

И если ВАм не трудно можете написать подпрогрмаму инициализации УАПП, с частоотй 9600 Гц, режим работы 1 с., определяемая таймером счетчиком 1.

Он на усложнил задачу, сказал чтобы мы вывели теперь ФИО не только на экран ЖКИ, но и на экран монитора. Плата подключается через COM порт. Он требет, чтобы эта программа была написано через подпрограмму SEND_STRING, только не на 3 строках а на одной через пробел , или на двух. На первой строке Фамилия на второй Имя.

Сама плата, которая является демонстрационной наз. EB-552

У нее адрес регистра команд для записи 7FC0H

Код команды выбора интерфейса 38h

Инкремент счетчика адресов 06h

Очистка экрана 01hВключение экрана 0ch

Адрес регистра данных для записи 7FC2h.

.....

Плату глянул. Прикольно. Когда я в 1999 году обучался у нас тоже был МП комплект на КР580ВМ80А. Правда размером с чемодан. :)

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

stud_6.TXT

Читай, анализируй...

Останется запустить на компе HyperTerminal и увидишь результат работы УАПП.

P.S. Преподу - целую ноги...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Большое спасибо.

Хотел только спросить, правильно ли я написал программу вывода на ЖКИ ФИ. Нигде не ошибся. А то при выводе он очень на мало показал вывод. Т.е. наверно где то 1 с, и ФИ исчезла.

Еще раз спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Хотел только спросить, правильно ли я написал программу вывода на ЖКИ ФИ. Нигде не ошибся. А то при выводе он очень на мало показал вывод. Т.е. наверно где то 1 с, и ФИ исчезла.

Правильно написал. За исключением строки где "DB 'Ivanov Ivan' 0".

Там перед нулем запятая должна быть.

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

Ссылка на комментарий
Поделиться на другие сайты

Большое спасибо, что все мне разьяснили. Но вот у меня возник еще один вопрос, а если в этой программе нужно будет перейдти на второу строку, или например вывести ФИ в центре, это надо просто в конце где написано DB 'Ivanov Ivan' , 0 нужно сделать просто сдвинуть от DB ' Ivanov Ivan ', 0 это по центру, а на вторую строку 'Ivanov

Ivan ', 0 я правильно понял, или надо писать подпрограмму перехода на вторую сторку и смещение ФИв центр, и как это сделать. И еще хотел спросить, эта программа последняя, она выводит и на экран ЖКИ и на экран монитора ПК, я правильно понял.

И ее можете подсказать, просто мне дали программу, Вы ее уже писали. Только как ее теперь по данные конкретной платы сделать, все данные как в программе ФИ, если конечно не трудно. Просто у меня программа точь в точь как эта, таже слово тоже саоме надо выводить, вот только под конкретную плату надо. Еще раз спасибо.

С клавиатуры ПК подать одну из двух команддля микроконтроллера. Первая команда должна обеспечиватьвывод на ЖКИ показания АЦП, вторрая - вывод на ЖКИ текущее время с предварительно выделенным словом TIME.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, спасибо Вам что Вы мне помогли наисать программу по сортировке массива. Только преподаватель не захотел ее смотреть, сказал, что массив должен быть задан не в регистры. Он сказал, чтобы я написал программу так, чтобы он вначале задавал какие то цмфры сам, а в конце программы на экране монитора был показан отсортированный массив. Я вот написал программу сортировки массива по возрастанию, и находящийся во внутренней памяти, скажите, а что нужно добавить к этой программе, чтобы можно с клавиатуры задавать любые цифры, далее он производил сортировку массива, а затем был показал этот отсортированный массив.

MAX_ITEM EQU 02Eh ; переменная для максимального значения.

IN_ADR EQU 030h ; начальный адрес размещения данных во внутренней памяти данных.

NUM_ITEM EQU 007h ; количество элементов массива.

org 0000h

jmp Start ; переход к началу программы.

org 0100h ; начало программы.

Start: mov SP, 0080h ; установка указателя стека.

mov R0, #IN_ADR ; загрузка начальных данных во внутреннюю память данных.

mov A, #255

mov @R0, A

inc R0

mov A, #128

mov @R0, A

inc R0

mov A, #16

mov @R0, A

inc R0

mov A, #0

mov @R0, A

inc R0

mov A, #40

mov @R0, A

inc R0

mov A, #108

mov @R0, A

inc R0

mov A, #127

mov @R0, A

call SORT_UP ; вызов подпрограммы SORT_UP.

SORT_UP: mov R7, #NUM_ITEM ; в R7 загружаем количество прходов N-1.

IN_SORT_UP_3: dec R7

push aR7 ; сохраняем в стеке количество проходов.

mov R0, #IN_ADR ; в R0 организуем указатель на n-й элемент массива.

mov R1, #IN_ADR

inc R1 ; в R1 организуем указатель на (n+1)-й элемент массива.

IN_SORT_UP_2: mov 02Eh, @R0 ; начинаем проход. В переменную MAX_IYEM загружаем содержимое n элемента массива.

mov A, @R1 ; в аккумулятор загружаем содержимое (n+1) элемента массива.

cjne A, MAX_ITEM, IN_SORT_UP_1 ; если (n+1)<n то необходимо поменять элементы местами (выполнить IN_SWAP_UP),

IN_SORT_UP_1: jc IN_SWAP_UP ; иначе перейтди к IN_SORT_UP_4

jmp IN_SORT_UP_4

IN_SWAP_UP: mov @R0, A ; на место n элемента загружается (n+1) элемент,

mov @R1, MAX_ITEM ; ; на место (n+1) элемента загружается n элемент.

IN_SORT_UP_4 : inc R0 ; увеличваем указатель на элемент массива

inc R1 ; увеличваем указатель на элемент массива

djnz R7, IN_SORT_UP_2 ; уменьшаем содержимое R7 и повторяем проход если R7 не достигло нуля.

pop aR7 ; восстанавливаем из стека данные о выполненом проходе,

djnz R7, IN_SORT_UP_3 ; уменьшаем на 1 количество шагов в следующем проходе, и повторяем если не достигнут конец.

ret ; возврат из подпрограммы.

Loop: sjmp Loop

В какие адреса писать эту программу я так и не понял. Если Вам не трудно можете подссказать, какие именно подпрогрммы надо дописать, я примерную такую программу нашел, но она для другоо микроконтроллера, а как ее написать для микроконтроллера 80С552, а так и не понял. Вот ссылка где приведена программа для другого микроконтроллера.

http://liloisproj.narod.ru/asm_bul.htm там примерно написано, а как мне изменитть, я не понемаю.

Заранее благодарен. Спасибо, за то что написали основу этой программы.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуте, извините что опять обращаюсь, но у меня вопрос, про прогрмамму про АЦП, преподаватель сказал, что программу это врная, но он сказал, что Вы брали эти значения АЦП из головы и выводили их просто на экран, а это не нужно, он сказал, что Вы должны снять эти 10 показаний АЦП и вывести их на экран. Я все понял, а вот как снимать значения с платы АЦП не понимаю, он в конспекте далл инициализацию АЦП, написал call init_ADC далее постаил ......... ret вот я вся инициализация, Скажите, вот ребята из группы мне написали программу, если Вас не трудно посмотрите, просто очень сложго делать такой курсовик когда плату домой не дают, а он требует чтобы мы дома делали. Еще раз извините.

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

Экспериментальная плата EB-552 все адреса теже, только в методички наисано два адреса ADCH, ADCON, что это понять очень сложго, так как в методичики про АЦП всего пол страницы.

Тессамой программы:

Start:

adch equ 0c6h

adcon equ 0c5h

call init_lcd

call get_ADC

call bin_dec

call dec_ascii

call lcd_out

Loop: sjmp Loop

init_lcd:

mov A,#38H

mov dptr,#7FC0H

movx @dptr, A

call delay_16

mov A,#0EH

mov dptr,#7FC0H

movx @dptr,A

call delay_16

mov A,#06H

mov dptr,#7FC0H

movx @dptr,A

call delay_16

mov a,#1

mov dptr,#7FC0H

movx @dptr,A

call delay_16

ret

delay_16:

mov r2,#25

l1: mov r3,#25

l2: djnz r3,l2

djnz r2, l1

ret

get_ADC:

anl adcon,#00001000b

call delay_16

ret

bin_dec:

mov r6,#0

mov r0, adch ;Записываем старшие 8 бит числа в регистр r0

mov r1, adcon ;Записываем оставшиеся 2 младших бита числа в регистр r1 (старшие биты)

mov a,r0 ;Записываем r0 в аккумулятор

mov b, #250 ;Записываем число 250 в регистр b

div ab ;Делим a на b. В результате деления в a пишется целый результат, в b пишется остаток

mov r7,a ;Результат деления пишем в r7 - он будет отвечать за тысячи

jnz obrdes ;Максимальное число, записываемое в 10 разрядов - 2^10=1024. Если >1000, то сотни не считаем.

mov a,r0 ;Если <1000, то считаем сотни. Для этого опять записываем r0 в аккумулятор

mov b, #25 ;В b пишем 25

div ab ;делим

mov r6,a ;Регистр r6 будет отвечать за сотни - в него пишем сколько целых сотен в числе

obrdes: ;сюда приходим после расчета тысяч, если заданное число оказалось >1000

mov a,b ;Напомню, в b хранится остаток деления (что после сотен, что после тысяч - не важно, откуда пришли)

mov b,r1 ;Для побитного обращения поместим мл. разряды заданного числа в b

mov c,b.7 ;Вот, собственно, и побитное обращение. В "с" записываем 7-й бит.

rlc a ;Команда RLC добавит записанный в "с" бит справа от младшего разряда "а".

;Т.е., если "а" двоичное равно "101001", а "с" равно 1, то после "RLC a" в "а" будет "1010011"

mov c,b.6 ;Аналогично пишем в "с" младший разряд заданного числа

rlc a ;Добавляем этот разряд к "а". Теперь в "а" хранится заданное число, если от него оставить только десятки и еденицы

mov b,#10 ;Будем делить на 10. Для этого поместим число 10 в b...

div ab ;... разделим

mov r5,a ;Результат = количество десяток (за них пусть отвечает регистр r5)

mov r4,b ;Остаток от деления = количество единиц (за них в ответе r4)

;Т.о. теперь имеем тысячи в r7, сотни в r6, десятки в r5 и единицы в r4,

;т.е. преобразовали из двоичного в двоично-десятичный код.

ret

dec_ascii:

mov A,r4

add A,#030H

mov r4,A

mov A,r5

add A,#030H

mov r5,A

mov A,r6

add A,#030H

mov r6,A

mov A,r7

add A,#030H

mov r7,A

ret

lcd_out:

mov A,#055H ;в регистр А заслали аскикод буквы U

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

mov A,#03DH ; заслали = в регистр А

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

MOV A,r7

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

MOV A,r6

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

MOV A,r5

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

MOV A,r4

call symb ; вывод на ЖКИ

call echo ; вывод на монитор

ret

symb:

mov dptr,#7fc2h

movx @dptr, A

call delay_16

ret

echo:

mov sbuf,A

lab2: jnb ti,lab2

clr ti

ret

Если Вам не трудно можете в эту программу добавить ту которую писали раньше про АЦП, для 10 значений.

Большое спасибо.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Ребята! Я про вас не забыл!

Сейчас, еще раз сосредоточусь, какие задания в итоге "висят" и что-нить придумаем.

Однако, как вас препод мурыжит.

А вы то сами, чуйствуете? Как в самом начале свои задания формулировали в теме, а потом оказалось что там и ЖКИ есть с адресами, и АЦП оказался реальный, и проч., проч.? :)

Писали бы задания сразу по делу, а то сейчас хрен поймешь чё куда и кому нужно.

Ссылка на комментарий
Поделиться на другие сайты

Так вот. Посмотрел сейчас принципиальную схему вашей "пыточной" платы.

Давайте расставим точки над i.

- Мне не понятно предложение из описания: "Для запуска программы её необходимо откомпилировать начиная с адреса 8000h. В том числе, и точки входов прерываний, которые соотв. образом переносятся монитором-загрузчиком из области 0000h в 8000h командами JMP...".

Так где всё таки надо размещать вектора прерываний? Где обычно, или со смещением 8000h?

- В микроконтроллере интегрирован АЦП с мультиплексором на 8 каналов. "...только в методички наисано два адреса ADCH, ADCON, что это понять очень сложго, так как в методичики про АЦП всего пол страницы."

Вот эти регистры специального назначения ADCH и ADCON и описание на пол страницы вам в ломы чтоли было выложить тут? Я вот в оригинальном даташите на микроконтроллер не увидел описания, а у вас оно есть.

Если не поделитесь инфой или методичкой, то буду делать по вашем последнему примеру.

- Тем кому надо увидеть время на ЖКИ. Вот задание: "С клавиатуры ПК подать одну из двух команддля микроконтроллера. Первая команда должна обеспечиватьвывод на ЖКИ показания АЦП, вторрая - вывод на ЖКИ текущее время с предварительно выделенным словом TIME.

". Писец! Какое АЦП? Какое время? Через месяц выяснилось что там плата с часами реального времени. Вы ребята очень чуднО просите помощи. Поди туда не знаю куда, принеси то - не знаю что.

Так вот. Часы связаны с МК по шине I2C. Вы понимает что это значит? Тогда дальше.

И это еще нифига не всё.

Короче. Выкладываю последний раз файлы.

Двойка всем! За то, что сами не можете сформулировать того, чего хотите, и чего требует преподаватель.

Ссылка на комментарий
Поделиться на другие сайты

Вот сортировка массива. Исходник и скомпилированный вариант: bubble_uart.zip

Извиняюсь за недочеты первого раза.

Работает с компьютером в терминальной программе.

Требует ввода данных и выводит необходимые сообщения.

Вот файл для блокнота: bubble_uart.txt

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

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

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, я прочитал, все что вы правильно на меня ругаетесь, я просто сам понять ничего не могу, потому что преподаватель, стал сам все менять, сначала дал одно делать, теперь это отменил, дал делать другое, раньше он не давал ФИ теперь дает, но эту программу я сделал, только осталась сдеалть программу вывода на экран ПК ФИ с нажатия клавиши, но это я постараюсь сам написать, а вот с АЦП, я так и не пойму что он хочет, сказал, сделать, гворит чтобы мы дома делали больше, а как можно делать когда он плату домой не дает, очень сложно разобратся.

Полный материал по этой лабораторной работе есь на сайте там и эмулятор, я ссылку могу дать, но Вы наверно не будете скачивать ее она весит около 54 мБ. http://www.vt.fvms.mirea.ru/ - там написано учебные материалы, материалы МК-51.

Я постраюсь выложить сюда файл методички по которой учусь. Там на стр. 73 написано мое задание №10. Вывод на экран ЖКИ 10 показаний АЦП, он сначало дал эту задачу, а теперь все поменял. Извините еще раз.

Скажите, а правильно программа наисано вывода показания АЦП, которую я привел раньше.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Большое спасибо, что помогли написать программу сортировки массива.

У меня только вопрос, я в программе все понял, только не понял, что значит команда DATA в самом начале, у меня в списке команд нет токой команды. Скажите, а можете еще чуть чуть исправить этк программу, просизвести сортировку элементов массива только по возрастранию, и размещенной во внутренней памяти, по убыванию и во внешней памяти не нужно, просто преподаватель снял эти пункты у меня и отдал их другому. Извините, что отвлекаю Вас и задаю глупые вопросы, я нашел, адреса куда надо записывать.

NAME LAB_DEMO1

USING 0 ; Использовать банк регистров 0

JMP START ; Начало программы

ORG 03H ; Адрес обработчика EXT INT 0

LJMP Ext0Srv

ORG 0BH ;Адрес обработчика TIMER INT 0

LJMP Time0Srv

ORG 13H ; Адрес обработчика EXT INT 1

LJMP Ext1Srv

ORG 1BH ; Адрес обработчика TIMER INT 1

LJMP Time1Srv

ORG 23H ; Адрес обработчика прерывания от

LJMP RiTiSrv ; последовательного порта

ORG 2BH ; Адрес обработчика прерывания от

LJMP SIO1 ; последовательного порта I2C

ORG 53H ; Адрес обработчика прерывания

LJMP ADC ; по завершению работы АЦП

ORG 33H ; Адрес обработчика прерывания

LJMP CT01 ; регистра захвата СТ0

ORG 5BH ; Адрес обработчика прерывания при

LJMP TC20 ; сравнении Т/С2 и регистра уставок СМ0

ORG 3BH ; Адрес обработчика прерывания

LJMP CT11 ; регистра захвата СТ1

ORG 63H ; Адрес обработчика прерывания при

LJMP TC21 ; сравнении Т/С2 и регистра уставок СМ1

ORG 43H ; Адрес обработчика

LJMP CT21 ; регистра захвата СТ2

ORG 6BH ; Адрес обработчика прерывания при

LJMP TC22 ; сравнении Т/С2 и регистра уставок СМ2

ORG 4BH ; Адрес обработчика прерывания

LJMP CT31 ; регистра захвата СТ3

ORG 73H ; Адрес обработчика прерывания

LJMP TC2 ; при переполнении Т/С2

START:

ORG 8000H

; Настройка микроконтроллера для обмена информацией с ПК

; по последовательному каналу. Скорость обмена 9600 бит/с

; Резонансная частота кварцевого резонатора 11,059 МГц

MOV IE,#0 ; Запрет всех прерываний

MOV TMOD,#20H ; Установка режима 2 для таймера 1

MOV TH1,#0FDH

MOV TL1,#0FDH

ANL PCON,#7FH

MOV SCON,#50H

SETB TR1 ; Старт Т/С1

Если Вам не трудно можете не мого исправит программу сортировки массива по возрастанию во внутренней памяти.

Пожалуйста поймите меня правильно если бы я хоть в чем то разбирался я бы не пристовал, а то препоадватель, то одно дает то другое все меняет, сам поянть ничего не могу. А плату Вы правильно указали, действительно именно с этой платой мы и работает/

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Задача: "С клавиатуры ПК подать одну из двух команддля микроконтроллера. Первая команда должна обеспечиватьвывод на ЖКИ показания АЦП, вторрая - вывод на ЖКИ текущее время с предварительно выделенным словом TIME."

Вот исходник и скомпилированный hex-файл.ADC_TIME.txt

Извините за недочеты.

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

Скажите, а правильно программа наисано вывода показания АЦП, которую я привел раньше.

В вашей программе получается только однократное измерение. А надо измерять и выводить 10 раз по условию задачи.

А для того чтобы перевести двоичное число в двоично-десятичное есть более изящный способ чем деление.

Например такая конструкция:

				 mov  R0,ADCH		
			 mov  R1,#000h	   
			 mov  R2,#000h	   
			 mov  B,#008h		

BIN_2_DEC:	   mov  A,R0		   
			 rlc  A			  
			 mov  R0,A		   

			 mov  A,R2		   
			 addc A,R2		   
			 da   A			  
			 mov  R2,A		   
			 mov  A,R1		   
			 addc A,R1		   
			 da   A			  
			 mov  R1,A		   

			 djnz B,BIN_2_DEC

Из регистра ADCH берутся 8 старших битов измерения 10-битного АЦП. На 2 младших плюём.

Опорное напряжение для АЦП = 2.5 вольта.

Таким образом, комбинации 0FFh(255) соотв 2.5В.

Видите? Если тупо перевести старшие биты в десятичный вид и поставить десятичную запятую, то все будет ок.

2,5 вольтам будет соотв. надпись на ЖКИ "02,55V".

Преобразование занимает 8 шагов и состоит только из двух вещей. Сдвиг и двоично-десятичная коррекция. Результат в регистрах R1,R2.

Почему так мало команд и такой результат? Могу если надо объяснить подробней попозже.

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, извините. файл почему то не удается скачать, точнее он скачивается но не отображается, показывает только форум и картинки к нему. Если не трудно можете в блокноте записать кодж программы.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Если Вам не трудно можете не мого исправит программу сортировки массива по возрастанию во внутренней памяти.

DATA замени на EQU.

Вот:bubble_uart_sort_up.txt

Здравствуйте, извините. файл почему то не удается скачать, точнее он скачивается но не отображается, показывает только форум и картинки к нему. Если не трудно можете в блокноте записать кодж программы.

Вы в чем там файлы смотрите? Ничё не пойму. Они же текстовые. Просто расширение ASM. Можно в любом текстовом редакторе открыть, только не надо по нему два раза кликать, виндоуз может не знать, что АСМ файл надо в блокноте открывать.

Внимание! Ошибку исправил. Принципиальную! Файл по новой:

adc_time.txt

Изменено пользователем Speccy
Ссылка на комментарий
Поделиться на другие сайты

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

Чтобы программа выводила сортировку массива не через порт. Извините за не понятный вопрос. Просто я знаю в бейсики это возможно.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Чтобы программа выводила сортировку массива не через порт. Извините за не понятный вопрос. Просто я знаю в бейсики это возможно.

Бейсик ты запускаешь на чём? На компьютере. У него среди прочих средств ввода/вывода есть клавиатура и дисплей.

У отладочной платы тоже есть дисплей, но нет клавиатуры. Вариантов два. Чтоб увидеть результат работы программы надо выводить данные на дисплей ЖКИ, либо выводить данные в последовательный порт наружу. А с наружи их кто-то другой покажет на чём-нибудь. Этот кто-то, в данном случае, программа-терминал на персональном компьютере и экран монитора.

Если хотите посмотреть результаты не используя реальных устройств, то есть эмуляторы на персональном компьютере. Загружаете туда вашу программу и исследуете результат.

Или я не понял вопрос?

Ссылка на комментарий
Поделиться на другие сайты

у меня эмулятор назвается MК51Win вроде на нем, нельзя вывести.

Посмотрел твой эмулятор. Круть! :)

Там есть пункт меню "Периферийные устройства". Можно смотреть какие данные выдаются и принимаются через УАПП (пункт "serial").

Естественно это муторно, но только вот так.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Здравствуйте, извините, что опять обращаюсь, с Праздником поздравляю! Извините, я вот написал программу снятия показания АЦП, но преподаватель говорит, что она не правильно скомпанована, ошибок она не выдает. Тзвините, не моглибы скоректировать эту программу, преподаватель говорит, что все подпрограммы должны писатся после LOOP: jmp LOOP я что то запутался, можете помочь разобратся в ней.

NAME LAB_DEMO

USING 0 ; Использовать банк регистров 0

Jmp Start ; Начало программы

ORG 03h

LJmp Ext0Srv ; Адрес обработчика EXT INT 0

ORG 0BH ; Адрес обработчика TIMER INT 0

LJmp Time0Srv ;

ORG 13H ; Адрес обработчика EXT INT 1

LJmp Ext1Srv ;

ORG 1BH ; Адрес обработчика TIMER INT 1

LJmp Time1Srv ;

ORG 23H ; Адрес обработчика прерывания от

LJmp RiTiSrv ; последовательного порта

; --- Конец заголовка ----

;---------- Здесь вводите код программы ----------

; Программа выполняет следующие действия:

; 1. Начальная инициализация ЖКИ-модуля: устанавливается 8-разрядная

; шина обмена, возможность отображения в две строки, размер символов 5х7,

; без курсора, последовательность вывода символов слева направо.

; 2. Снятие показаний с 0-го входа АЦП

; 3. Вывод в первую строку ЖКИ-модуля снятых показаний АЦП (только старших 8 разрядов)

; ПРИМЕЧАНИЕ 1:

; - запись в регистр команд ЖКИ-модуля производится по адресу 7FC0H

; - чтение из регистра команд ЖКИ-модуля - по адресу 7FC1H

; - запись в регистр данных ЖКИ-модуля - по адресу 7FC2H

; обращение к регистрам ЖКИ-модуля производится через внешнюю память

; посредством 16-разрядного регистра DPTR

; ПРИМЕЧАНИЕ 2:

; - обращение к регистру команд АЦП производится по адресу C5H

; - обращение к регистру данных АЦП - по адресу C6H

; (адреса регистров специальных функций, в том числе АЦП приведены

; в учебном пособии на стр. 34,

; назначение битов команд АЦП приведено в уч. пособии на стр. 43)

ORG 8000H

Start:

; Определение констант

ADR_REGDAT_FOR_WRITE EQU 7FC2H ; адрес регистра данных ЖКИ для записи

ADR_REGCOM_FOR_WRITE EQU 7FC0H ; адрес регистра команд ЖКИ для записи

LCD_INTERFACE EQU 38H ; код команды выбора интерфейса (8 разрядов)

; количества строк (2 строки), размера символов (5х7)

MOVING_SYMBOL_RIGHT EQU 06H ; инкремент счетчика адресов, т.е.

; выбор направления сдвига курсора (слева направо),

; без сдвига экрана

LCD_CLEAR EQU 01H ; очистка экрана

LCD_ON EQU 0CH ; включение экрана

SECOND_LINE EQU 0C0H ; переход на вторую строку

; Инициализация ЖКИ-модуля

MOV DPTR,#ADR_REGCOM_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#LCD_INTERFACE ; код команды выбора интерфейса

MOVX @DPTR,A ; запись кода команды в регистр команд

CALL DELAY16ms ; задержка на время выполнения команды

; (вызов подпрограммы задержки DELAY5ms)

MOV A,#MOVING_SYMBOL_RIGHT ; код команды инкремента счетчика адресов после записи

MOVX @DPTR,A

CALL DELAY16ms

MOV A,#LCD_CLEAR ; очистка экрана

MOVX @DPTR,A

CALL DELAY16ms

MOV A,#LCD_ON ; включение экрана

MOVX @DPTR,A

CALL DELAY16ms

; Заполнения массива во внутренней памяти (6 элементов)

MOV 10H, #3

MOV 11H, #45

MOV 12H, #55

MOV 13H, #60

MOV 14H, #5

MOV 15H, #10

; Вывод элементов массива на ЖКИ

MOV R1, #10H ;Адрес начала массива в памяти

MOV R0, #6 ;Число элементов массива

LOOP_2: MOV A, @R1

INC R1

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

CALL NUM_OUT2

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#' ' ; Пробел

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

DJNZ R0, LOOP_2

; Снятие показаний с 0-го входа АЦП

ADC_COM_ADR EQU 0C5H ; адрес регистра команд АЦП

ADC_DAT_ADR EQU 0C6H ; адрес регистра данных АЦП

MOV ADC_DAT_ADR,#0H ; обнуление регистра данных АЦП

MOV ADC_COM_ADR,#00101000B ; команда начала аналого-цифрового преобразования

; сигнала с 0-го входа АЦП

IDET_ACP: MOV A,ADC_COM_ADR ; ожидание завершения преобразования

JB ACC.3,IDET_ACP ; Если 3-й бит регистра команд АЦП равен 1,

; следовательно преобразование еще не закончено.

MOV A,ADC_DAT_ADR ; считывание старших 8 разрядов результата

; преобразования в аккумулятор

MOV 9H, A ;Число, снятое с АЦП по адресу 9H

MOV 8H, #0 ;Число элементов, больше чем АЦП

MOV R1, #10H ;Адрес начала массива в памяти

MOV R0, #6 ;Число элементов массива

LOOP_3: MOV A, @R1 ;Загружаем текущий элемент в A

INC R1

DJNZ R0, NEXT_2 ;Цикл до конца массива

JMP NEXT

NEXT_2: CJNE A, 9H, DAL

JMP LOOP_3

DAL: JNC LOOP_3

MOV A, 8H ;Увеличиваем число элементов, снятых с АЦП

INC A

MOV 8H, A

JMP LOOP_3

NEXT: MOV DPTR,#ADR_REGCOM_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#SECOND_LINE ; Переход на вторую строку

MOVX @DPTR,A

CALL DELAY16ms

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A, 8H

CALL NUM_OUT2 ;Кол-во элементов, большее, чем АЦП

;Выводим значение АЦП

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#' ' ; Пробел

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

MOV A,#'(' ; Скобка

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

MOV A, 9H ; Выводим показания АЦП

CALL NUM_OUT2

MOV DPTR,#ADR_REGDAT_FOR_WRITE ; (DPTR) <- 7FC0H

MOV A,#')' ; Скобк

MOVX @DPTR,A ; запись в регистр данных

CALL DELAY16ms

JMP LOOP ; Конец программы

; Выделение цифр числа (справа налево) и запись цифр в стек

NUM_OUT2: MOV R3,#0H ; R3-содержит количество десятичных цифр в числе

Get_cifr: MOV B,#0AH ; (B) <- 0AH

DIV AB ; (A) <- (A)/(B), (B) <- остаток от деления

; Остаток от деления числа на 10 является очередной десятичной цифрой числа

PUSH B ; (СТЕК) <- (B) (Запись цифры в стек)

INC R3 ; (R3) <- (R3) + 1

CJNE A,#0H,Get_cifr ; Проверка (A) на равенство 0

; Если (A) = 0, то все цифры числа выделены

; Если (A) != 0, то переход по метке Get_cifr

; Вывод цифр числа (слева направо) на ЖКИ

Num_out: POP 10H ; (ОЗУ[10H]) <- (СТЕК)

MOV A,10H ; (A) <- (ОЗУ[10H])

ADD A,#30H ; (A) <- (A) + 30H

; Преобразование цифр в соответствующие ASCII-коды

; (30H - ASCII-код цифры '0')

MOVX @DPTR,A

CALL DELAY16ms

DJNZ R3,Num_out ; Все ли цифры выведены?

RET

LOOP: SJMP LOOP ; Конец программы

; Подпрограмма задержки на 1 мс

; Тактовая частота микроконтроллера 11059 кГц

; В одном машинном цикле 12 тактов

; Команда DJNZ выполняется за 2 машинных цикла

; Подпрограмма выполяется за T=25*18*2 ~ 11059 тактов, т.е. за 1 мс

DELAY1ms: MOV R1,#25

L1: MOV R2,#18

L2: DJNZ R2,L2

DJNZ R1,L1

RET ; Возврат из подпрограммы

; Подпрограмма задержки на 4 мс

DELAY4ms: CALL DELAY1ms

CALL DELAY1ms

CALL DELAY1ms

CALL DELAY1ms

RET ; Возврат из подпрограммы

; Подпрограмма задержки на 16 мс

DELAY16ms: CALL DELAY4ms

CALL DELAY4ms

CALL DELAY4ms

CALL DELAY4ms

RET ; Возврат из подпрограммы

; Обработчики прерываний.

Ext1Srv: RETI

Time0Srv: RETI

Time1Srv: RETI

RiTiSrv: RETI

Ext0Srv: RETI

RetIE0: RETI

END

Сама программа ошибок не выдает, выводит значения на экран ЖКИ. Но преподаватель не хочет смотреть, говорит что не праильно скомпанована.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

С праздником.

И Вас с праздником!

По программе:

- для какой конкретно задачи эта программа Вами составлена, опишите по кускам текста пожалуйста;

- препод прав. Листинг программы для ассемблера ядра MCS-51 должен стремиться к такому:

1. директивы ассемблеру.

2. присвоение тектовым меткам числовых значений.

3. первый ORG.

4. вектора прерываний (можно пропустить).

5. второй ORG (можно пропустить).

6. последовательный вызов процедур при помощи CALL.

7. вечный цикл (или повтор п.6).

8. одна процедура со своей командой RET.

9. другая процедура со своей командой RET.

... N-ая процедура со своей командой RET.

Давайте перепишем текст вместе, скажите только что он должен делать.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Здравствуйте. Чтобы не открывать новую тему по примитивному вопросу. На фото выше справа вверху стоит ионистор. На этой плате никаких элементов памяти я не вижу, поэтому скорее всего питание с ионистора подается вверх - на плату с МК.   Правильно ли я понимаю, что ионистор нужен для хранения текущего времени, а рабочая программа хранится в eeprom или flash на плате с МК (или в кишках самого МК)? Вопрос связан с тем, что прежде чем чинить эту LOGO, надо знать, сохранилась ли в нем программа. А чтобы узнать, сохранилась ли в нем программа, надо иметь соответствующую приблуду. Приблуду можно сотворить и самому, но если программа все-таки хранится в sram с питанием от ионистора, то никакого смысла делать приблуду нет, как и чинить LOGO. Просьба просветить, кто в курсе месте хранения рабочей программы в siemens logo. LOGO само собой старый: 6ED1052-1MD00-OBA5  
    • Против разумной, никаких. Кашкаровшина к ней не относится.
    • Таки делаю правильно, из за 50 гигов диск не попру никуда.
    • Доступ к файлам проекта, серверной части и график дизайнеру есть?
    • Эта платка напрямую к УСБ подключается, я через Arduino IDE заливал тот код, как в статье. Может правда панели плохие. Ножки не смог к плате припаять, припой вообще не ложился, поэтому проводочки только. Спасибо, а второй конденсатор обычный на 100 нанофарад? диод который уже у меня есть, его можно оставить? А код через арудино также заливать?
    • Проблема со щелчками в SMSL SU-1 - ошибка проектирования. Поставили туда модный разъём USB-C, но все кабели для них тонкие и дешёвые, практически без экранирования, и они прекрасно ловят наводки от сети в виде тихих раздражающих щелчков. Особенно если кабель лежит на силовых проводах от другой техники. Старые же USB-C кабели от принтеров и сканеров имеют хорошее плетёное экранирование и наводкам не подвержены. Поэтому меняйте свои ужасные SMSL SU-1 на прекрасный TOPPING DX-1, там ещё и усилитель для наушников есть.
    • "Умные" по форумам не шляются . Оформление в корпусе надо знать для начала .  А так , если не хватает естественной конвекции добавляют дополнительную . Тепловые трубки , антифриз и т.п. . Но это будет ставится в предполагаемый конструктив .   
×
×
  • Создать...