1.MOV TMOD,#15H
2.SETB P3.4
3.MOV R1,#28
4.MOV TL0,#00H
5.MOV TH0,#00H
6.MOV TL1,#00H
7.MOV TH1,#00H
8.SETB TR0
9.HERE2: SETB TR1
10.HERE: JNB TF1, HERE
11.CLR TF1
12.CLR TR1
13.DJNZ R1, HERE2
14.CLR TR0
15.CLR TR1
Dieses oben geschriebene Programm dient zum Zählen der Impulsfrequenz, die am Pin p3.4 anliegt. Wir verwenden Timer 0 als Zähler und Timer 1 als normalen Timer. In Zeile 10 verschwendet die Steuerung etwa 35,75 ms. Um also Timer 0 für etwa 1 Sekunde aktiv zu machen, verwenden wir Zeile 10 28 Mal.
Aber hier im Bild in Zeile 14 haben sie die DJNZ auf Zeile 8 verwiesen, warum? Was bringt es, das Register wieder mit 00 aufzufüllen? Sie hätten den TF1 einfach löschen können, um den Timer wieder bei 00 zu starten, stattdessen stoppen sie den Timer in Zeile 13 und starten ihn nach dem Füllen mit 00 erneut.
Warum muss der Timer gestoppt und wieder mit 00 gefüllt werden? Wird nicht nur das Löschen von TF1 (während TR1 eingestellt bleibt) dazu führen, dass der Timer wieder bei 00 beginnt? Da der Rollover-Wert bereits 00 ist und nach dem Überlauf in den Timer geladen wird. Ist es nicht so, dass das erste Programm in Bezug auf die Genauigkeit besser funktioniert?
Hängt davon ab, was die Absicht des Benutzers mit Timer ist.
Wenn die Absicht des Benutzers war, einen 16-Bit-Timer zu implementieren, der einfach von 0x0
bis läuft 0xFFFF
, überläuft und dann erneut durchläuft (z. B. um eine periodische Aufgabe zu erledigen):
JA, er musste den Timer nach dem Überlauf nicht stoppen und dann mit neu laden 0x0
. Da TR1
noch gesetzt ist, startet der Timer sowieso nach dem Überlauf ab 0x0
und zählt wieder hoch. In diesem Fall TF1
würde eine Entrümpelung ausreichen.
Beachten Sie, dass : das Löschen TF1
den Timer nicht zurücksetzt/neu lädt.
SamGibson
SamGibson