Настройка обмена по последовательному каналу со скоростью 9600 при частоте кварца 22 118Мгц.
push IE ; clr EA ;
clr TR1 ; останавливаем таймер 1 anl TMOD,#0Fh ; таймер 1 в режим 2 и в тоже время orl TMOD,#20h ; не портим настройки таймера 0
mov TH1,#0FAh ; значение для скорости 4800 при кварце 11 059, mov TL1,#0FAh ; но у нас частота кварца в 2 раза выше...
mov A,PCON ; сбрасываем бит удвоения скорости (SMOD) clr ACC.7 ; если установить в 1, то получим скорость 19200 mov PCON,A ;
setb RXD ; на всякий случай. setb TXD ;
mov SCON,#60h ; установка режима, сброс битов RI, TI, REN
setb TR1 ; запуск таймера 1 pop IE ;
Для разрешения приема в программе установить бит REN в 1 и запретить или разрешить прерывание RS. Это (REN=1) можно сделать и при настройке загрузив в SCON не 60Н, а 70Н.
Учтите, что управление прерыванию последовательного порта передается по RI=1 ИЛИ TI=1, то есть при входе в прерывание нужно анализировать оба этих бита. В коде программы:
setb REN ; разрешаем прием setb ES ; разрешаем прерывание
Если прием/передача в каком-то месте осуществляется в обход вектора последовательного порта, не забывайте запрещать его.
В Вашей функции передачи байта прерывание не запрещается, и после окончания передачи байта управление передается вектору последовательного порта, а так как анализа бита TI и его сброса не производится, то программа может на этом зациклится.
Ну и значения TH1 и бита SMOD для различных скоростей (кварц 22 118):
9600 FA 0 19200 FD 0 38400 FD 1 57600 FF 0 115200 FF 1
ДЛя кварца 11 059 разумеется настройки будут другие.
|