моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Сообщения в блогах, написанные другими блоггерами CSDN, весьма хороши. Если вы хотите узнать о последовательном порте UART микроконтроллера 51, вы можете нажать и посмотреть:
Асинхронная связьЭто означает, что интервал времени между двумя символами (8 бит) при обмене данными не фиксирован, а интервал времени между битами в пределах одного символа равенстабильный。
Последовательная связь UART является наиболее часто используемой технологией связи для микроконтроллеров. Обычно она используется для связи между микроконтроллерами и компьютерами, а также между микроконтроллерами.
Общение можно разделить на основные видыПараллельная связьипоследовательная связь, При параллельной связи каждый бит данных передается одновременно, и связь может быть реализована в байтах. Однако несколько линий связи занимают много ресурсов и являются дорогостоящими. Например, P0 = 0xFF, использованный ранее; присваивайте значения 8 портам ввода-вывода P0 одновременно и выдавайте сигналы одновременно, аналогично 8 полосам, которые могут одновременно пропускать 8 автомобилей. Эту форму принято называть P0, P1, P2 и P3 — четырьмя наборами параллельных шин 51-го микроконтроллера.
Последовательная связь подобна полосе движения, одновременно может проезжать только одна машина.Если необходимо передать байт данных типа 0xFF, предполагая, что автомобиль получает 1-битные данные, то для этого потребуется более 8 автомобилей.тот же интервал времениПереходите одну и ту же полосу последовательно.
Разница между синхронной связью и асинхронной связью:
1. Синхронная связь требует, чтобы тактовая частота принимающей стороны соответствовала тактовой частоте передающей стороны, а передающая сторона отправляла непрерывный поток битов. Асинхронная связь не требует синхронизации тактовой частоты принимающей стороны и тактовой частоты передающей стороны; После того, как передающая сторона отправит байт, он может пройти любой длительный интервал времени, прежде чем отправить следующий байт.
2. Синхронная связь имеет высокую эффективность, а асинхронная — низкую.
3. Синхронная связь более сложна, и допустимая погрешность часов обеих сторон невелика; асинхронная связь проста, и часы обеих сторон могут допускать определенную ошибку.
4. Синхронная связь подходит только для двухточечной связи, а асинхронная связь может использоваться для двухточечной связи.
Микроконтроллер STC89C52 имеет два контакта, специально предназначенных для последовательной связи UART: один — P3^0, а другой — P3^1. Они также имеют другие названия, называемые RXD (прием данных) и TXD (передача данных) соответственно. их называют последовательным интерфейсом. Как показано на рисунке:
Связь между микроконтроллером и микроконтроллером:
На рисунке GND представляет собой опорную землю источника питания системы микроконтроллера. TXD называется последовательным выводом передачи, а RXD — последовательным приемным выводом.
Для связи между двумя микроконтроллерами, прежде всего, источник питания должен быть одинаковым, поэтому GND двух микроконтроллеров должны быть соединены друг с другом.Затем вывод TXD MCU 1 подключается к выводу RXD MCU 2. Функция заключается в том, что MCU 1 отправляет информацию в MCU 2. (Этот процесс разделен на две части. MCU 1отправить сигналПроцесс с микроконтроллером 2получить сигналПроцесс) Таким же образом вывод TXD микроконтроллера 2 подключается к выводу RXD микроконтроллера 1.
Эта принципиальная схема отражает процесс отправки и получения информации двумя микроконтроллерами друг другу.
Когда микроконтроллер 1 хочет отправить данные микроконтроллеру 2, например, отправляя данные 1 0xE4, выраженные в двоичной форме:
0b1110 0100, микроконтроллер 1 сталкивается с несколькими проблемами перед началом передачи:
Предположим, я сначала передаю младший бит 0, затем мне нужно установить порт TXD микроконтроллера 1 на низкий уровень.
Микроконтроллеры обычно относятся к уровню TTL или CMOS. Для стандартов уровня TTL/CMOS:
Все, что выше 2,0 В, является высоким уровнем, что-то менее 0,0 В — низким уровнем, а все, что находится между ними, не является ни высоким, ни низким уровнем. Логика между ними может сбить с толку и может быть оценена устройством. высокий уровень, его также можно расценивать как низкий уровень. Поэтому старайтесь не эксплуатировать схему в этой зоне. Находясь в этой зоне, ваш продукт может оказаться успешным или неудачным. Поэтому при разработке изделий необходимо проверять паспорт устройства и напряжение во время работы схемы, чтобы убедиться в том, что оно находится на подходящем напряжении.
1. Уровень ТТЛ:
Высокий выходной уровень >2,4 В, низкий выходной уровень <0,4 В. При комнатной температуре общий высокий уровень выхода составляет 3,5 В, а низкий уровень выхода — 0,2 В. Минимальный входной высокий и низкий уровень: входной высокий уровень >=2,0 В, входной низкий уровень <=0,8 В, запас по шуму составляет 0,4 В.
2. Уровень КМОП:
1логический уровень Напряжение близко к напряжению питания, а уровень логического 0 близок к 0В. И имеет широкую шумоустойчивость.
Итак, возникает вопрос:
Когда информация не передается или не принимается, порт передачи (TXD) микроконтроллера 1 будет находиться на высоком или низком уровне, или напряжение порта находится между ними. Напряжение порта приема (RXD) MCU 2 соответствует напряжению порта передачи MCU 1. Как установить сигнал о том, что MCU 1 собирается начать передачу информации, то есть как MCU 2 узнает, что MCU 1 передал ему информацию? Поэтому существует необходимость стандартизации стандартов связи.
Шаг 1: Оговорено, что при отсутствии связи напряжение портов TXD и RXD микроконтроллера остается высоким.
Шаг 2. Стандартизируйте метод передачи данных, как показано ниже.
Вы можете видеть, что он определяет 1 стартовый бит, 1 стоповый бит плюс 1 байт передаваемых данных, что в общей сложности составляет 8 бит.Десятизначные данные。
Вышеупомянутая передача данных 0xE4 фактически передает 0 1110 0100 1. Передача 1 байта данных от MCU 1 к MCU 2 фактически передает 10-битные данные. Это 10-битное целое называется полным последовательным кадром данных.
С помощью стартового и стопового битов порт RXD микроконтроллера 2 начинает готовиться к приему данных, когда он обнаруживает низкий уровень. Таким же образом, если микроконтроллер 1 хочет отправить 1 байт данных, ему необходимо сначала отправить стартовый бит 0 (сообщить микроконтроллеру 2 подготовить его к приему), а затем отправить стоповый бит 1 (сообщить микроконтроллеру 2 байты передача данных завершена).И при передаче данных этоСначала низкий, затем высокийЗаказ
Шаг 3: Вам необходимо равномерно установить время, необходимое для передачи 1 бита данных. Скорость этого времени выражается скоростью передачи данных (бод). Скорость передачи данных, равная 1, означает передачу 1 бита данных за 1 секунду, а скорость передачи данных 9600 означает передачу 9600 бит данных за 1 секунду.
Тогда получаем результат передачи 1 битадлительность=1/бод., то время передачи одного полного кадра данных будет равно10/бод,Временной интервал между кадрами данных произвольный.
Когда MCU 1 и MCU 2 передают сигналы, их скорость передачи должна быть установлена одинаковой для достижения правильной связи.
В первые годы существования настольных компьютеров обычно использовался 9-контактный последовательный интерфейс. Этот последовательный интерфейс называется интерфейсом RS-232 и связан с связью UART. Однако современные ноутбуки больше не имеют этого 9-контактного последовательного интерфейса. поэтому для связи с микроконтроллерами все чаще используются виртуальные последовательные порты USB.
Логика уровня, используемая RS232, представляет собой отрицательную логику, которая отличается от логических уровней TTL/CMOS.
Следовательно, 9-контактный последовательный порт RS232 компьютера не может быть напрямую подключен к микроконтроллеру. Для завершения следующего рисунка требуется микросхема преобразования уровней MAX232:
Описание контакта RS232:
1. Обнаружение несущей DCD (обнаружение несущей данных) 2. Прием данных RXD 3. Отправка данных TXD
4. Терминал данных готов к DTR (Готов к использованию терминала данных) 5. Сигнальная земля 6. Готовность данных DSR (Готовый набор данных)
7. Запрос на отправку РТС (Запрос на отправку) 8. Очистите и отправьте CTS(Очистить для отправки) 9. Звонок с подсказкой RI(Звон)
Как показано на рисунке выше, при подключении последовательного порта RS232 связь может быть завершена, пока контакты 2, 3 и 5 подключены к соответствующим контактам MAX232.
С развитием технологий связь через последовательный порт RS-232 широко используется в промышленности. Однако в коммерческих технологиях технология USB-UART постепенно вытеснила последовательный порт RS232.
Итак, как реализовать связь между микроконтроллером и компьютером, как показано на рисунке?
В данном случае это плата разработки, которая использует микросхему USB-последовательный порт CH340T для достижения этой функции.
Порт TXD микроконтроллера использует перемычку для подключения к USB-TX и одновременно подключается к порту RXD контакта 4 CH340.
Порт микроконтроллера RXD использует перемычку для подключения к USB-RX и подключается к 3-му контакту TXD CH340.
Вы можете видеть, что между USB-RX и третьим выводом TXD CH340 последовательно включен диод 4148, поскольку микроконтроллеру STC89C52 требуется холодный старт при загрузке программы. Просто сначала нажмите «Загрузить», а затем включите питание.
так называемыеХолодный запуск Это относится к процессу запуска микроконтроллера от выключения до включения питания, тогда как горячий старт означает, что микроконтроллер всегда включен; Разница между холодным стартом и горячим стартом заключается в том, что при холодном старте значения во внутренней оперативной памяти микроконтроллера являются случайными величинами, а при горячем старте значения во внутренней оперативной памяти микроконтроллера не изменяются и остаются такими же, как и до запуска.
В момент включения микроконтроллер сначала определит, нужно ли загружать программу, хотя VCC микроконтроллера управляется переключателем, ведь вывод 3 CH340T является выходным, если такового нет. диод, последующий микроконтроллер переключателя выйдет из строя при отключении питания. Контакт 3 CH340T подключен к контакту P3.0 (RXD) микроконтроллера. Ток будет течь в цепь последующего каскада через этот контакт и заряжать конденсатор. на следующем этапе, что приводит к определенному напряжению на следующем этапе. Это напряжение Хотя значение составляет всего около 2–3 В, оно может повлиять на нормальный холодный запуск. После добавления диода это с одной стороны не влияет на связь, с другой стороны позволяет устранить этот негативный эффект.
Из руководства к микроконтроллеру я узнал, что P3.0 — это квази-двунаправленный порт ввода-вывода.
Часть красного прямоугольника — это квази-двунаправленный порт ввода-вывода. , когда внутренний выходной бит имеет низкий уровень, через затвор НЕ база транзистора находится на высоком уровне, транзистор включен (напряжение на обоих концах CE почти одинаково при насыщенной проводимости), и IO Порт микроконтроллера выдает низкий уровень независимо от внешнего состояния: нажат или поднят ключевой переключатель, порт ввода-вывода остается низким. То есть он не управляется внешними сигналами.
Когда внутренний выход имеет высокий уровень, после прохождения через затвор НЕ база транзистора чрезвычайно низкая, и транзистор не проводит ток (сопротивление на обоих концах CE очень велико, а сопротивление R незначительно по сравнению с это). В это время выходной сигнал порта ввода-вывода находится на высоком уровне. При нажатии кнопки порт ввода-вывода заземляется, а порт ввода-вывода выдает низкий уровень.
Отсюда видно, что только тогда, когдаВыход порта ввода-вывода имеет высокий уровенькогда,Выход порта ввода-вывода контролируется внешней схемой。
Таким образом, мы знаем, что внутренний выход P3.0 всегда высокий, когда он используется в качестве порта RXD.Порт P3.1TXD служит передатчиком и егоВнутренний выходной уровеньПри необходимости можно изменить вверх или вниз.
И: для уровней TTL
Выходной терминал: высокий уровень >=2,4 В, низкий уровень <=0,4 В;
Приемная сторона: высокий уровень >=2,0 В, низкий уровень <=0,8 В.
Для уровня COMS
Выходная клемма: высокий уровень = Vcc, низкий уровень = GND (Vcc — напряжение источника питания);
Приемная сторона: высокий уровень >=0,7Вcc, низкий уровень <=0,2Вcc.
Между логическим уровнем их приемной стороны и логическим уровнем выходной стороны все еще существует некоторая разница в напряжении. Это может быть связано с помехами при падении напряжения, возникающими во время передачи сигнала, или наличием схемы защиты, поэтому добавление диода не будет. Причина этого. Передаваемое напряжение находится в запутанной логической области.
Используйте порт ввода-вывода для имитации последовательной связи UART.
Верхняя программа:
- # include<reg52.h>
-
- sbit PIN_RXD = P3^0; //接受引脚定义
- sbit PIN_TXD = P3^1; //发送引脚定义
-
- bit RxdorTxd = 0; //指示当前状态为接受还是发送
- bit RxdEnd = 0; //接受结束标志
- bit TxdEnd = 0; //发送结束标志
- unsigned char RxdBuf = 0; //接收缓冲区
- unsigned char TxdBuf = 0; //发送缓冲器
-
- void ConfigUART(unsigned int baud);
- void StartTXD(unsigned char dat);
- void StartRXD();
-
-
- void main()
- {
- EA = 1; //打开总中断
- ConfigUART(9600); //配置波特率为9600
-
- while(1)
- {
- while(PIN_RXD); //等待接收引脚出现低电平,即起始位
- StartRXD(); //启动接收
- while(!RxdEnd); //等待接受完成
- StartTXD(RxdBuf +1);//接受到的整数+1后,发送回去
- while(!TxdEnd); //等待发送结束
- }
- }
-
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x02; //配置T0为模式2
- TH0 = 256 - (11059200/12)/baud; //计数T0的重载值
- }
-
- /* 启动串行接受 */
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为接受 1位发送
-
- }
-
- /* 启动串行发送,dat-待发送字节数据 */
- void StartTXD(unsigned char dat)
- {
- TxdBuf = dat; //待发送数据保存到发送缓冲器
- TL0 = TH0; //T0计算初值为重载值
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- PIN_TXD = 0; //发送起始位
- TxdEnd = 0; //清零发送结束标志
- RxdorTxd = 1; //设置当前状态为发送
- }
-
- /*T0中断服务函数,处理串行发送和接收 */
- void interruptTimer0() interrupt 1
- {
- static unsigned char cnt = 0;
-
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
-
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
-
- }
Карта логики работы
Эта программа использует таймер 0 для имитации последовательной связи UART. Обратите внимание, что это всего лишь операция.Программа моделирования. Эта программа реализует связь между компьютером и микроконтроллером. Результатом его связи является передача данных, передаваемых компьютером, на микроконтроллер, а микроконтроллер добавляет к данным 1 и отправляет их обратно на компьютер. Используйте помощник по отладке последовательного порта, поставляемый с STC-ISP, чтобы продемонстрировать этот результат.
Во-первых, убедитесь, что порты одинаковы. На приведенных выше изображениях все порты — COM3, скорость передачи данных — 9600, проверочный бит — НЕТ, бит данных — 8, а стоповый бит — 1. (Здесь установлено значение компьютера. параметры последовательного порта)
Посмотрите на результат: возможно нормальное общениеТаймер 0 имитирует последовательную связь_bilibili_bilibili
Кратко поясним логику работы этой программы: дляОтправить модульНапример, отправьте 0xAA = 1010 1010, начиная с младшего бита.
То есть TxdBuf = 1010 1010 Посмотрите программу
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
первыйВведите прерывание cnt = 1
PIN_TXD = TxdBuf & 0x01, то есть результат операции AND из 1010 1010 0000 0001 заключается в назначении младшего бита 0xAA порту отправки для включения соответствующего уровня. Видно, что напряжение, поступающее в порт TXD прерывания в первый раз, имеет низкий уровень, и этот процесс будет продолжаться до тех пор, пока не произойдет второе прерывание.
Затем TxdBuff сдвигается на один бит вправо, то есть TxdBuf = 0101 0101.
Затемвторой разпрерывать
кнт = 2
PIN_TXD = 1 На этот раз уровень передающего порта высокий.
TxdBuf = 0010 1010
Затем третий и четвертый раз, пока8-й раз
кнт = 8
Уровень, установленный PIN_TXD = 1, является высоким уровнем, который соответствует старшему биту 1 передаваемых данных.
В это время TxdBuf = 0x00
После этого9-й разВход в прерывание. 9-й вход в прерывание означает, что биты данных только что были отправлены и пришло время подготовиться к отправке стопового бита.
Следовательно, PIN_TXD = 1, порту отправки напрямую присваивается высокий уровень.
Последнее десятое прерывание означает, что стоповый бит также был отправлен.Следовательно, cnt reset присваивается значение 0, TR0 присваивается значение 0, таймер 0 отключается, TXDEnd = 1, флаг завершения передачи устанавливается в 1, и передача полного кадра данных завершается.
После этогоприемный модуль: Ранее мы отправили 0xAA. Для этой функции ее значение является результатом добавления 1 к полученным данным, поэтому полученные данные: 0xA9 = 1010 1001.
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为0接收 1为发送
-
- }
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
Видно, что процессы отправки и получения на самом деле аналогичны. Для получения данных я пометил первое прерывание как начинающееся с 0-го раза, главным образом для взаимодействия с cnt для простоты понимания.
Как показано на рисунке, вы можете видеть, что время, необходимое для входа в прерывание в 0-й раз, составляет половину заданного времени прерывания. Это связано с тем, что при подтверждении того, равен ли сигнал уровня 0 или 1, если уровень является самым ранним. во время выборки могут возникнуть ошибки или помехи, поэтому точка выборки обычно устанавливается в середине времени передачи сигнала, и сигнал уровня там рассматривается как сигнал, передаваемый в этот период времени. Следовательно, принимающему модулю необходимо установить время прерывания равным половине исходного только при первом получении стартового бита, чтобы гарантировать, что все последующие точки сбора сигнала находятся в центральной точке.
Давайте посмотрим, как настроена программа: TL0 = 256 - ((256-TH0) >> 1 //Принимаем время T0 равное половине периода скорости передачи при запуске);
256-TH0 — это заданное время прерывания. Ранее мы упоминали, что мы хотим, чтобы время прерывания было вдвое меньше предыдущего. Операция программы заключается в сдвиге его вправо на 1 бит. Возьмем пример двоичного числа 0000 1000. Сдвиг его вправо на 1 равен 0000 0100 = 4. Видно, что операция сдвига вправо на 1 бит заключается в изменении числа до половины исходного значения. Точно так же результат сдвига влево на 1 бит равен 0001 0000 =16, что означает умножение исходного числа на 2.
Запустить анализ процесса программы
Когда RxdorTxd равен 0, введите функцию else, то есть0-й раз Входя в прерывание, отправной точкой приемного модуля во временной области является середина стартового бита. Сначала определите, действительно ли напряжение порта низкое, а если нет, отключите прерывание. Зачем это делать?
Поскольку это приемный модуль, напряжение RXD не контролируется микроконтроллером. В этом случае оно контролируется компьютером, контролирующим напряжение терминала TXD CH340T. Напряжение RXD микроконтроллера следует за концом CH340TXD. На принимающей стороне полученная информация может быть искажена, и ее необходимо подтвердить еще раз.
Если да, cnt++, то cnt=1. RxdBuf = 0; очистить буфер приема до 0;
После этого1-й(правда, второй раз)Второсортный Введите прерывание cnt = 1 и введите функцию else if() для пошаговой передачи данных в буфер. Дальнейший процесс не будет подробно описываться, если заинтересованные читатели смогут пройти его самостоятельно согласно логике программы. Посмотрите, действительно ли данные могут быть сохранены в переменной буфера сначала в младших разрядах, а затем в старших разрядах. Как следует из предыдущего сообщения в блоге, функция использует метод сдвига влево для первого сохранения старших битов данных. Этот подход вполне дополняет другой способ работы.
На этом этапе программа использует таймер 0 для имитации последовательной связи UART.
Три основных типа общения
Симплексная связь: только одной стороне разрешено отправлять информацию другой стороне, а другая сторона не может отправлять обратно информацию, такую как пульты дистанционного управления телевизором, радиопередачи и т. д.
Полудуплексная связь: данные могут передаваться между двумя сторонами, и только одна сторона может одновременно отправлять их другой стороне. Например, рация представляет собой типичную полудуплексную связь. Приведенную выше программу моделирования последовательного порта также можно понимать как полудуплексную связь.
Полнодуплексная связь: данные могут отправляться и одновременно получать данные, и оба выполняются одновременно, как, например, наша телефонная связь.
Последовательная связь, имитирующая порт ввода-вывода, в основном показывает суть последовательной связи, но программе микроконтроллера необходимо постоянно обнаруживать и сканировать данные, полученные портом ввода-вывода микроконтроллера, что занимает много времени работы микроконтроллера. Поэтому внутри микроконтроллера 51 имеется модуль UART, который может автоматически получать данные и уведомлять вас после их получения. Для корректного использования необходимо правильно настроить регистр специальных функций.
Регистр последовательного управления SCON
В этом случае вводится только режим 1, то есть установка SM1 = 1 и SM0 = 0 соответствует режиму 1. Этот режим представляет собой формат кадра данных, используемый в предыдущей моделируемой последовательной связи: 1 стартовый бит, 8 бит данных и 1 стоповый бит.
Аналоговая последовательная связь использует таймер 0 для выражения скорости передачи данных. Передатчик скорости передачи данных модуля STC89C52 может генерироваться только таймером T1 или таймером T2, но не таймером T0. Это полностью отличается от концепции аналоговой связи.
При использовании таймера Т2 требуются дополнительные регистры конфигурации. По умолчанию используется таймер Т1.
Код программы:
- # include<reg52.h>
-
- void ConfigUART(unsigned int baud);
-
- void main()
- {
- EA = 1;
- ConfigUART(9600); //配置波特率为9600
- while(1);
-
- }
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //0x50= 0101 0000 配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //0x20 = 0010 0000 配置T1的为模式2自动重载模式
- TH1 = 256 - (11059200/12/32)/baud; //计算T1的重载值
- TL1 = TH1; //设置初值
- ET1 = 0; //禁止T1中断
- ES = 1; //启动串口中断
- TR1 = 1; //启动T1定时器
- }
-
- /*UART中断服务函数 */
- void interruptUART() interrupt 4
- {
- if(RI) //接收到字节
- {
- RI = 0; //软件清0接收中断标志
- SBUF = SBUF+1;//接收的数据+1,左边是发送SBUF,右边是接收SBUF
-
- }
- if(TI)
- {
- TI = 0; //软件清0发送中断标志位
- }
-
- }
Посмотрите видео результатов:Поставляется с модулем последовательной связи_bilibili_bilibili.
Как видите, нормальное общение возможно без каких-либо проблем, и тогда я кратко поясню соответствующее содержание программы:
Формула расчета значения перезагрузки таймера T1:
TH1 = TL1 = 256 — значение кварцевого генератора/12/2/16/скорость передачи, затем его
Время интервала прерывания = значение кварцевого генератора/12/2/16/скорость передачи = значение кварцевого генератора/12*(1/скорость передачи)*(1/32)
Значение кварцевого генератора/12 означает количество машинных циклов за 1 секунду (1/скорость передачи данных) означает время, необходимое для передачи 1 бита данных.
Значение кварцевого генератора/12* (1/скорость передачи) означает, сколько машинных процессоров необходимо для передачи 1 бита данных.
Таким же образом, значение кварцевого генератора/12*(1/скорость передачи данных)*(1/32) время этого прерывания = 1/32 времени передачи 1 бита данных.
То есть передача 1 бита данных разбивается на 32 временных интервала.
Расчетный результат равен 3, то есть интервал прерывания = 3 машинных цикла. Это время очень короткое.
Поскольку метод выборки сигнала модуля последовательного порта заключается в сборе одного сигнала 16 раз и извлечении уровней сигнала 7-го, 8-го и 9-го раз. Если два из трех раз являются высокими уровнями, данные считаются высокими. быть 1. Если уровень равен 0 дважды, этот бит считается равным 0. Таким образом, если данные читаются неправильно из-за непредвиденных помех, корректность окончательных данных все равно может быть гарантирована.
Изображение ниже взято из рекомендуемой публикации в блоге, главным образом для удобства объяснения.: Формула расчета скорости передачи данных
SMOD управляется регистром мощности PCON. По умолчанию SMOD равен 0. Подстановка его в приведенную выше формулу дает формулу решения предыдущего начального значения.
TH1 = TL1 = 256 – значение кварцевого генератора/12/2/16/скорость передачи
Когда регистр установлен в 1 PCON |= 0x80, то есть SMOD установлен в 1, скорость передачи данных можно удвоить, как показано в формуле выше;
В это время начальное значение T1 становится: TH1 = TL1 = 256 – значение кварцевого генератора/12/16/скорость передачи.
Здесь следует отметить одну вещь:: Если вы хотите использовать регистр PCON для управления частотой волны в два раза, формулу его начального значения все равно необходимо записать как
TH1 = TL1 = 256 – значение кварцевого генератора/12/2/16/скорость передачи составляет всего лишь
Текущее значение перезагрузки: TH1=256 - (11059200/12/32)/бод =256-(11059200/12/16)/(2*buad) бод*2=4800*2=9600, 9600 — текущая скорость программы. ставка
Если ваша компания по перезагрузке начального значения пишет TH1 = TL1 = 256 — значение кварцевого генератора/12/16/скорость передачи, то ее текущая скорость передачи данных по-прежнему составляет 4800, а не 9600.Вы используете программное обеспечение последовательной связи, чтобы установить скорость передачи данных на 9600, и оно передаетРезультат неправильный。
Смотреть видео:Скорость передачи данных linked_bilibili_bilibili
Мы видим, что временной интервал для скорости передачи 9600 бод составляет всего 3 машинных цикла, а временной интервал 14400 — 2 машинных цикла. Видно, что если скорость передачи данных выше, то временной интервал может составлять менее 1 машинного цикла. Поэтому существует другой рабочий режим, то есть ConfigUART(9600), после того как старший бит PCON установлен в 1; его текущая скорость передачи данных равна 19200, но его временной интервал равен временному интервалу исходной скорости передачи 9600 бод, которая равна 1. 3 машинных цикла.
Следует напомнить, что существует еще много различий в работе таймера 0, моделирующего последовательную связь, и модуля последовательной связи. Модуль последовательной связи выполняет один вход и выход и вводит только два прерывания последовательной связи. Один раз в ответ на установку RI в 1, один раз в ответ на установку TI в 1, а затем очищается программным обеспечением. Больше не обращайте внимания на процесс передачи, сосредоточьтесь только на том, завершена ли передача, и отправьте сигнал, когда передача будет завершена.
Схема отправки и приема последовательной связи физически имеет два одинаковых регистра SBUF, их адреса также равны 0x99, но один используется для буфера отправки, а другой — для буфера приема. Это означает, что есть две комнаты, и номера домов в двух комнатах одинаковы. В одну из них можно войти, а в другую можно выйти, но нельзя войти. Таким образом, полнодуплексная связь UART может быть достигнута без помех друг другу. Но логически каждый раз работает только SBUF, и микроконтроллер автоматически выбирает, получать ли SBUF или отправлять SBUF, в зависимости от того, выполняет ли он над ним операцию «чтения» или «записи».
Основные этапы программы последовательной связи:
1. Настройте последовательный порт в режим 1.
2. Настройте таймер T1 на режим 2, который представляет собой режим автоматической переустановки.
3. Рассчитайте начальные значения TH1 и TL1 на основе скорости передачи данных. При необходимости вы можете использовать PCON, чтобы удвоить скорость передачи данных.
4. Откройте регистр управления таймером TR1 и дайте таймеру поработать.Примечание. При использовании прерывания последовательного порта прерывание таймера 1 больше не может быть включено, если только вы не используете прерывание последовательного порта таймера 2.