2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Les articles de blog écrits par d'autres blogueurs CSDN sont plutôt bons. Si vous voulez en savoir plus sur le port série UART du microcontrôleur 51, vous pouvez cliquer et jeter un œil :
Communication asynchroneCela signifie que l'intervalle de temps entre deux caractères (8 bits) dans la communication n'est pas fixe, mais l'intervalle de temps entre les bits d'un caractère estécurie。
La communication série UART est la technologie de communication la plus couramment utilisée pour les microcontrôleurs. Elle est généralement utilisée pour la communication entre microcontrôleurs et ordinateurs et entre microcontrôleurs.
La communication peut être divisée en types de baseCommunication parallèleetCommunication série, Dans une communication parallèle, chaque bit de données est transmis simultanément et la communication peut être réalisée en octets. Cependant, plusieurs lignes de communication occupent beaucoup de ressources et sont coûteuses. Par exemple, P0 = 0xFF utilisé auparavant ; attribuez des valeurs aux 8 ports IO de P0 en même temps et produisez des signaux en même temps, similaires à 8 voies pouvant dépasser 8 voitures en même temps. Cette forme est parallèle. Il est d'usage d'appeler P0, P1, P2 et P3 les quatre ensembles de bus parallèles du microcontrôleur 51.
La communication série est comme une voie, une seule voiture peut passer à la fois.Si un octet de données tel que 0xFF doit être transmis, en supposant qu'une voiture extrait des données de 1 bit, il faudra alors plus de 8 voitures.même intervalle de tempsTraversez la même voie à tour de rôle.
La différence entre la communication synchrone et la communication asynchrone :
1. La communication synchrone nécessite que la fréquence d'horloge de l'extrémité réceptrice soit cohérente avec la fréquence d'horloge de l'extrémité émettrice, et que l'extrémité émettrice envoie un flux binaire continu ; la communication asynchrone ne nécessite pas de synchronisation de l'horloge de l'extrémité réceptrice et de l'horloge de l'extrémité émettrice ; Une fois que l'extrémité émettrice a envoyé un octet, elle peut traverser n'importe quel intervalle de temps long avant d'envoyer l'octet suivant.
2. La communication synchrone a un rendement élevé, tandis que la communication asynchrone a un faible rendement.
3. La communication synchrone est plus compliquée et l'erreur admissible des horloges des deux parties est faible ; la communication asynchrone est simple et les horloges des deux parties peuvent permettre une certaine erreur.
4. La communication synchrone ne convient qu'au point à multipoint et la communication asynchrone peut être utilisée pour le point à point.
Le microcontrôleur STC89C52 possède deux broches spécifiquement utilisées pour la communication série UART, l'une est P3^0 et l'autre est P3^1. Elles portent également d'autres noms appelés respectivement RXD (Receive Data) et TXD (Transmit Data). on les appelle une interface série. Comme le montre l'image :
Communication entre microcontrôleur et microcontrôleur :
Sur la figure, GND représente la masse de référence de l'alimentation du système du microcontrôleur. TXD est appelé broche de transmission série et RXD est la broche de réception série.
Pour communiquer entre deux microcontrôleurs, tout d'abord, la référence d'alimentation doit être la même, donc les GND des deux microcontrôleurs doivent être connectés entre eux.Ensuite, la broche TXD du MCU 1 est connectée à la broche RXD du MCU 2. La fonction est que le MCU 1 envoie des informations au MCU 2. (Ce processus est divisé en deux parties. Le MCU 1envoyer un signalProcessus avec le microcontrôleur 2recevoir un signalProcessus) De la même manière, la broche TXD du microcontrôleur 2 est connectée à la broche RXD du microcontrôleur 1.
Ce diagramme schématique reflète le processus par lequel deux microcontrôleurs s’envoient et reçoivent des informations.
Lorsque le microcontrôleur 1 souhaite envoyer des données au microcontrôleur 2, par exemple en envoyant 1 donnée 0xE4, exprimée sous forme binaire :
0b1110 0100, le microcontrôleur 1 est confronté à plusieurs problèmes avant le démarrage de la transmission :
Supposons que je transmette d'abord le bit le plus bas de 0, puis je dois régler le port TXD du microcontrôleur 1 sur un niveau bas.
Les microcontrôleurs sont généralement de niveau TTL ou CMOS. Pour les normes de niveau TTL/CMOS :
Tout ce qui est supérieur à 2,0 volts est un niveau élevé, quelque chose de moins de 0,0 volt est un niveau bas, et tout ce qui se situe entre les deux n'est ni un niveau haut ni un niveau bas. La logique intermédiaire sera déroutante et pourra être jugée par l'appareil. un niveau élevé, il peut également être jugé comme un niveau faible. Par conséquent, essayez de ne pas faire fonctionner le circuit dans cette zone. Être dans cette zone peut faire en sorte que votre produit soit aléatoire. Par conséquent, lors du développement de produits, vous devez vérifier la fiche technique de l'appareil et la tension pendant le fonctionnement du circuit pour vous assurer qu'il est à une tension appropriée.
1. Niveau TTL :
Niveau de sortie haut > 2,4 V, niveau de sortie bas < 0,4 V. À température ambiante, le niveau de sortie général haut est de 3,5 V et le niveau de sortie bas est de 0,2 V. Niveau d'entrée minimum haut et bas : niveau d'entrée haut >=2,0 V, niveau d'entrée bas <=0,8 V, marge de bruit est de 0,4 V.
2. Niveau CMOS :
1niveau logique La tension est proche de la tension d'alimentation et le niveau logique 0 est proche de 0 V. Et a une large tolérance au bruit.
Alors voici la question :
Lorsque les informations ne sont ni transmises ni reçues, le port de transmission (TXD) du microcontrôleur 1 sera à un niveau haut ou à un niveau bas, ou la tension du port se situe entre ceux-ci. La tension du port de réception (RXD) du MCU 2 suit la tension du port de transmission du MCU 1. Comment définir le signal indiquant que le MCU 1 est sur le point de commencer à transmettre des informations, c'est-à-dire comment le MCU 2 sait-il que le MCU 1 lui a transmis des informations ? Il est donc nécessaire de normaliser les normes de communication.
Étape 1 : Il est stipulé que lorsque la communication n'a pas lieu, la tension des ports TXD et RXD du microcontrôleur reste élevée.
Étape 2 : Standardisez la méthode de transmission des données comme indiqué ci-dessous
Vous pouvez voir qu'il définit 1 bit de démarrage, 1 bit d'arrêt, plus 1 octet de données à transmettre, soit un total de 8 bits.Données à dix chiffres。
La transmission mentionnée ci-dessus d'une donnée 0xE4 transmet en réalité 0 1110 0100 1. La transmission de 1 octet de données du MCU 1 au MCU 2 transmet en réalité des données de 10 bits. Cet ensemble de 10 bits est appelé une trame de données série complète.
Avec le bit de démarrage et le bit d'arrêt, le port RXD du microcontrôleur 2 commence à se préparer à recevoir des données lorsqu'il détecte un niveau bas. De la même manière, si le microcontrôleur 1 veut envoyer 1 octet de données, il doit d'abord envoyer un bit de démarrage 0 (dire au microcontrôleur 2 de le préparer à recevoir), puis envoyer un bit d'arrêt 1 (indiquer au microcontrôleur 2 un octet de données). transfert de données terminé).Et lors de la transmission de données, c'estD'abord bas, puis hautCommande
Étape 3 : Vous devez définir uniformément le temps nécessaire pour transmettre 1 bit de données. La vitesse de ce temps est exprimée par le débit en bauds (baud). Un débit en bauds de 1 signifie transmettre 1 bit de données en 1 seconde, et un débit en bauds de 9 600 signifie transmettre 9 600 bits de données en 1 seconde.
Ensuite, nous obtenons le résultat de la transmission de 1 bitdurée=1/baud., alors le temps nécessaire pour transmettre 1 trame de données complète peut être trouvé comme étant10/bauds,L'intervalle de temps entre les trames de données est arbitraire.
Lorsque les MCU 1 et MCU 2 transmettent des signaux, leurs débits en bauds doivent être définis pour être cohérents pour obtenir une communication correcte.
Dans les premières années des ordinateurs de bureau, il existait généralement une interface série à 9 broches. Cette interface série est appelée interface RS-232, qui est liée à la communication UART. Cependant, les ordinateurs portables modernes ne disposent plus de cette interface série à 9 broches. Ainsi, la communication avec les microcontrôleurs a de plus en plus tendance à utiliser des ports série virtuels USB.
La logique de niveau utilisée par RS232 est une logique négative, différente des niveaux logiques TTL/CMOS.
Par conséquent, le port série RS232 à 9 broches de l'ordinateur ne peut pas être directement connecté au microcontrôleur. Une puce de conversion de niveau MAX232 est requise pour compléter la figure suivante :
Description de la broche RS232 :
1. Détection de porteuse DCD (Détection de porteuse de données) 2. Recevoir des données RXD 3. Envoyer des données TXD
4. Le terminal de données est prêt pour le DTR (Terminal de données prêt) 5. Masse du signal 6. Données prêtes DSR (Ensemble de données prêt)
7. Demande d'envoi de RTS (Demande d'envoi) 8. Effacer et envoyer CTS (Autorisé à envoyer) 9. Sonnerie invite RI (Sonnerie)
Comme le montre la figure ci-dessus, dans le câblage du port série RS232, la communication peut être effectuée tant que les broches 2, 3 et 5 sont connectées aux broches MAX232 correspondantes.
Avec le développement de la technologie, la communication par port série RS-232 est largement utilisée dans l'industrie. Cependant, dans l'application de la technologie commerciale, la technologie USB vers UART a lentement remplacé le port série RS232.
Alors, comment réaliser la communication entre le microcontrôleur et l'ordinateur comme le montre la figure
Il s'agit dans ce cas de la carte de développement qui utilise la puce USB vers port série CH340T pour réaliser cette fonction.
Le port du microcontrôleur TXD utilise un cavalier pour se connecter à l'USB-TX et est connecté au port CH340 pin 4 RXD en même temps.
Le port du microcontrôleur RXD utilise un cavalier pour se connecter à l'USB-RX et est connecté à la 3ème broche TXD du CH340.
Vous pouvez voir qu'il y a une diode 4148 en série entre USB-RX et la troisième broche TXD du CH340, car le microcontrôleur STC89C52 a besoin d'un démarrage à froid lors du téléchargement du programme. Cliquez simplement sur télécharger d'abord, puis allumez.
soi-disantDémarrage à froid Il fait référence au processus de démarrage du microcontrôleur, de la mise hors tension à la mise sous tension ; tandis que le démarrage à chaud signifie que le microcontrôleur est toujours sous tension. La différence entre le démarrage à froid et le démarrage à chaud est la suivante : lors d'un démarrage à froid, les valeurs dans la RAM interne du microcontrôleur sont des quantités aléatoires, tandis que lors d'un démarrage à chaud, les valeurs dans la RAM interne du microcontrôleur ne seront pas modifiées et restent les mêmes qu'avant le démarrage.
Au moment de la mise sous tension, le microcontrôleur détectera d'abord s'il est nécessaire de télécharger le programme, bien que le VCC du microcontrôleur soit contrôlé par le commutateur, car la broche 3 du CH340T est une broche de sortie, s'il n'y en a pas. diode, le microcontrôleur suivant du commutateur échouera lorsque l'alimentation est coupée. La broche 3 du CH340T est connectée à la broche P3.0 (RXD) du microcontrôleur. Le courant circulera dans le circuit de l'étage suivant à travers cette broche et chargera le condensateur de. l'étape suivante, ce qui entraîne une certaine tension dans l'étape suivante. Cette tension bien que la valeur ne soit qu'environ 2 ~ 3 V, elle peut affecter le démarrage à froid normal. Après l'ajout d'une diode, d'une part cela n'affecte pas la communication, d'autre part cela peut éliminer cet effet indésirable.
J'ai appris dans le manuel du microcontrôleur que P3.0 est un port IO quasi-bidirectionnel.
La partie boîte rouge est le port IO quasi-bidirectionnel , lorsque le bit de sortie interne est de niveau bas, à travers la porte NON, la base du transistor est à un niveau haut, le transistor est activé (la tension aux deux extrémités de CE est presque la même en conduction saturée) et l'IO Le port du microcontrôleur produit un niveau faible, quel que soit le niveau externe. Que l'interrupteur à clé soit enfoncé ou relevé, le port IO reste faible. Autrement dit, il n’est pas contrôlé par des signaux externes.
Lorsque la sortie interne est de niveau haut, après avoir traversé la porte NON, la base du transistor est extrêmement basse et le transistor n'est pas conducteur (la résistance aux deux extrémités de CE est très grande et la résistance R est négligeable par rapport à it). À ce moment, la sortie du port IO est de niveau élevé. Lorsque le bouton est enfoncé, le port IO est mis à la terre et le port IO émet un niveau bas.
De là, on peut voir que ce n'est que lorsqueLa sortie du port IO est de haut niveauquand,La sortie du port IO est contrôlée par le circuit externe。
Par conséquent, nous savons que la sortie interne du P3.0 est toujours élevée lorsqu'il est utilisé comme port RXD.Le port P3.1TXD sert d'émetteur et sonNiveau de sortie internePeut être modifié vers le haut ou vers le bas selon les besoins.
Et : pour les niveaux TTL
Borne de sortie : niveau haut >=2,4 V, niveau bas <=0,4 V ;
Extrémité de réception : niveau haut >=2,0 V, niveau bas <=0,8 V.
Pour le niveau COMS
Borne de sortie : niveau haut = Vcc, niveau bas = GND (Vcc est la tension d'alimentation) ;
Extrémité de réception : niveau haut >=0,7 Vcc, niveau bas <=0,2 Vcc.
Il existe encore une certaine différence de tension entre le niveau logique de leur extrémité de réception et le niveau logique de l'extrémité de sortie. Cela peut être dû aux interférences de chute de tension générées lors de la transmission du signal ou à l'existence d'un circuit de protection, donc l'ajout d'une diode ne sera pas possible. la cause. La tension transmise se trouve dans une zone logique déroutante.
Utilisez le port IO pour simuler la communication série UART
Programme supérieur :
- # 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; //置接收结束标志
- }
- }
- }
-
- }
Carte logique de travail
Ce programme utilise la minuterie 0 pour simuler la communication série UART. Notez qu'il ne s'agit que d'un simple programme.Programme de simulation. Ce programme implémente la communication entre l'ordinateur et le microcontrôleur. Son résultat de communication est de transmettre les données transmises par l'ordinateur au microcontrôleur, et le microcontrôleur ajoute 1 aux données et les renvoie à l'ordinateur. Utilisez l'assistant de débogage du port série fourni avec STC-ISP pour démontrer ce résultat.
Tout d'abord, assurez-vous que les ports sont les mêmes. Les images ci-dessus sont toutes COM3, le débit en bauds est de 9600, le bit de contrôle est NON, le bit de données est 8 et le bit d'arrêt est 1. (Ce qui est défini ici est celui de l'ordinateur. paramètres du port série)
Jetez un œil au résultat : une communication normale est possibleLa minuterie 0 simule la communication série_bilibili_bilibili
Expliquez brièvement la logique de fonctionnement de ce programme : pourEnvoyer le modulePar exemple, envoyez 0xAA = 1010 1010 en commençant par le bit le plus bas
Soit TxdBuf = 1010 1010Regardez le programme
- 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; //置发送结束标志
- }
- }
d'abordEntrez le cnt d'interruption = 1
PIN_TXD = TxdBuf & 0x01, c'est-à-dire que le résultat du AND de 1010 1010 0000 0001 est d'attribuer le bit le plus bas de 0xAA au port d'envoi pour activer le niveau correspondant. On peut voir que la tension entrant dans le port d'interruption TXD pour la première fois est faible, et ce processus se poursuivra jusqu'à ce que la deuxième interruption se produise.
Ensuite, TxdBuff est décalé d'un bit vers la droite, c'est-à-dire TxdBuf = 0101 0101
Alorsla deuxième foisinterrompre
cnt = 2
PIN_TXD = 1 Cette fois le niveau du port d'envoi est haut
TxdBuf = 0010 1010
Puis la troisième et la quatrième fois jusqu'à ce que8ème fois
cnt = 8
Le niveau défini par PIN_TXD = 1 est le niveau haut, qui est le bit 1 le plus élevé des données transmises.
A ce moment TxdBuf = 0x00
Après cela9ème foisEntrée de l'interruption. La 9ème entrée de l'interruption signifie que les bits de données viennent d'être envoyés et qu'il est temps de se préparer à envoyer le bit d'arrêt.
Par conséquent, PIN_TXD = 1, le port d'envoi est directement affecté au niveau haut.
La dernière dixième interruption signifie que le bit d'arrêt a également été envoyé.Par conséquent, cnt reset reçoit la valeur 0, TR0 reçoit la valeur 0, le temporisateur 0 est désactivé, TXDEnd = 1, l'indicateur de fin de transmission est défini sur 1 et la transmission d'une trame de données complète est terminée.
Après celamodule de réception: Nous avons envoyé 0xAA plus tôt Pour cette fonction, sa valeur est le résultat de l'ajout de 1 aux données reçues, donc les données reçues sont : 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; //置接收结束标志
- }
- }
- }
On peut voir que les processus d'envoi et de réception sont en fait similaires. Pour la réception de données, j'ai marqué la première interruption comme commençant à la 0ème fois, principalement pour coopérer avec cnt pour une compréhension facile.
Comme le montre la figure, vous pouvez voir que le temps nécessaire pour entrer dans l'interruption pour la 0ème fois est la moitié du temps d'interruption prédéfini. En effet, lors de la confirmation si un signal de niveau est 0 ou 1, si le niveau est au plus tôt. Le moment de l'échantillonnage peut survenir. Erreur ou interférence, de sorte que le point d'échantillonnage est généralement défini au milieu du temps de transmission du signal, et le signal de niveau y est considéré comme le signal transmis pendant cette période. Par conséquent, le module de réception n'a besoin de régler son temps d'interruption qu'à la moitié de celui d'origine lorsqu'il reçoit le bit de départ pour la première fois, afin de garantir que tous les points de collecte de signaux ultérieurs sont au point central.
Voyons comment le programme est défini : TL0 = 256 - ((256-TH0) >> 1); // Accepter que le timing T0 soit la moitié de la période de débit en bauds au démarrage.
256-TH0 est le temps d'interruption prédéfini. Comme nous l'avons mentionné précédemment, nous espérons que le temps d'interruption sera la moitié du précédent. L'opération du programme consiste à le décaler vers la droite de 1 bit. Prenons un exemple de 0000 1000 binaire. de 8. Le décaler vers la droite de 1 équivaut à 0000 0100 = 4. On peut voir que l'opération de décalage vers la droite de 1 bit consiste à changer le nombre à la moitié de la valeur d'origine. De la même manière, le résultat du décalage vers la gauche de 1 bit est 0001 0000 = 16, ce qui signifie multiplier le nombre d'origine par 2.
Démarrer l'analyse du processus du programme
Lorsque RxdorTxd vaut 0, entrez la fonction else, c'est-à-dire0ème fois En entrant dans l'interruption, le point de départ du module de réception dans le domaine temporel est le point médian du bit de départ. Déterminez d’abord si la tension du port est vraiment basse, et sinon, désactivez l’interruption. Pourquoi faire ceci?
Puisqu'il s'agit d'un module de réception, la tension du RXD n'est pas contrôlée par le microcontrôleur. Dans ce cas, elle est contrôlée par l'ordinateur contrôlant la tension de la borne TXD du CH340T. La tension du RXD du microcontrôleur suit l'extrémité CH340TXD. Pour l'extrémité réceptrice, les informations reçues peuvent être interférées et doivent être confirmées à nouveau.
Si oui, cnt++, alors cnt=1. RxdBuf = 0 ; remet le tampon de réception à 0.
Après cela1er(en fait la deuxième fois)De second ordre Entrez l'interruption cnt = 1 et entrez la fonction else if() pour transférer les données vers le tampon étape par étape. Le processus ultérieur ne sera pas décrit en détail si les lecteurs intéressés peuvent le parcourir eux-mêmes selon la logique du programme. Vérifiez si les données peuvent réellement être stockées dans la variable tampon d'abord en bits faibles, puis en bits élevés. Parce que dans le billet de blog précédent, la fonction utilise la méthode de décalage vers la gauche pour stocker d'abord les bits de poids fort des données. Cette approche complète tout à fait une autre façon de travailler.
À ce stade, le programme utilise la minuterie 0 pour simuler la communication série UART.
Trois types de communication de base
Communication simplex : une seule partie est autorisée à transmettre des informations à l'autre partie, et l'autre partie ne peut pas renvoyer d'informations, telles que des télécommandes de télévision, des émissions de radio, etc.
Communication semi-duplex : les données peuvent être transmises entre deux parties, et une seule partie peut les envoyer à l'autre partie en même temps. Par exemple, un talkie-walkie est une communication semi-duplex typique. Le programme de simulation de port série ci-dessus peut également être compris comme une communication semi-duplex
Communication full-duplex : les données peuvent être envoyées tout en recevant des données, et les deux s'effectuent simultanément, comme notre communication téléphonique.
La communication série de simulation de port IO montre essentiellement l'essence de la communication série, mais le programme du microcontrôleur doit constamment détecter et analyser les données reçues par le port IO du microcontrôleur, ce qui prend une grande partie du temps d'exécution du microcontrôleur. Par conséquent, il y a un module UART à l'intérieur du microcontrôleur 51, qui peut recevoir automatiquement des données. Il suffit de le notifier après les avoir reçues. Pour l'utiliser correctement, vous devez configurer correctement le registre de fonctions spéciales.
Registre de contrôle série SCON
Ce cas introduit uniquement le mode 1, c'est-à-dire que le réglage SM1 = 1 et SM0 = 0 correspond au mode 1. Ce mode est le format de trame de données utilisé dans la communication série simulée précédente : 1 bit de démarrage, 8 bits de données et 1 bit d'arrêt.
La communication série analogique utilise la minuterie 0 pour exprimer le débit en bauds. L'émetteur de débit en bauds du module UART STC89C52 ne peut être généré que par la minuterie T1 ou la minuterie T2, mais pas par la minuterie T0.
Lors de l'utilisation du temporisateur T2, des registres de configuration supplémentaires sont requis. Par défaut, le temporisateur T1 est utilisé.
Code du programme :
- # 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发送中断标志位
- }
-
- }
Jetez un oeil à la vidéo des résultats:Livré avec module communication série_bilibili_bilibili
On peut voir qu'une communication normale peut être obtenue sans aucun problème, puis une brève explication du contenu pertinent du programme est donnée :
La formule de calcul de la valeur de rechargement du temporisateur T1 est :
TH1 = TL1 = 256 - valeur de l'oscillateur à cristal/12/2/16/débit en bauds alors son
Temps d'intervalle d'interruption = valeur de l'oscillateur à cristal/12/2/16/débit en bauds = valeur de l'oscillateur à cristal/12*(1/débit en bauds)*(1/32)
La valeur de l'oscillateur à cristal/12 signifie le nombre de cycles machine en 1 seconde, (1/débit en bauds) signifie le temps nécessaire pour transmettre 1 bit de données
La valeur de l'oscillateur à cristal/12* (1/débit en bauds) signifie combien de processeurs de machine sont nécessaires pour transmettre 1 bit de données
De la même manière, la valeur de l'oscillateur à cristal/12*(1/débit en bauds)*(1/32) le temps de cette interruption = 1/32 du temps pour transmettre 1 bit de données
Autrement dit, le transfert d'un bit de données est divisé en 32 intervalles de temps.
Le résultat calculé est 3, soit l'intervalle d'interruption = 3 cycles machine. Ce temps est très court.
Parce que la méthode d'échantillonnage du signal du module de port série consiste à collecter un seul signal 16 fois et à supprimer les niveaux de signal des 7ème, 8ème et 9ème fois. Si deux des trois fois sont des niveaux élevés, les données sont considérées comme étant élevées. être 1. Si le niveau est 0 deux fois, ce bit est considéré comme étant 0. De cette façon, si les données sont lues incorrectement en raison d'une interférence inattendue, l'exactitude des données finales peut toujours être garantie.
L'image ci-dessous provient du billet de blog recommandé, principalement pour faciliter l'explication.: Formule de calcul du débit en bauds
SMOD est contrôlé par le registre de puissance PCON. Par défaut, SMOD est 0. Le remplacer dans la formule ci-dessus est la formule de solution de valeur initiale précédente.
TH1 = TL1 = 256 - valeur de l'oscillateur à cristal/12/2/16/débit en bauds
Lorsque la valeur la plus élevée du registre est définie sur 1 PCON |= 0x80 ; c'est-à-dire que SMOD est défini sur 1, le débit en bauds peut être doublé, comme indiqué dans la formule ci-dessus.
A ce moment, la valeur initiale de T1 devient : TH1 = TL1 = 256 - valeur de l'oscillateur à cristal/12/16/débit en bauds
Une chose qu'il faut noter ici est que: Si vous souhaitez utiliser le registre PCON pour contrôler le doublement du taux d'onde, sa formule de valeur initiale doit toujours être écrite comme
TH1 = TL1 = 256 - la valeur de l'oscillateur à cristal/12/2/16/débit en bauds est juste
La valeur de recharge actuelle est TH1=256 - (11059200/12/32)/baud =256-(11059200/12/16)/(2*buad) baud*2=4800*2=9600, 9600 est la valeur du débit en bauds du programme actuel
Si votre entreprise de rechargement de valeur initiale écrit TH1 = TL1 = 256 - valeur de l'oscillateur à cristal/12/16/débit en bauds, alors son débit en bauds actuel est toujours de 4 800, et non de 9 600.Vous utilisez le logiciel de communication série pour définir le débit en bauds de communication sur 9600 et il transmetLe résultat est faux。
Voir la vidéo:Débit en bauds Related_bilibili_bilibili
Nous pouvons voir que l'intervalle de temps pour le débit en bauds de 9 600 n'est que de 3 cycles machine et que l'intervalle de temps de 14 400 est de 2 cycles machine. On constate que si son débit en bauds est plus élevé, son intervalle de temps peut être inférieur à 1 cycle machine. Par conséquent, il existe un autre mode de fonctionnement, à savoir ConfigUART (9600) après que le bit le plus élevé de PCON soit défini sur 1 ; son débit en bauds actuel est de 19 200, mais son intervalle de temps est l'intervalle de temps du débit en bauds d'origine de 9 600, qui est 3 cycles machine.
Il faut rappeler qu'il existe encore de nombreuses différences dans le travail de la communication série simulée du temporisateur 0 et du module de communication série. Le module de communication série complète une entrée et une sortie, et il n'entre que deux interruptions de communication série. Une fois en réponse au fait que RI soit réglé sur 1, une fois en réponse au fait que TI soit réglé à 1, puis effacé par le logiciel. Ne faites plus attention au processus de transmission, concentrez-vous uniquement sur la question de savoir si la transmission est terminée et envoyez un signal lorsque la transmission est terminée.
Le circuit d'envoi et de réception de la communication série possède physiquement deux registres SBUF identiques et leurs adresses sont également 0x99, mais l'un est utilisé pour l'envoi du tampon et l'autre pour la réception du tampon. Cela signifie qu'il y a deux pièces et que les numéros de maison des deux pièces sont les mêmes. L'une d'elles est autorisée à entrer mais l'autre n'est pas autorisée à sortir mais n'est pas autorisée à entrer. De cette manière, la communication en duplex intégral des UART peut être réalisée sans interférence entre eux. Mais logiquement, seul SBUF est utilisé à chaque fois, et le microcontrôleur choisit automatiquement de recevoir ou d'envoyer du SBUF selon qu'il effectue une opération de « lecture » ou d'« écriture » sur celui-ci.
Étapes de base du programme de communication série :
1. Configurez le port série en mode 1.
2. Configurez la minuterie T1 sur le mode 2, qui est le mode de réinstallation automatique.
3. Calculez les valeurs initiales de TH1 et TL1 en fonction du débit en bauds. Si nécessaire, vous pouvez utiliser PCON pour doubler le débit en bauds.
4. Ouvrez le registre de contrôle du temporisateur TR1 et laissez le temporisateur fonctionner.Remarque : lors de l'utilisation de l'interruption du port série, l'interruption de la minuterie 1 ne peut plus être activée, sauf si vous utilisez l'interruption du port série de la minuterie 2.