С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/143: Рейтинг темы: голосов - 143, средняя оценка - 4.56
siry

Код для at89c51 в keil uvision

27.08.2013, 00:38. Показов 30399. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Я догадывался, что рано или поздно придется программировать. Этот день наступил. Необходимо написать программу для тестирования параметров данного мк. Писать решил на ассемблере. До этого писал пару программок в паскале аля п ничего не писал.
Хочу спросить, будет ли работать то, что я написал (это кусок того, что надо сделать)? Если нет, то какие ошибки здесь есть (то есть, это и так все одна большая ошибка..)?
Здесь проверяю напряжения высоких/низких уровней... где-то.. Адреса этих "где-то" взял в файле, где sfr разные (0x80,0x8E).
В чем суть. Мк ждет сигнала на одном из пинов порта 2 (0xA0). Когда фиксирует этот импульс, ищет в таклице команд нужную и переходит на выполнение этой команды в самом коде.
Я уверен, что работать не будет. Возможность проверить в деле будет только через неделю.

Спасибо.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
NAME   AT89
sbit   Uoh      =   P2^2
sbit   Uol      =   P2^3
sbit   Uoh1   =   P2^4
sbit   Uol1   =   P2^5
port2_to_1   BIT      0xA0
 
WAITHIGH:   JB       0xA0,0               ; woyting for strobe on port 2
LJMP WAITHIGH
WAITLOW:   JNB    0xA0,0
LJMP WAITLOW
;MOV      DPTR,#0xA0                  ; save 1 or 0 to data pointer omd looking for a sommomd in the table
LCALL   LOW(TABLE<<1)         ;looking for a sommomd in the table
LCALL   HIGH(TABLE<<1)
SITB   port2_to_1
 
PORTHIGH:   CLR      0x90                  ;HIGH level on port 1,2,3
CLR      0xA0
CLR      0xB0
SITB   0x90
SITB   0xA0
SITB   0xB0
SITB   port2_to_1
 
PORTLOW:   CLR      0xA0                  ;LOW level on port 1,2,3
CLR      0xA0
CLR      0xB0
SITB   port2_to_1
 
PORTHIGH1:   CLR      0x80                  ;HIGH level on port 0,ALE,PSEN
CLR      0x8E                  ;set 0 to ALE
SITB   0x80
SITB   0x8E
SITB   port2_to_1
 
PORTLOW1:   CLR      0xA0                  ;LOW level on port 0,ALE,PSEN
CLR      0x8E
SITB   port2_to_1
 
TABLE:      DB   Uoh,LOW(PORTHIGH),HIGH(PORTHIGH),      Uol,LOW(PORTLOW),HIGH(PORTLOW)
DB   Uoh1,LOW(PORTHIGH),HIGH(PORTHIGH),      Uol1,LOW(PORTLOW1),HIGH(PORTLOW1)
END
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2013, 00:38
Ответы с готовыми решениями:

Подпрограмма для keil uvision 8051
Напишите пожалуйста такую подпрограмму для 8051, а то у меня с ассемблером все плохо /Реализовать подпрограмму, копирующую большой блок...

Keil Uvision 4 , МК51
Люди добрые, выручайте!) Как в 51 работать с портами по указателю?? Нужно сделать универсальную функцию, в параметрах которой...

Работа с Keil uVision
Здравствуйте! Подскажите по Keil uVision, был установлен Keil С51 uVision 4.22 раньше я работал только с МК С51, теперь установил MDK ARM...

36
siry
29.08.2013, 16:10
Студворк — интернет-сервис помощи студентам
Code
1
2
3
4
5
KEY0   BIT      P0.0            ; аппаратный флаг 0
KEY1   BIT      P0.1            ; аппаратный флаг 1
KEY2   BIT      P0.2            ; аппаратный флаг 2
KEY3   BIT      P0.3            ; аппаратный флаг 3
KEY4   BIT      P0.4            ; аппаратный флаг 4
Мм, тут, кажется, недопонимание получилось.
Code
1
2
3
4
5
JBC   P0.0,Uol
JBC   P0.1,Uol1
JBC   P0.2,Uoh
JBC   P0.3,Uoh1
JBC P0.4,Ipd
этим я жду сигнала на пинах, чтобы начать выполнение команд.

KEY0 BIT P0.0 и тд в вашем варианте - это мои SITB P0.0, SITB P1.0? Просто хочу быть уверен.

С ALE меня сбило то, что в даташите написаны значения низкого/высокого уровня на нем.

апдэйт. понял про KEY, P0

апдэйт2.
Code
1
RSEG   PROG          ; в начале кодового сегмента размещаем сегмент PROG
Мозг не понимает смысл слова PROG в PROG SEGMENT CODE. Для меня сейчас это нечто, которое мы нигде не обозначили.
siry
29.08.2013, 16:16
То есть получается, что в общем и целом логику программы я составил верно, а осталось нормально определять секцию программы, писать все в нормальном порядке, разделяя подпрограммы и основную часть?
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.08.2013, 16:29
Цитата Сообщение от siry
То есть получается, что в общем и целом логику программы я составил верно...
Про логику, а тем более работу еще рано говорить, надо тестировать. В том же Proteus. Я пока говорил только о правильном оформлении.
Вы можете написать:
Code
1
2
WAITHIGH SEGMENT   CODE
RSEG   WAITHIGH
Здесь "WAITHIGH" - имя сегмента, так понятнее?
Где нибудь в конце листинга (или в другом файле) может быть таблица с константами:
Code
1
2
TABLE SEGMENT   CODE
RSEG   TABLE
Первый сегмент всегда следует за строкой
Code
1
   CSEG  AT   0              ; начало кодового сегмента с адреса 0000
Остальные компилятор размещает как ему удобнее.
0
siry
29.08.2013, 18:39
Ну woythigh здесь - определенный кусок кода. А PROG нигде не написано же, кроме того места. Ээээ... Секунду, имя сегмента? Ааааа, то есть это мы чисто символически называем так сегмент.
Но ведь The RSEG directive selects a generic sikmimt that was previously declared using the SEGMENT directive. Woythigh у меня определено, что такое (ну под ним кроются строчки кода). Но под PROG же у меня ничего нет..
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
29.08.2013, 18:46
Цитата Сообщение от siry
... Woythigh у меня определено, что такое (ну под ним кроются строчки кода). Но под PROG же у меня ничего нет..
Да определено, но ваша запись программы нестандартна, с ходу разобраться сложно. Я же привел стандартную запись, которую любой программист легко поймет.
По сути любая программа для МК имеет такой рабочий цикл:
Code
1
2
3
4
5
6
Start: ;"INITIALIZE"
;   MOV      SP, #STACK-1        ; инициализируем стек
;...
Main: ; "WAITHIGH"
;...
AJMP   Main
Ну зачем для главного цикла придумывать свое название WAITHIGH?
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
30.08.2013, 01:27
WAITHIGH: ;ожидание напряжения высокого уровня на одном из пинов
JBC P0.0,Uol
JBC P0.1,Uol1
JBC P0.2,Uoh
JBC P0.3,Uoh1
JBC P0.4,Ipd
LJMP WAITHIGH ;если высокий уровень не обнаружен, то все еще ждем его
Такая программа работать будет, но незнаю на сколько долго. Не знаю твою схемотехнику.
А причина в том, что выводы портов представляют собой схему с открытым стоком. Получается монтажное И.
Строчка типа
JBC P0.0,Uol
после проверки бита сбрасывает его в ноль, т.е. выдает на соответствующий вывод лог. 0. А если в этот момент схема подающая сигнал начнет подавать лог. 1.?
И если выход этой схемы не типа открытый сток (коллектор), да еще вдруг буфферезирован, то порт твоего МК может выйти из строя. Делай выводы.
Замени просто на JB P0.0
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
31.08.2013, 15:14
Уместно будет добавить про команды перехода (JMP, AJMP, SJMP, LJMP) и вызова (ACALL, LCALL).
Они имеют разную область видимости и не всегда очевидно где применить одну, где другую.
Ассемблер uVision A51 допускает использование обобщенного имени команд JMP и CALL, которые в процессе трансляции заменяются оптимальными по формату командами перехода или вызова.
Поэтому можно везде применять JMP и CALL, препроцесор заменит их оптимальными.
0
siry
01.09.2013, 10:40
Ну зачем для главного цикла придумывать свое название WAITHIGH?
Чтобы уже распутаться. stort и main НЕ служебные слова? А Prok? Я просто из записи не понимаю, какой кусок кода мы относим к data.
________________________________________ _____________
А если в этот момент схема подающая сигнал начнет подавать лог. 1.?
Да, такое может быть. Заменю на JB.
________________________________________ _____________
Цитата Сообщение от omokost
Уместно будет добавить про команды перехода (JMP, AJMP, SJMP, LJMP) и вызова (ACALL, LCALL).
Они имеют разную область видимости и не всегда очевидно где применить одну, где другую.
Ассемблер uVision A51 допускает использование обобщенного имени команд JMP и CALL, которые в процессе трансляции заменяются оптимальными по формату командами перехода или вызова.
Поэтому можно везде применять JMP и CALL, препроцесор заменит их оптимальными.
Понял. Но только ведь CALL нет в наборе команд для 8051.
Oxford
01.09.2013, 10:53
Не надоело на асме писать?
siry
01.09.2013, 12:25
Так я первый раз вообще пишу.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
01.09.2013, 13:15
Цитата Сообщение от siry
Понял. Но только ведь CALL нет в наборе команд для 8051.
"CALL", "ACALL", "LCALL" - это мнемонические имена, т.е.зависят от применяемого Ассемблера. Вам же написали:
Цитата Сообщение от omokost
Ассемблер uVision A51 допускает использование обобщенного имени команд JMP и CALL, которые в процессе трансляции заменяются оптимальными по формату командами перехода или вызова.
Поэтому можно везде применять JMP и CALL, препроцесор заменит их оптимальными.
0
siry
01.09.2013, 14:38
Аа, понял!
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
01.09.2013, 22:22
Цитата Сообщение от siry
Чтобы уже распутаться. stort и main НЕ служебные слова? А Prok? Я просто из записи не понимаю, какой кусок кода мы относим к data...
Start и Main это обычные метки которыми начинаются секции инициализации и главного цикла. Их имена не зарезервированы, они общеприняты. Prok это имя кодового сегмента, может быть любым подходящим по смыслу к тому что делает код. При желании можно дать и бессмысленное имя.
У вас в голове полная каша, к data мы ничего не можем относить, т.к. этот сегмент не обьявлен и не задействован. Ну нет у вас переменных...
0
siry
03.09.2013, 15:38
мм, про дату и код я просто ошибся. что у меня переменных нет это я помню.
siry
03.09.2013, 18:34
Еще вот непонятно. Надо бы проверить, как работает юарт, таймеры. Ну еще можно флэш-память, но в последний момент,т.к. мне кажется, это самое сложное.
Вот с юартом. Хочу просто с ножки TX передать что-то через, грубо говоря, перемычку, получить это на RX, сравнить. если полученное равно отправленному, то выставить соответствующий флаг.
Смотрю пример. И, я так понимаю, мне в основном интересны только две строчки:
Code
1
2
MOV A,SBUF                  ; read data from uart
MOV SBUF,A             ; write same data to uart
Получается, для этого код будет выглядеть примерно так?
Code
1
2
3
4
5
6
MOV SCON,#50h;                 /* uart in mode 1 (8 bit), REN=1 */
в этой строчке, судя по всему, надо в аккумулятор поместить передаваемое нечто
MOV SBUF,A             ; write same data to uart
MOV A,SBUF                  ; read data from uart
а в этой строчке как-то сравнить полученное с тем, что передавали (вот правда нет противоположного CJNE)
выставить флаг
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
03.09.2013, 20:43
Цитата Сообщение от siry
Еще вот непонятно. Надо бы проверить...
Именно для этого существуют средства моделирования и симуляции электронных схем. Применительно к МК это Proteus. Серию at89c51 он поддерживает полностью. Если бы выложили проект в Proteus, помощь была бы конкретнее. А пока вот бы, надо бы...
0
shp
10.09.2013, 01:49
siry, все же советую писать на Си. Сэкономленное время лучше потратьте на изучение контроллера и других штук. При этом в итоге можно получить также очень компактный и быстрый бинарник, если иметь прямые руки и почаще заглядывать в отладчик, что там из вашего сишного кода получается на выходе.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2013, 01:49
Помогаю со студенческими работами здесь

Как добавить микросхему в Keil uVision 4?
Скачал Keil uVision for C51 v9.00 с рутрекера, после чего ее установил. Далее, при попытке создать проект, а проект мне нужно создать для...

Ошибки про сборке проекта в Keil uVision 5
Доброго времени суток. Проблема такова: создал проект в CubeMX под плату stm32f4discovery, добавил файлы для работы с гироскопом MPU6050,...

Keil uVision. Получить частоту внешнего генератора
Пишу программу на Си с использованием keiluvision Задача: Получить частоту внешнего генератора и вывести на дисплей Использовать: ...

Программирование арифметических операций (i8051 Keil uVision)
Переход от двоичного формата к двоично-десятичному (целые числа без знака). Задано двухбайтовое двоичное число. В четырех последовательных...

Keil uVision. Как просмотреть assembler code программы на Си?
Пишу на С. Можно ли как-то посмотреть как кеил компилирует мой код? Получить на выходе файл .asm .s ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru