51 Mikrocontroller für Anfänger 3 – Erstellen Sie eine elektronische Uhr von Grund auf

Heute verwenden wir STC89C52, um einen einfachen Mikrocontroller zum Laufen zu bringen: eine elektronische Uhr. Zusätzlich zur grundlegenden Reisezeitfunktion können Sie die Uhrzeit auch manuell anpassen, den Wecker stellen und aus dem Standby-Modus aufwachen.

Dieser Artikel befasst sich mit dem Hardware- und Softwaredesign.

Ich denke, es gibt zwei Punkte, die bei elektronischen Uhren berücksichtigt werden müssen: Der eine ist die genaue Zeitmessung und der geringe Fehler; der andere ist die Energieeinsparung, damit sie lange Zeit mit der Kraft mobiler Energie versorgt werden kann.

Hardware-Design:

Zunächst müssen wir einen guten Systemrahmen konzipieren:

Es erübrigt sich zu erwähnen, dass wir als grundlegende Taktschaltung und Rücksetzschaltung acht digitale Röhren als Zeitanzeigemodus verwenden (Anzeigestil: 12-00-00), wobei der P0-Port sein Segment steuert, der P2-Port sein Bit steuert; mit acht The Die Jog-Taste wird als Tastatureingabe verwendet; der Summer und die LED werden als Aufforderungston bzw. als Anzeigeleuchte verwendet.

Als nächstes können Sie das schematische Diagramm entwerfen:

Es ist ersichtlich, dass die Verkabelung der digitalen Röhre komplizierter ist und ihr Prinzip vorerst nicht besprochen wird (siehe Artikel 51 SCM Beginner 2 – Dynamisches Scannen digitaler Röhren_#liufenges#的博客-CSDN Blog_Dynamisches Scannen von Digital Tube ), sehen Sie zwei Die 1, 2, 3, 4, 5, 7, 10 und 11 der digitalen Röhren werden separat angeschlossen und dann zum Anschluss an den P0-Anschluss herausgeführt; die 6, 8, 9 , und 12 der beiden digitalen Röhren verfügen über insgesamt 8 Pins und einen P2-Port-Anschluss.

Es ist zu beachten, dass zwischen der digitalen Röhrenpositionssteuerung und dem P2-Anschluss eine Verriegelung 74HC373 hinzugefügt ist , deren Funktion darin besteht, die digitale Röhre im Standby-Modus bequem auszuschalten. Sein Pin 11 ist der Adress-Latch-Port. Wenn er mit einem hohen Pegel verbunden ist, befindet sich der Latch im transparenten Modus und der Eingang und der Ausgang sind genau gleich. Hier verbinde ich mich direkt mit VCC, Pin 1 ist der Ausgangs-Latch. Dort wird nur ausgegeben, wenn der Pegel hoch ist. Hier verwenden wir P3.6, um seine Ausgabe zu steuern. Die folgende Abbildung zeigt das Pindiagramm des 74HC373 und seine Funktion.

Um die Schaltung zu vereinfachen, teilen sich Summer und LED einen I/O-Port;

Der serielle Datenanschluss des Einzelchip-Mikrocomputers wird herausgeführt und mit der Stiftleiste verbunden, was zum Brennen von Programmen praktisch ist.

Es ist zu beachten, dass ein 470-Ohm -Strombegrenzungswiderstand (im Schaltplan nicht dargestellt) in Reihe mit dem P0-Anschluss geschaltet werden sollte, um ein Durchbrennen der Digitalröhre zu verhindern.

Besorgen Sie sich also die benötigten Materialien:

STC89C52-Chip (1 Stück), 40P-Basis (1 Stück), Steckbrett (2 Stück), 3461BS-Digitalröhre (2 Stück), Jog-Taste (9 Stück), LED-Licht (1 Stück), 74HC373-Latch-Chip (1 Stück Chip) , 10K 9P Ausschluss (4), 470 Ohm Widerstand (15), 12M Quarzoszillator (1), 30pF Keramikkondensator (zwei), Stiftleiste (15 Pins), LED-Licht, aktiver Summer. Ein Gerät (der Unterschied zwischen aktiv und passiv). Summer gibt es im Internet), ein PNP-Transistor.

Abschließend löten wir die Bauteile nach dem Schaltplan. Das Folgende ist das fertige Produktbild als Referenz

Um die Arbeit einfach aussehen zu lassen, verwenden wir ein Dual-Board-Design, die obere Schicht ist die digitale Röhre und Tastatur und die untere Schicht ist das Mindestsystem des Single-Chip-Mikrocomputers. Die zweischichtigen Motherboards sind mit befestigt kleine Bolzen.

Da das Anpassen der Leiterplatte lange dauert, verwende ich Lochplatten zur Herstellung von Leiterplatten (wenn Sie nicht gut im elektronischen Löten sind, ist es am besten, Leiterplatten herzustellen). Sie können sehen, dass es viele fliegende Drähte gibt, und das gibt es auch mehr Verbindungsdrähte zwischen den beiden Platinen (Um zu verhindern, dass die Lötstellen durch Gewalteinwirkung abfallen, können Sie den Draht zwischen den Löchern umwickeln). Achten Sie beim Löten der MCU-Basis darauf, die MCU nicht auf der Basis zu installieren, um den MCU-Chip beim Schweißen nicht zu verbrennen. Ebenso sollte beim Löten des Quarzoszillators das Löten so schnell wie möglich erfolgen, um eine Erwärmung des Quarzoszillators zu vermeiden lange halten und den Quarzoszillator beschädigen; achten Sie beim Einsetzen des MCU-Chips auf die Ausrichtung. Um Bruch oder schlechten Kontakt zu vermeiden, können Sie nach dem Einstecken mit einem Multimeter messen, ob alle Pins mit der Basis verbunden sind; wie Sie dies beurteilen können der gemeinsame Anschluss des Widerstands: Auf der äußersten linken oder rechten Seite des Widerstands befindet sich ein weißer Punkt und ein weißer Punkt. Ein Ende des Punktes ist das gemeinsame Ende; die Jog-Taste hat vier Stifte (ein Satz). bestehend aus Schließerkontakten und einem Satz Öffnerkontakten) und die beiden Pins können wie im Schaltplan dargestellt angeschlossen werden.

Häufig verwendete Keil- Software für die MCU-Programmentwicklung (hier nehmen wir Keil uVision3 als Beispiel):

Erstellen Sie zunächst ein neues Projekt (klicken Sie auf Projekt → Neu → Dateiadresse auswählen und speichern) und wählen Sie dann das CPU-Modell aus.

STC89C52 ist vollständig kompatibel mit AT89C52 (da STC ein inländischer Chip ist, gibt es in Keil keinen STC-Chip, sodass wir stattdessen nur andere Chips verwenden können), sodass wir AT89C52 auswählen können (klicken Sie zuerst auf Atmel, nach dem Herunterziehen finden Sie AT89C52 ) . ).

Dann erscheint ein Abfragefenster: Standard-8051-Startcode in Projektordner kopieren und Datei zum Projekt hinzufügen? (Möchten Sie den 8051-Startcode in den Projektordner kopieren?), klicken Sie auf OK. Wenn Sie auf „Abbrechen“ klicken, wird es beim Erstellen der Datei automatisch hinzugefügt.

Sie können sehen, dass eine Target1- Projektdatei erstellt wurde und dass beim Herunterziehen ein Ordner „Source Group1“ vorhanden ist. In diesem Ordner befindet sich eine Datei STARTUP.A51 . Dies ist der gerade kopierte 8051-Startcode. Er enthält die Register der 51 Single-Chip-Mikrocomputer, die Zuordnung von E/A-Ports und andere Adressen. Diese werden automatisch von generiert Software und müssen in der Regel nicht geändert werden. .

Fügen Sie dann die C-Programmdatei hinzu: Datei→neu. Dann wird eine leere Datei mit Text1 erstellt. Dann klicken wir auf Speichern (oder Strg+S), wählen die Speicheradresse aus (speichern Sie sie an einem leicht zu findenden Ort, der später verwendet wird), geben den Dateinamen ein und beachten, dass dem Dateinamen das Suffix hinzugefügt werden muss. c, um es als C-Datei zu speichern. Wenn das Programm in Assemblersprache geschrieben ist, fügen Sie das Suffix .ASM hinzu.

Klicken Sie dann mit der rechten Maustaste auf „Quellgruppe1“, suchen Sie im Menü nach „Dateien zur Gruppe „Quellgruppe1“ hinzufügen“ und klicken Sie darauf (diese Option wird im Menü fett angezeigt). Fügen Sie dann die C-Programmdatei gerade zum Projekt hinzu und schließen Sie das Dialogfeld. Sie können sehen, dass sich unter Quellgruppe1 weitere frühere C-Dateien befinden.

Dann können Sie Programme schreiben.

Programmierung:

Definieren Sie die Header-Datei des Single-Chip-C-Programms #include<reg51.h>

Um die Verwirrung der E/A-Ports beim späteren Schreiben von Programmen zu erleichtern, können wir zunächst einige funktionale Pins definieren. Zum Beispiel beim Summer können wir aus dem schematischen Diagramm ersehen, dass der Summer von P3.1 gesteuert wird, also definieren wir P3.1 als Summer: sbit fm=P3^1; (' sbit' ist der Mikrocontroller, der dort verwendet wird ist in der C-Sprache kein solches Schlüsselwort; der Punkt zwischen P3.1 sollte im Programm durch „^“ dargestellt werden ), sodass wir im folgenden Programm, wenn wir Bee Buzzer verwenden möchten, solange fm gleich 0 ist oder gleich 1 ist, kann der Summer gesteuert werden und es besteht keine Notwendigkeit mehr, P3^1 zu verwenden.

Dann müssen wir die digitale Röhre kodieren. Die digitale Röhre muss mehr Zeichen anzeigen. Wir können ein Array verwenden, um Folgendes zu definieren:

char codeduan[]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf,0xff,0x89};

(Char-Datentyp: Im Mikrocontroller nimmt der char-Datentyp den geringsten Platz ein, nur 1 Byte (Oktett-Binär), aber sein Bereich liegt zwischen -128 und 127 (vorzeichenbehafteter Typ), ohne Vorzeichen liegt er bei 0 bis 255. Wenn also Der Datenbereich der Variablen ist nicht groß, im Allgemeinen wird der Typ char verwendet, wodurch Platz auf dem Ein-Chip-Computer gespart werden kann .

Definieren Sie dann die globalen Variablen sec, min, Hour. Der Grund, warum sie als globale Variablen definiert werden, besteht darin, diese drei Größen in allen Funktionen verfügbar zu machen.

In dieser Arbeit ist die Verzögerungsfunktion von wesentlicher Bedeutung, z. B. beim Scannen digitaler Röhren. Die Reisezeit erfordert eine Verzögerungsfunktion (häufig verwendete Methoden sind Timer-Interrupts). Die Berechnung der Verzögerungsfunktion kann von Baidu durchgeführt werden. Der Einfachheit halber können wir sie direkt mit der STC-IPS-Software automatisch generieren. Solange die für die Verzögerung erforderliche Zeit eingegeben wird, kann die Software automatisch eine Verzögerungsfunktion generieren kann direkt kopiert und eingefügt werden (Mindestzeit für 1us). Da wir verschiedene Zeitverzögerungen benötigen, können wir zunächst die erforderliche Verzögerungsfunktion voranstellen, um nachfolgende Aufrufe zu erleichtern.

Nachdem wir die erforderlichen Variablen definiert haben, können wir mit dem Schreiben der Hauptfunktion beginnen. Hier verwenden wir das digitale Röhrenscannen und Timing als Hauptprogramm, und das digitale Röhrenscannen und Timing werden gleichzeitig ausgeführt.

Schreiben Sie dann die Unterfunktionen für die Zeiteinstellung und die Unterfunktionen für den Wecker. Fügen Sie die Beurteilungsbedingung in das Hauptprogramm ein, um die Unterfunktion aufzurufen.

Um weitere Tricks hinzuzufügen, wurde auch eine Boot-„Animation“ motos() hinzugefügt; (Einzelheiten finden Sie im folgenden Programm).

Es ist zu beachten, dass die Unterfunktion vor der Hauptfunktion platziert werden sollte, da sonst beim Kompilieren angezeigt wird, dass die Unterfunktion nicht definiert ist.

Reden wir über die Tastatur. Das Tastaturlayout und die Tasteneinstellungen sind wie folgt.

K1 und K2 steuern die Links- und Rechtsbewegung des Cursors, K3 und K4 steuern die Addition und Subtraktion von Zahlen, K5 ist die Bestätigungstaste, K6 ist die Zeiteinstellung (zum Aufrufen 4 Sekunden lang gedrückt halten), K7 stellt den Alarm ein Uhr und K8 befindet sich im Standby-Modus.

Zu weiteren Details werde ich nicht viel sagen, schauen Sie sich einfach das Programm an.

Der vollständige Ablauf ist wie folgt:

/*电子时钟程序:基本电子时钟功能,能调节时间,能设置闹钟(已删减),有待机模式(已删减)*/
/*LED数码管显示器设定;
P0.0---P0.7段控线,接LED的显示段a,b,c,d,e,f,g,dp.
P2.0---P2.7位控线,从左至右

************键位设置*******************
 	            W3(+)  
  
  W1(光标左移)  W5(确认)   W2(光标右移)  	 W6(调时)      W7(闹铃)      W8 (唤醒) 
                
		        W4(-)           
**************************************/
#include<reg51.h>
#include<intrins.h>    //定义单片机的头文件
sbit fm=P3^1;          //定义单片机蜂鸣器
sbit plays=P3^6;	     //定义73HC373输出控制位
		 //    0    1    2    3    4    5    6    7    8    9    10  11   12   13   //
char codeduan[]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf,0xff,0x89};	   //数码管段编码
            //    0    1    2    3    4    5    6    7    8    9    dp   -    空	H   //
char codebite[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};				   //数码管位编码
char sec=0,min=0,hour=0;
void Delay1ms()		//@12.000MHz,1ms延时函数,用于数码管动态输出
{
	unsigned char i, j;
	i = 2;j = 239;
	do
	{
		while (--j);
	} while (--i);
}
void Delay50ms()		//@12.000MHz,用于蜂鸣器提示音,30ms
{
	unsigned char i, j, k;
	i = 2;j = 95;k = 43;
	do
	{	do
		{   while (--k);
		} while (--j);
	} while (--i);
}
void adjust()			     //时间调整模式子程序
{
   int H=0,cursor=3;
   char ks,twi,temps[8],K[8];
   temps[2]=11;
   temps[5]=11;
   fm=0;Delay50ms();fm=1;  //蜂鸣器响一声提示进入时间调整模式
   while(P1!=0xef)		    //如果没有按下K8,则执行循环
      {
	 if(H<180)	    {twi=0;}  	    //进入调整模式后,光标闪烁
	 if(H>180)	    {twi=1;}  
    	 if(H==360)     {H=0;}  
       for(ks=0;ks<8;ks++)
           {
	      if(cursor==1&&twi==0)
		  {
		  temps[0]=12;temps[1]=12;
		   }
		else
		   {temps[0]=sec%10;         //求余计算秒个位
                temps[1]=sec/10;}         //求商计算秒十位
	     
	      if(cursor==2&&twi==0)
		  {
		  temps[3]=12;temps[4]=12;
		   }
		else
		   {temps[3]=min%10;         //求余计算分个位
                temps[4]=min/10;}         //求商计算分十位
		    
		if(cursor==3&&twi==0)
		  {
		  temps[6]=12;temps[7]=12;
		   }
		else				   
		   {temps[6]=hour%10;	       //求余计算时个位
		    temps[7]=hour/10;}      	 //求余计算时十位		        
	      P2=codebite[ks];	      //数码管输出选位,从第0位开始//
	      P0=codeduan[temps[ks]]; //输出段,输出要显示的数字//
	      Delay1ms();			//延时1ms,防止数码管串码
		H++;
	      P0=codeduan[12];
		}
       if(P1==0xfe)	   			  /*按下‘左’键,将光标左移 */
	         { K[1]=1;}
       if(K[1]==1&&P1!=0xfe)
		   {K[1]=0;   cursor++;}
		
	 if(P1==0xfd)			   	   /*按下‘右’键,将光标右移 */
		   { K[2]=1;}
       if(K[2]==1&&P1!=0xfd)
		   {K[2]=0;   cursor--;}
	 if(cursor<1) { cursor=3;}		  
	 if(cursor>3) { cursor=1;}
		   		
	 if(P1==0xfb)			 	  /*按下‘上’键,将数字加一 */
               { K[3]=1;}
       if(K[3]==1&&P1!=0xfb)
		   { K[3]=0;   
		     switch(cursor)
		       {
			  case 1:sec++;break;
			  case 2:min++;break;
			  case 3:hour++;break;
			  default:break;
		        }
		   }		    
	 if(P1==0xf7)			 	  /*按下‘下’键,将数字减一 */
               { K[4]=1;}
       if(K[4]==1&&P1!=0xf7)
		   { K[4]=0;   
		     switch(cursor)
		       {
			  case 1:sec--;break;
			  case 2:min--;break;
			  case 3:hour--;break;
			  default:break;
		        }
		   }
	if(sec>59) {sec=0; }			     /*对时,分,秒范围进行限制 */
	if(sec<0)  {sec=59;}
	if(min>59) {min=0; }
	if(min<0)  {min=59;}	   		   		
   	if(hour>23){hour=0; }
	if(hour<0) {hour=23;}	   		
	 }
       return;					    //如果检测到K8按下,则跳出循环,返回主函数
} 
 /*开机动画子程序*/
void motos()
{
 int mot=0;
 char m;
 char motobit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
 char motoduan[8]={0xcf,0xa4,0xc0,0xa4,0x8e,0xc7,0xbf,0xbf}; /*编码显示“--LF2021” */
 while(mot<1800)
 {
  for(m=0;m<8;m++)
      { 
	 P2=motobit[m];	      //数码管输出选位,从第0位开始//
	 P0=motoduan[m];   //输出段,输出要显示的数字//
       Delay1ms();			//延时1ms,防止数码管串码
	 P0=codeduan[12];
	 mot++;
	 }
  }
  fm=0;Delay50ms();fm=1;Delay50ms();fm=0;Delay50ms();fm=1;
  return;
} 

 
  /*主程序,包含数码管显示以及计时*/
void main()
 {  int num=0,ks=0;
    char k,temp[8],moto=1;
    plays=0;	     /*打开锁存器74HC373使能端 */
    motos();	     /*调用开机动画 */
    temp[2]=11;
    temp[5]=11;
    while(1)
      {
       for(k=0;k<8;k++)
           {	  		     
	      temp[0]=sec%10;         //求余计算秒个位
            temp[1]=sec/10;         //求商计算秒十位
            temp[3]=min%10;         //求余计算分个位
            temp[4]=min/10;         //求商计算分十位
            temp[6]=hour%10;        //求余计算时个位
            temp[7]=hour/10;        //求商计算时十位
	      P2=codebite[k];	      //数码管输出选位,从第0位开始//
	      P0=codeduan[temp[k]];   //输出段,输出要显示的数字//
	      num++;
		Delay1ms();			//延时1ms,防止数码管串码
	      P0=codeduan[12];
		if(P1==0xdf)		//每次循环判断是否按下K1键
		   { 
		    if(num%10==0&&P1==0xdf)		//每10次循环,10ms,判断K1是否仍然按下
		       { 
		            ks++;		//如果每10次循环K1均按下,ks则自加一次
			      if(ks==300)	//如果KS记到300,表明k1已经连续按下4s,则进入时间调整模式,并将Ks清零
			          {
			           ks=0;
				     adjust();
			           } 
		        }		      //如果K1仍然按下,则将KS+1
		    }
            else{ks=0;}			//如果K1不再按下,则清零ks   
		if(num==865)		//经过与电脑时钟对比,找到最合适的值,以下为计时程序
		     {
		      sec++;
                  num=0;	      
                  if (sec==60)
                     {
                      sec=0;
                      min++;
                      if (min==60)
                           {
                            min=0;
                            hour++;
                            if (hour==24)
                               {hour=0;}
                            }
                      }			 	
	           }
	     }
      }   	
}

Programm brennen:

Da der Single-Chip-Mikrocomputer keine C-Sprach- oder Assembler-Programme direkt ausführen kann, muss das Programm in eine Hex-Datei kompiliert werden , bevor es in den Single-Chip-Mikrocomputer geschrieben werden kann. Wenn das Programm nach dem Schreiben zum ersten Mal kompiliert wird, wird die Hex-Datei normalerweise nicht automatisch generiert. Folgende Einstellungen müssen vorgenommen werden: Klicken Sie in Abbildung 1 auf die Schaltfläche „Option für Ziel“ und dann auf „Ausgabe“. Öffnen Sie das Popup-Fenster und aktivieren Sie dann „HEX-Datei erstellen“. Nachdem Sie auf „OK“ geklickt haben, klicken Sie auf die Schaltfläche „Kompilieren“ unter Nummer 4, um das Programm zu kompilieren.

Wenn es ohne Fehler kompiliert wird, werden 0 Fehler und 0 Warnungen angezeigt. Und es erscheint die Meldung „Hex-Datei wird aus „#Projektname#“ erstellt“, was darauf hinweist, dass die HEX-Datei erfolgreich erstellt wurde.

Der Platz ist begrenzt und der Proteus-Simulationsprozess wird hier nicht gezeigt. Sie können die Schaltung gemäß dem schematischen Diagramm aufbauen und das Programm selbst überprüfen.

Dabei wird das Programm direkt in das MCU-Produkt geschrieben.

Wir müssen die Software STC-IPS verwenden , eine Programmprogrammierungssoftware, die speziell für Single-Chip-Mikrocomputer der STC-Serie verwendet wird. Sie verfügt außerdem über einige Zusatzfunktionen, wie die automatische Generierung von Timerfunktionen und die oben genannten Verzögerungsfunktionen. Die folgende Abbildung zeigt die Fensteroberfläche.

Vor dem Brennen müssen wir den Computer über USB-TTL mit der MCU verbinden. Die Verbindungsmethode ist in der folgenden Abbildung dargestellt.

Wir müssen zuerst das entsprechende MCU-Modell auswählen. Wenn nach dem Anschließen der MCU die Meldung „Fehler beim Öffnen des seriellen Ports“ angezeigt wird, klicken Sie auf „Scannen“ und der Computer findet automatisch den entsprechenden seriellen Port.

Dann klicken wir auf „Programmdatei öffnen“, wählen die gerade generierte Hex-Datei aus und klicken dann auf „Download/Programm“, um das Programm auf den Mikrocontroller herunterzuladen. Wenn nach dem Klicken auf „Herunterladen“ keine Reaktion erfolgt, schalten Sie den Einzelchip-Mikrocomputer aus und wieder ein. Das Programm kann dann in den Einzelchip-Mikrocomputer geschrieben werden.

Auf diese Weise ist die gesamte Arbeit abgeschlossen. Das Folgende ist das fertige Bild, nachdem es in das Programm geschrieben wurde.

Zusammenfassen:

♦Berechnung des Stromverbrauchs (vorübergehend keine Standard-5-V-, 3-V-Stromversorgung möglich):

Stromversorgung der Powerbank: Spannung 5,15 V, Strom 30–40 mA, Stromverbrauch 5,15 x (30–40) = 154,5 mW–206 mW;

Drei Ni-MH-Akkus: Spannung 3,91 V, Strom ca. 20 mA, Stromverbrauch 3,91 x 20 = 78,2 mW.

Generell ist der Stromverbrauch immer noch auf einem hohen Niveau. Nach dem Test liegt der Hauptstromverbrauch in der digitalen Röhre. Der Stromverbrauch des Einzelchip-Mikrocomputers überschreitet 10 mW nicht, sodass das Ausschalten der digitalen Röhre im Standby-Modus den Stromverbrauch effektiv reduzieren kann.

♦ Fehlerproblem: Nach der eigentlichen Messung dieser Uhr sind immer noch Fehler sichtbar.

Einstellbarer Fehler: Die Ausführung des Programms nimmt viel Maschinenzeit in Anspruch, die Gesamtzeit = Verzögerungsfunktionszeit + andere Programmausführungszeit. Die Ausführungszeit anderer Programme ist schwer zu berechnen, und die Zeit der Verzögerungsfunktion kann nur durch vergleichendes Debuggen komprimiert werden.

Um den Fehler so weit wie möglich zu reduzieren, ist es notwendig, ihn mit der Standarduhr (der Netzwerkzeit des Computers oder Mobiltelefons) zu vergleichen, den Fehler zu berechnen und dann die Zeit der Verzögerungsfunktion anzupassen.

Beispiel: Unsere Verzögerungsfunktion ist zu Beginn auf 1000 ms eingestellt. Nachdem ich eine Stunde lang mit der Standardzeit verglichen habe, stellte ich fest, dass meine Uhr 1 Sekunde langsamer ist, was darauf hinweist, dass der Fehler meiner Uhr 1/3600 = 0,0002778 s = 0,2778 ms beträgt =277,8us (für mehr Genauigkeit Berechnen Sie den Fehler. Wir können die Vergleichszeit verbessern. Je länger die Zeit, desto besser die Fehlerberechnung.) Auf diese Weise können wir die Zeit der Verzögerungsfunktion um 278us reduzieren, dann sollte die Verzögerungsfunktion auf 1000000-278us=999722us eingestellt werden. Zur Vereinfachung der Anpassung können wir eine zweistufige Verzögerung, die Verzögerungsfunktion der ersten Ebene, verwenden ist in ms Die Einheit der sekundären Verzögerungsfunktion ist us, was für das Debuggen sehr praktisch ist.

Der nicht einstellbare Fehler ist die Temperaturdrift des Quarzoszillators . Die Schwingungsfrequenz des Quarzoszillators richtet sich nach der Umgebungstemperatur von 25 °C. Wenn die Temperatur zu hoch oder zu niedrig ist, ändert sich die Schwingungsfrequenz geringfügig beeinträchtigt die CPU-Ausführungsgeschwindigkeit und führt zu ungenauen Reisezeiten.

Eine fortgeschrittenere Methode besteht darin, die Zeit mithilfe des WLAN-Moduls esp8266 aus dem Netzwerk abzurufen und diese dann an den Mikrocontroller zu senden, sodass das Problem der ungenauen Reisezeit vollständig gelöst werden kann. Sie können auch LCD1602 oder LCD12864 als Display verwenden, um mehr Inhalte anzuzeigen und mehr Muster hinzuzufügen (diese beiden Displays werden später vorgestellt).

Die Verwendung von esp8266 ist etwas komplizierter und ich werde sie später vorstellen.

Dieser Artikel dient nur als Referenz. Bitte weisen Sie darauf hin, wenn Mängel vorliegen.

Supongo que te gusta

Origin blog.csdn.net/qq_55203246/article/details/114446168
Recomendado
Clasificación