le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
I post sul blog scritti da altri blogger CSDN sono abbastanza buoni Se vuoi conoscere la porta seriale UART del microcontrollore 51, puoi fare clic e dare un'occhiata:
Comunicazione asincronaCiò significa che l'intervallo di tempo tra due caratteri (8 bit) nella comunicazione non è fisso, ma l'intervallo di tempo tra i bit all'interno di un carattere èstabile。
La comunicazione seriale UART è la tecnologia di comunicazione più comunemente utilizzata per i microcontrollori. Solitamente viene utilizzata per la comunicazione tra microcontrollori e computer e tra microcontrollori.
La comunicazione può essere suddivisa in tipologie fondamentaliComunicazione parallelaEcomunicazione seriale, Nella comunicazione parallela, ogni bit di dati viene trasmesso simultaneamente e la comunicazione può essere realizzata in byte. Tuttavia, più linee di comunicazione occupano molte risorse e sono costose. Ad esempio, P0 = 0xFF usato prima; assegna valori alle 8 porte IO di P0 contemporaneamente e invia segnali allo stesso tempo, simile a 8 corsie che possono passare 8 auto contemporaneamente. Questa forma è parallela È consuetudine chiamare P0, P1, P2 e P3 i quattro set di bus paralleli del microcontrollore 51.
La comunicazione seriale è come una corsia, può passare solo una macchina alla volta.Se deve essere trasmesso un byte di dati come 0xFF, presupponendo che un'auto stia trasportando dati a 1 bit, saranno necessarie più di 8 auto.stesso intervallo di tempoAttraversare a turno la stessa corsia.
La differenza tra comunicazione sincrona e comunicazione asincrona:
1. La comunicazione sincrona richiede che la frequenza di clock dell'estremità di ricezione sia coerente con la frequenza di clock dell'estremità di invio e che l'estremità di invio invii un flusso di bit continuo. La comunicazione asincrona non richiede la sincronizzazione dell'orologio di fine ricezione e dell'orologio di fine invio Dopo che l'utente finale ha inviato un byte, può passare attraverso un intervallo di tempo lungo prima di inviare il byte successivo.
2. La comunicazione sincrona ha un'efficienza elevata, mentre la comunicazione asincrona ha un'efficienza bassa.
3. La comunicazione sincrona è più complicata e l'errore consentito dagli orologi di entrambe le parti è piccolo. La comunicazione asincrona è semplice e gli orologi di entrambe le parti possono consentire un certo errore.
4. La comunicazione sincrona è adatta solo per punto-multipunto e la comunicazione asincrona può essere utilizzata per punto-punto.
Il microcontrollore STC89C52 ha due pin utilizzati specificamente per la comunicazione seriale UART, uno è P3^0 e l'altro è P3^1. Hanno anche altri nomi chiamati rispettivamente RXD (Receive Data) e TXD (Transmit Data). loro è chiamata interfaccia seriale. Come mostrato nell'immagine:
Comunicazione tra microcontrollore e microcontrollore:
Nella figura, GND rappresenta la massa di riferimento dell'alimentazione del sistema microcontrollore. TXD è chiamato pin di trasmissione seriale e RXD è il pin di ricezione seriale.
Per comunicare tra due microcontrollori, innanzitutto, il riferimento di alimentazione deve essere lo stesso, quindi i GND dei due microcontrollori devono essere collegati tra loro.Quindi il pin TXD di MCU 1 è collegato al pin RXD di MCU 2. La funzione è che MCU 1 invia informazioni a MCU 2. (Questo processo è diviso in due parti. MCU 1inviare segnaleProcesso con microcontrollore 2ricevere il segnaleProcesso) Allo stesso modo, il pin TXD del microcontrollore 2 è collegato al pin RXD del microcontrollore 1.
Questo diagramma schematico riflette il processo di due microcontrollori che si inviano e ricevono informazioni tra loro.
Quando il microcontrollore 1 vuole inviare dati al microcontrollore 2, ad esempio, inviando 1 0xE4 dati, espressi in forma binaria:
0b1110 0100, il microcontrollore 1 deve affrontare diversi problemi prima dell'inizio della trasmissione:
Supponiamo di trasmettere prima il bit più basso di 0, quindi devo impostare la porta TXD del microcontrollore 1 a livello basso.
I microcontrollori sono generalmente di livello TTL o CMOS Per gli standard di livello TTL/CMOS:
Qualunque cosa superiore a 2,0 volt è un livello alto, qualcosa di meno di 0,0 volt è un livello basso e qualsiasi cosa nel mezzo non è né un livello alto né un livello basso. La logica intermedia creerà confusione e potrebbe essere giudicata dal dispositivo un livello elevato, può anche essere giudicato di livello basso. Pertanto, cercare di non utilizzare il circuito in quest'area. Essere in questa zona può far sì che il tuo prodotto colpisca o manchi. Pertanto, quando si sviluppano prodotti, è necessario controllare la scheda tecnica del dispositivo e la tensione durante il funzionamento del circuito per assicurarsi che abbia una tensione adeguata.
1. Livello TTL:
Uscita livello alto >2,4 V, uscita livello basso <0,4 V. A temperatura ambiente, il livello generale di uscita alto è 3,5 V e il livello basso di uscita è 0,2 V. Ingresso minimo di livello alto e basso: ingresso di livello alto >=2,0 V, ingresso di livello basso <=0,8 V, il margine di rumore è 0,4 V.
2. Livello CMOS:
1livello logico La tensione è vicina alla tensione di alimentazione e il livello logico 0 è vicino a 0 V. E ha un'ampia tolleranza al rumore.
Quindi ecco la domanda:
Quando le informazioni non vengono trasmesse o ricevute, la porta di trasmissione (TXD) del microcontrollore 1 sarà ad un livello alto o basso, oppure la tensione della porta sarà compresa tra questi. La tensione della porta di ricezione (RXD) dell'MCU 2 segue la tensione della porta di trasmissione dell'MCU 1. Come impostare il segnale che MCU 1 sta per iniziare a trasmettere informazioni, ovvero come fa MCU 2 a sapere che MCU 1 gli ha trasmesso informazioni? Pertanto è necessario standardizzare gli standard di comunicazione.
Passo 1: Si stabilisce che quando la comunicazione non avviene, la tensione delle porte TXD e RXD del microcontrollore rimane alta.
Passaggio 2: standardizzare il metodo di trasmissione dei dati come mostrato di seguito
Puoi vedere che definisce 1 bit di inizio, 1 bit di stop, più 1 byte di dati da trasmettere, per un totale di 8 bit.Dati a dieci cifre。
La suddetta trasmissione di dati 0xE4 trasmette effettivamente 0 1110 0100 1. La trasmissione di 1 byte di dati da MCU 1 a MCU 2 trasmette effettivamente dati a 10 bit. Questo insieme di 10 bit è chiamato frame di dati seriale completo.
Con il bit di avvio e il bit di stop, la porta RXD 2 del microcontrollore inizia a prepararsi a ricevere i dati quando rileva un livello basso. Allo stesso modo, se il microcontrollore 1 vuole inviare 1 byte di dati, deve prima inviare un bit di avvio 0 (dire al microcontrollore 2 di prepararlo a ricevere), quindi inviare un bit di stop 1 (dire al microcontrollore 2 un byte di dati trasferimento dati completato).E quando si trasmettono dati, lo èPrima basso, poi altoOrdine
Passo 3: È necessario impostare in modo uniforme il tempo necessario per trasmettere 1 bit di dati. La velocità di questo tempo è espressa dal baud rate (baud). Una velocità di trasmissione pari a 1 significa trasmettere 1 bit di dati in 1 secondo, mentre una velocità di trasmissione pari a 9600 significa trasmettere 9600 bit di dati in 1 secondo.
Quindi otteniamo il risultato della trasmissione di 1 bitdurata=1/baud., allora il tempo necessario per trasmettere 1 frame di dati completo risulta essere10/baud,L'intervallo di tempo tra i frame di dati è arbitrario.
Quando MCU 1 e MCU 2 trasmettono segnali, le rispettive velocità di trasmissione devono essere impostate in modo coerente per ottenere una comunicazione corretta.
Nei primi anni dei computer desktop, di solito esisteva un'interfaccia seriale a 9 pin. Questa interfaccia seriale è chiamata interfaccia RS-232, che è correlata alla comunicazione UART. Tuttavia, i notebook moderni non dispongono più di questa interfaccia seriale a 9 pin. quindi la comunicazione con i microcontrollori tende sempre più a utilizzare le porte seriali virtuali USB.
La logica di livello utilizzata da RS232 è la logica negativa, che è diversa dai livelli logici TTL/CMOS.
Pertanto, la porta seriale RS232 a 9 pin del computer non può essere collegata direttamente al microcontrollore. Per completare la figura seguente è necessario un chip di conversione di livello MAX232:
Descrizione pin RS232:
1. Rilevamento portante DCD (rilevamento portante dati) 2. Ricevi dati RXD 3. Invia dati TXD
4. Il terminale dati è pronto per DTR (Terminale dati pronto) 5. Massa segnale 6. Dati pronti DSR(Set di dati pronto)
7. Richiesta di invio RTS (Richiesta di inviare) 8. Cancella e invia CTS(Pronto per inviare) 9. Avviso di chiamata RI (Squillo)
Come mostrato nella figura sopra, nel cablaggio della porta seriale RS232, la comunicazione può essere completata purché i pin 2, 3 e 5 siano collegati ai corrispondenti pin MAX232.
Con lo sviluppo della tecnologia, la comunicazione tramite porta seriale RS-232 è ampiamente utilizzata nell'industria. Tuttavia, nell'applicazione della tecnologia commerciale, la tecnologia da USB a UART ha lentamente sostituito la porta seriale RS232.
Quindi come realizzare la comunicazione tra il microcontrollore e il computer come mostrato in figura
In questo caso si tratta della scheda di sviluppo che utilizza il chip CH340T da USB a porta seriale per ottenere questa funzione.
La porta TXD del microcontrollore utilizza un ponticello per connettersi a USB-TX ed è collegata contemporaneamente alla porta RXD pin 4 CH340
La porta RXD del microcontrollore utilizza un ponticello per connettersi a USB-RX ed è collegata al terzo pin TXD del CH340.
Puoi vedere che c'è un diodo 4148 in serie tra USB-RX e il terzo pin TXD del CH340, perché il microcontrollore STC89C52 necessita di un avvio a freddo durante il download del programma. Basta fare prima clic su Scarica e poi su Accendi.
cosiddettoPartenza a freddo Si riferisce al processo di avvio del microcontrollore dallo spegnimento all'accensione mentre l'avvio a caldo significa che il microcontrollore è sempre acceso; La differenza tra avvio a freddo e avvio a caldo è: durante l'avvio a freddo, i valori nella RAM interna del microcontrollore sono quantità casuali, mentre durante l'avvio a caldo, i valori nella RAM interna del microcontrollore non verranno modificati e rimangono gli stessi di prima dell'avvio.
Al momento dell'accensione, il microcontrollore rileverà innanzitutto se è necessario scaricare il programma. Sebbene il VCC del microcontrollore sia controllato dall'interruttore, poiché il pin 3 del CH340T è un pin di uscita, se non esiste. diodo, il microcontrollore successivo dell'interruttore si guasterà quando l'alimentazione è spenta, il pin 3 del CH340T è collegato al pin P3.0 (RXD) del microcontrollore. La corrente fluirà nel circuito dello stadio successivo attraverso questo pin e caricherà il condensatore nella fase successiva, risultando in una certa tensione nella fase successiva. Questa tensione Sebbene il valore sia solo di circa 2~3 V, potrebbe influenzare il normale avviamento a freddo. L'aggiunta di un diodo da un lato non influisce sulla comunicazione, dall'altro può eliminare questo effetto negativo.
Ho imparato dal manuale del microcontrollore che P3.0 è una porta IO quasi bidirezionale.
La parte della casella rossa è la porta IO quasi bidirezionale , quando il bit di uscita interno è a livello basso, attraverso la porta NOT, la base del transistor è a livello alto, il transistor è acceso (la tensione su entrambe le estremità di CE è quasi la stessa in conduzione saturata) e l'IO La porta del microcontrollore emette un livello basso, indipendentemente dal fatto che l'interruttore a chiave esterno sia premuto o sollevato, la porta IO rimane bassa. Cioè, non è controllato da segnali esterni.
Quando l'uscita interna è di alto livello, dopo aver attraversato la porta NOT, la base del transistor è estremamente bassa e il transistor non conduce (la resistenza su entrambe le estremità di CE è molto grande e la resistenza R è trascurabile rispetto a it). In questo momento, l'uscita della porta IO è di livello alto. Quando si preme il pulsante, la porta IO viene messa a terra e la porta IO emette un livello basso.
Da ciò si può vedere che solo quandoL'uscita della porta IO è di alto livelloQuando,L'uscita della porta IO è controllata dal circuito esterno。
Pertanto, sappiamo che l'output interno di P3.0 è sempre alto quando viene utilizzato come porta RXD.La porta P3.1TXD funge da trasmettitore e il suoLivello di uscita internoPuò essere modificato verso l'alto o verso il basso secondo necessità.
E: per i livelli TTL
Terminale di uscita: livello alto >=2,4 V, livello basso <=0,4 V;
Estremità di ricezione: livello alto >=2,0 V, livello basso <=0,8 V.
Per il livello COMS
Terminale di uscita: livello alto = Vcc, livello basso = GND (Vcc è la tensione di alimentazione);
Estremità di ricezione: livello alto >=0,7 Vcc, livello basso <=0,2 Vcc.
C'è ancora una certa differenza di tensione tra il livello logico dell'estremità di ricezione e il livello logico dell'estremità di uscita. Ciò potrebbe essere dovuto all'interferenza della caduta di tensione generata durante la trasmissione del segnale o all'esistenza di un circuito di protezione, quindi l'aggiunta di un diodo non lo farà causarlo. La tensione trasmessa si trova in un'area logica confusa.
Utilizzare la porta IO per simulare la comunicazione seriale UART
Programma superiore:
- # 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; //置接收结束标志
- }
- }
- }
-
- }
Mappa logica del lavoro
Questo programma utilizza il timer 0 per simulare la comunicazione seriale UART. Nota che questo è solo unProgramma di simulazione. Questo programma implementa la comunicazione tra il computer e il microcontrollore. Il risultato della comunicazione è trasmettere i dati trasmessi dal computer al microcontrollore, e il microcontrollore aggiunge 1 ai dati e li rimanda al computer. Utilizzare l'assistente per il debug della porta seriale fornito con STC-ISP per dimostrare questo risultato.
Innanzitutto, assicurati che le porte siano le stesse Le immagini sopra sono tutte COM3, la velocità di trasmissione è 9600, il bit di controllo è NO, il bit di dati è 8 e il bit di stop è 1. (Ciò che è impostato qui è quello del computer. parametri della porta seriale)
Dai un'occhiata al risultato: la comunicazione normale è possibileIl timer 0 simula la comunicazione seriale_bilibili_bilibili
Spiegare brevemente la logica di funzionamento di questo programma: forInvia moduloAd esempio, invia 0xAA =1010 1010 iniziando dal bit più basso
Questo è TxdBuf = 1010 1010Guarda il programma
- 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; //置发送结束标志
- }
- }
PrimoImmettere il cnt di interruzione = 1
PIN_TXD = TxdBuf & 0x01, ovvero il risultato dell'AND di 1010 1010 0000 0001 assegna il bit più basso di 0xAA alla porta di invio per abilitare il livello corrispondente. Si può vedere che la tensione che entra nella porta TXD di interruzione per la prima volta è di basso livello e questo processo continuerà fino a quando non si verifica la seconda interruzione.
Quindi TxdBuff viene spostato di un bit a destra, ovvero TxdBuf = 0101 0101
Poila seconda voltainterrompere
cnt = 2
PIN_TXD = 1 Questa volta il livello della porta di invio è di livello alto
TxdBuf = 0010 1010
Poi la terza e la quarta volta fino a8a volta
cont = 8
Il livello impostato da PIN_TXD = 1 è il livello alto, ovvero il bit 1 più alto dei dati trasmessi.
In questo momento TxdBuf = 0x00
Dopo di che9a voltaInserimento dell'interrupt Il nono inserimento dell'interrupt significa che i bit di dati sono appena stati inviati ed è ora di prepararsi a inviare il bit di stop.
Pertanto, PIN_TXD = 1, la porta di invio viene assegnata direttamente al livello alto.
L'ultimo decimo interrupt indica che è stato inviato anche il bit di stop.Pertanto, a cnt reset viene assegnato un valore 0, a TR0 viene assegnato un valore 0, il timer 0 è disattivato, TXDEnd = 1, il flag di fine trasmissione è impostato su 1 e la trasmissione di un frame di dati completo è completata.
Dopo di chemodulo ricevente: Abbiamo inviato 0xAA in precedenza Per questa funzione, il suo valore è il risultato dell'aggiunta di 1 ai dati ricevuti, quindi i dati ricevuti sono: 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; //置接收结束标志
- }
- }
- }
Si può vedere che i processi di invio e ricezione sono in realtà simili. Per la ricezione dei dati, ho contrassegnato il primo interrupt come a partire dalla 0a volta principalmente per collaborare con cnt per una facile comprensione.
Come mostrato nella figura, puoi vedere che il tempo necessario per inserire l'interruzione per la 0a volta è la metà del tempo di interruzione preimpostato. Questo perché quando si conferma se un segnale di livello è 0 o 1, se il livello è al più presto Durante il campionamento potrebbero verificarsi errori o interferenze, pertanto il punto di campionamento viene generalmente impostato a metà del tempo di trasmissione del segnale e il livello del segnale in quel punto viene considerato come il segnale trasmesso in questo periodo di tempo. Pertanto, il modulo ricevente deve solo impostare il proprio tempo di interruzione sulla metà dell'originale quando riceve il bit di avvio per la prima volta, in modo da garantire che tutti i successivi punti di raccolta del segnale siano al punto centrale.
Vediamo come è impostato il programma: TL0 = 256 - ((256-TH0) >> 1); //Accetta la temporizzazione T0 pari alla metà del periodo di baud rate all'avvio
256-TH0 è il tempo di interruzione preimpostato. Come accennato in precedenza, speriamo che il tempo di interruzione sia la metà di quello precedente. L'operazione del programma è spostarlo a destra di 1 bit. Prendiamo un esempio di 0000 1000 binario di 8. Lo spostamento a destra di 1 è 0000 0100 = 4. Si può vedere che l'operazione di spostamento a destra di 1 bit consiste nel modificare il numero alla metà del valore originale. Allo stesso modo, il risultato dello spostamento a sinistra di 1 bit è 0001 0000 =16, che significa moltiplicare il numero originale per 2
Avvia l'analisi del processo del programma
Quando RxdorTxd è 0, inserisci la funzione else0a volta Entrando nell'interrupt, il punto iniziale del modulo ricevente nel dominio del tempo è il punto medio del bit di avvio. Innanzitutto determinare se la tensione della porta è veramente bassa e, in caso contrario, disattivare l'interruzione. Perché farlo?
Poiché si tratta di un modulo ricevente, la tensione dell'RXD non è controllata dal microcontrollore. In questo caso, è controllata dal computer che controlla la tensione del terminale TXD del CH340T. La tensione dell'RXD del microcontrollore segue l'estremità CH340TXD. Per l'estremità ricevente, le informazioni ricevute potrebbero essere disturbate e devono essere confermate nuovamente.
Se sì, cnt++, allora cnt=1. RxdBuf = 0; cancella il buffer di ricezione su 0
Dopo di che1°(in realtà la seconda volta)Di second'ordine Immettere l'interrupt cnt = 1 e immettere la funzione else if() per trasferire i dati nel buffer passo dopo passo. Il processo successivo non verrà descritto in dettaglio se i lettori interessati possono eseguirlo da soli secondo la logica del programma. Verificare se i dati possono davvero essere archiviati nella variabile buffer prima in modalità bit basso e poi in modalità bit alto. Perché nel post precedente del blog, la funzione utilizza il metodo dello spostamento a sinistra per memorizzare prima i bit più alti dei dati. Questo approccio integra perfettamente un altro modo di lavorare.
A questo punto, il programma utilizza il timer 0 per simulare la comunicazione seriale UART.
Tre tipi fondamentali di comunicazione
Comunicazione simplex: solo una parte può trasmettere informazioni all'altra parte e l'altra parte non può restituire informazioni, come telecomandi TV, trasmissioni radiofoniche, ecc.
Comunicazione half-duplex: i dati possono essere trasmessi tra due parti e solo una parte può inviarli contemporaneamente all'altra parte. Ad esempio, un walkie-talkie è una tipica comunicazione half-duplex. Il programma di simulazione della porta seriale sopra riportato può anche essere inteso come comunicazione half-duplex
Comunicazione full-duplex: i dati possono essere inviati mentre si ricevono anche dati, e le due operazioni vengono eseguite contemporaneamente, come la nostra comunicazione telefonica.
La comunicazione seriale con la simulazione della porta IO mostra fondamentalmente l'essenza della comunicazione seriale, ma il programma del microcontrollore deve rilevare e scansionare costantemente i dati ricevuti dalla porta IO del microcontrollore, il che richiede gran parte del tempo di esecuzione del microcontrollore. Pertanto, all'interno del microcontrollore 51 è presente un modulo UART, che può ricevere automaticamente i dati. Basta avvisarlo dopo averli ricevuti. Per utilizzarlo correttamente, è necessario configurare correttamente il registro delle funzioni speciali.
Registro di controllo seriale SCON
Questo caso introduce solo la modalità 1, ovvero l'impostazione di SM1 = 1 e SM0 = 0 è la modalità 1. Questa modalità è il formato del frame di dati utilizzato nella precedente comunicazione seriale simulata: 1 bit di avvio, 8 bit di dati e 1 bit di stop.
La comunicazione seriale analogica utilizza il timer 0 per esprimere la velocità di trasmissione. Il trasmettitore della velocità di trasmissione del modulo UART STC89C52 può essere generato solo dal timer T1 o dal timer T2, ma non dal timer T0. Questo è completamente diverso dal concetto di comunicazione analogica.
Quando si utilizza il timer T2, sono necessari registri di configurazione aggiuntivi. Per impostazione predefinita viene utilizzato il timer T1.
Codice del programma:
- # 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发送中断标志位
- }
-
- }
Date un'occhiata al video dei risultati:Viene fornito con il modulo seriale communications_bilibili_bilibili
Si può vedere che la comunicazione normale può essere raggiunta senza alcun problema, quindi viene fornita una breve spiegazione del contenuto rilevante nel programma:
La formula di calcolo per il valore di ricarica del timer T1 è:
TH1 = TL1 = 256 - valore dell'oscillatore a cristallo/12/2/16/velocità di baud quindi il suo
Tempo di intervallo di interruzione = valore dell'oscillatore al cristallo/12/2/16/velocità di baud = valore dell'oscillatore al cristallo/12*(1/velocità di baud)*(1/32)
Il valore dell'oscillatore al cristallo/12 indica il numero di cicli macchina in 1 secondo, (1/velocità di baud) indica il tempo richiesto per trasmettere 1 bit di dati
Il valore dell'oscillatore a cristallo/12* (1/velocità di baud) indica quanti processori della macchina sono necessari per trasmettere 1 bit di dati
Allo stesso modo, il valore dell'oscillatore al cristallo/12*(1/baud rate)*(1/32) il tempo di questa interruzione = 1/32 del tempo necessario per trasmettere 1 bit di dati
Cioè, il trasferimento di 1 bit di dati è suddiviso in 32 intervalli di tempo.
Il risultato calcolato è 3, ovvero l'intervallo di interruzione = 3 cicli macchina. Questo tempo è molto breve.
Poiché il metodo di campionamento del segnale del modulo della porta seriale consiste nel raccogliere un singolo segnale 16 volte ed eliminare i livelli del segnale della 7a, 8a e 9a volta. Se due dei tre tempi sono livelli alti, i dati vengono considerati essere 1. Se il livello è 0 due volte, questo bit viene considerato 0. In questo modo, se i dati vengono letti in modo errato a causa di interferenze impreviste, si può comunque garantire la correttezza dei dati finali.
L'immagine seguente proviene dal post del blog consigliato principalmente per comodità di spiegazione.: Formula di calcolo del baud rate
SMOD è controllato dal registro di potenza PCON Per impostazione predefinita, SMOD è 0. Sostituirlo nella formula precedente con la precedente formula di soluzione del valore iniziale.
TH1 = TL1 = 256 - valore oscillatore al cristallo/12/2/16/velocità baud
Quando il valore più alto del registro è impostato su 1 PCON |= 0x80; ovvero SMOD è impostato su 1, la velocità di trasmissione può essere raddoppiata, come mostrato nella formula precedente.
In questo momento, il valore iniziale di T1 diventa: TH1 = TL1 = 256 - valore dell'oscillatore al cristallo/12/16/baud rate
Una cosa che deve essere notata qui è questa: Se si desidera utilizzare il registro PCON per controllare il raddoppio della velocità dell'onda, la sua formula del valore iniziale deve ancora essere scritta come
TH1 = TL1 = 256 - il valore dell'oscillatore a cristallo/12/2/16/velocità di baud è solo
Il valore di ricarica corrente è TH1=256 - (11059200/12/32)/baud =256-(11059200/12/16)/(2*buad) baud*2=4800*2=9600, 9600 è il valore del velocità di trasmissione del programma corrente
Se la tua azienda che ricarica il valore iniziale scrive TH1 = TL1 = 256 - valore dell'oscillatore a cristallo/12/16/velocità di baud, la sua velocità di baud attuale è ancora 4800, non 9600.Si utilizza il software di comunicazione seriale per impostare la velocità di trasmissione della comunicazione su 9600 e trasmetteIl risultato è sbagliato。
Guarda il video:Velocità di trasmissione correlata_bilibili_bilibili
Possiamo vedere che l'intervallo di tempo per la velocità di trasmissione di 9600 è di soli 3 cicli macchina e l'intervallo di tempo di 14400 è di 2 cicli macchina. Si può vedere che se il suo baud rate è più alto, il suo intervallo di tempo potrebbe essere inferiore a 1 ciclo macchina. Pertanto, esiste un'altra modalità di lavoro, ovvero ConfigUART(9600) dopo che il bit più alto di PCON è impostato su 1, la sua velocità di trasmissione corrente è 19200, ma il suo intervallo di tempo è l'intervallo di tempo della velocità di trasmissione originale di 9600, che è; 3 cicli macchina.
È necessario ricordare che ci sono ancora molte differenze nel funzionamento della comunicazione seriale simulata del timer 0 e del modulo di comunicazione seriale. Il modulo di comunicazione seriale completa un ingresso e un'uscita ed inserisce solo due interruzioni della comunicazione seriale. Una volta in risposta all'impostazione di RI su 1, una volta in risposta all'impostazione di TI su 1 e quindi cancellata dal software. Non prestare più attenzione al processo di trasmissione, concentrarsi solo sul completamento della trasmissione e inviare un segnale quando la trasmissione è completata.
Il circuito di invio e ricezione della comunicazione seriale ha fisicamente due registri SBUF identici e anche i loro indirizzi sono 0x99, ma uno viene utilizzato per il buffer di invio e l'altro per il buffer di ricezione. Ciò significa che ci sono due stanze e i numeri civici delle due stanze sono gli stessi Ad una di esse è consentito entrare ma all'altra non è consentito uscire ma non è consentito entrare. In questo modo, la comunicazione full-duplex di UART può essere ottenuta senza interferenze reciproche. Ma logicamente, ogni volta viene utilizzato solo SBUF e il microcontrollore sceglie automaticamente se ricevere SBUF o inviare SBUF a seconda che esegua un'operazione di "lettura" o "scrittura" su di esso.
Passaggi di base del programma di comunicazione seriale:
1. Configurare la porta seriale sulla modalità 1.
2. Configurare il timer T1 sulla modalità 2, che è la modalità di reinstallazione automatica.
3. Calcolare i valori iniziali di TH1 e TL1 in base alla velocità di trasmissione. Se necessario, è possibile utilizzare PCON per raddoppiare la velocità di trasmissione.
4. Aprire il registro di controllo del timer TR1 e far funzionare il timer.Nota: quando si utilizza l'interruzione della porta seriale, l'interruzione del timer 1 non può più essere abilitata, a meno che non si utilizzi l'interruzione della porta seriale del timer 2.