Цитата(snake7778 @ Apr 29 2012, 13:01)

Вот такая проблема не работает прерывание по UART
Код
start:
SETB EA
SETB ES
MOV P1, #0Ah
jmp start
Тут постоянно перезаписывается содержимое P1, так что даже если прерывание будет работать, всё равно это можно будет только осциллографом в виде коротких имупльсов увидеть, а не глазами или тестером. Но оно работать не будет — UART тут не настроен, а настраивается аж здесь:
Код
UART: MOV SCON, #052h
MOV TMOD, #020h
MOV TH1, #0F3h
SETB TCON.6
CIN: JNB RI, CIN
MOV B, SBUF
CLR RI
...
Это как бы обработчик прерівания, но в нём зачем-то каждый раз переиницилизируется UART и дальше работа опросом, без прерываний вообще.
Хорошо, что без reti уровень приоритета не очищается и второе прерывание не пройдёт. Оно и первое не пройдёт, причина выше, но если бы UART был настроен в начале, то первое прошло бы. Но возвратов из прерываний нет, так что если бы второе и последующие прошли бы, то они быстро сожрали бы стек (который, кстати, желательно бы инициализировать за концом используемой под переменнные памяти, а не оставлять в месте и с размером по умолчанию).
Определитесь — в прерываниях работать нужно или достаточно цикла с опросом. Если прерывания, то надо бы и PSW да используемые регистры сохранять, и возврат делать.
Код
MOV A, B
SUBB A, #031h
jz n_1
MOV A, B
SUBB A, #032h
jz n_2
...
n_1:
MOV P1, #01h
JMP CIN
...
Ой мама... Ну во-первых, зачем вычитание с заёмом?
Во вторых — в таких случаях я обычно говорю «зачем тогда писать на ассемблере — С-компилятор лучше код сгенерирует». Защитники_ассемблера_от_меня при этом обижаются «тут тема про ассемблер, при чём тут С».
Если очень уж не хочется терять универсальность заменой проверки каждого варианта отдельно проверкой на диапазон мин-макс (031h-036h) и вычитание 030h, то хоть так:
Код
MOV A, B
CJNE A, #031h, not_1
MOV P1, #01h
JMP CIN
not_1:
CJNE A, #032h, not_2
MOV P1, #02h
JMP CIN
not_2:
...
not_5:
CJNE A, #036h, CIN
MOV P1, #06h
JMP CIN
В два раза короче и в полтора раза быстрее, если мне не изменяет память, не тренировавшаяся на MCS51 уже лет двенадцать.