Κοινή χρήση τεχνολογίας

04: Χρονόμετρο

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Όταν χρησιμοποιείται ο χρονοδιακόπτης, βασίζεται στο εσωτερικό κύκλωμα ταλαντωτή για τη μέτρηση. Όταν έχει ρυθμιστεί για χρήση χρονοδιακόπτη, η τιμή της μνήμης του μετρητή αυξάνεται κατά 1 κάθε κύκλο μηχανής.

1. Πώς να ρυθμίσετε το χρονόμετρο

1. Ο κρυσταλλικός ταλαντωτής (κρυσταλλικός ταλαντωτής) εκπέμπει παλμούς και καταγράφει τον αριθμό των παλμών για το χρονισμό.
2. Η συχνότητα του παλμού είναι η συχνότητα του ρολογιού και το αντίστροφο αυτής της συχνότητας είναι η περίοδος ταλάντωσης (κύκλος ρολογιού), που είναι και η μικρότερη μονάδα χρόνου στον υπολογιστή.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Όπως φαίνεται στο σχήμα: η συχνότητα του κρυσταλλικού ταλαντωτή είναι 11,0592 MHz, τότε ο κύκλος ρολογιού του είναι 1/11,0592 MHz (δευτερόλεπτο), δηλαδή, ένας κύκλος παλμού διαρκεί τόσα δευτερόλεπτα.

3. Ο κύκλος μηχανής είναι ο κύκλος της CPU και ο χρόνος που απαιτείται για μια βασική λειτουργία ονομάζεται κύκλος μηχανής. Γενικά, ένας κύκλος μηχανής αποτελείται από πολλούς κύκλους ρολογιού. Κανονικά είναι 12 φορές/6 φορές.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Εισαγάγετε την περιγραφή της εικόνας εδώ

  • Πόσος χρόνος έχει περάσει από την προσθήκη 1;
    Όταν η συχνότητα του κρυσταλλικού ταλαντωτή είναι 11,0592 MHz, είναι ίση με 11059,2 KHz = 11059200 Hz
    Κύκλοι μηχανής = 12 x κύκλοι ρολογιού = 12 x (1/συχνότητα ρολογιού) δευτερόλεπτα = 12 / συχνότητα ρολογιού δευτερόλεπτα = 12 / 11059200 δευτερόλεπτα = 12 000 000 / 11059200 μικροδευτερόλεπτα = 1,085 (ΗΠΑ)
    Δηλαδή: όταν χρησιμοποιείται πολλαπλάσιο του 12, ο μετρητής θα +1 κάθε 1,085 us

2. Πώς να εφαρμόσετε την καταμέτρηση;

Ρυθμίζοντας τους σχετικούς καταχωρητές: Το παρακάτω σχήμα δείχνει τους σχετικούς καταχωρητές του χρονοδιακόπτη.
Εισαγάγετε την περιγραφή της εικόνας εδώ

  • Όπως φαίνεται στο σχήμα, υπάρχουν 2 καταχωρητές: ο πρώτος είναι TCON και ο δεύτερος είναι TCOM, και οι δύο είναι 8 bit ο καθένας.
  • Όπως φαίνεται στο σχήμα, υπάρχουν δύο τύποι χρονομετρητών: ο πρώτος είναι χρονοδιακόπτης bit T0 και ο δεύτερος είναι χρονοδιακόπτης T1. Είναι και οι δύο 16 bit το καθένα.

2.1 Μητρώο ελέγχου TCON

Εισαγάγετε την περιγραφή της εικόνας εδώ

TF0:定时器T0溢出中断标志,当定时器0开始计数时,计数到规定的时间时,定时器产生了溢出。TF0自动由0变位1(由硬件置1)。
如果不用中断,需要手动清零。

TR0:定时器T0的控制位,当为1时,定时器T0才能计数,相当于T0的开关(由软件控制)。
  • 1
  • 2
  • 3
  • 4

2.2 Καταχωρητής λειτουργίας λειτουργίας TCOM

Εισαγάγετε την περιγραφή της εικόνας εδώ

GATE:门控制位,当GATE=0时:计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数)。
			   当GATE=1时:是否计数不仅取决于TR1还取决于INT1引脚
C/T :时钟输入选择为,为1时,时钟从外部引脚P3.5口输入;为0时,时钟从内部输入
M1      M0
0        0        :13位定时器,使用高8位和低5位
0        1        :16位定时器,全用
1        0        :8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1.
1        1        :定时器无效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.3. Χρονοδιακόπτης T0

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ο χρονοδιακόπτης T0 έχει συνολικά 16 bit, χωρισμένους στα high 8 bit TH0 και στα low 8 bit TL0. Επομένως, μπορούν να μετρηθούν συνολικά 2^16 αριθμοί (65536) και ο κύκλος μέτρησης 1 αριθμού είναι 1,085us, επομένως η προεπιλογή είναι να ξεκινήσει η μέτρηση από το 0 και ο αθροιστικός χρονισμός είναι περίπου 71ms.

3. Θήκη: Χρησιμοποιήστε το χρονοδιακόπτη T0 για να ελέγξετε το LED ώστε να ανάβει και να σβήνει σε διαστήματα 1 δευτερολέπτου.

Κωδικός ①:

#include <REGX52.H>

sbit LED1 = P3^7;
void main(void)
{
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	
/*1、选择定时器T0,并配置为16位定时器*/
	TMOD =0x01;							// 0000 0001
	
/*
	2、定一个10ms的时间,数1下需要1.085us
	10ms需要数则需要数9216下,那从65536-9126=56320
	从56320这里开始数,数9216下就到了65536。当超过了
	65536时就报表了,控制寄存器TCON的TF0由0变为1	
*/
	TL0 = 0x00; //0000 0000
	TH0 = 0xDC;//1101 1100
	
/*3、打开定时器T0*/
	TR0 = 1;
	
	TF0 = 0;//先个溢出标志清零
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

【Σημείωση】

  • Μετά από κάθε αναφορά, πρέπει να δοθεί στο χρονόμετρο μια νέα αρχική τιμή.
  • Το cnt αυξάνεται κατά 1 κάθε 10 χιλιοστά του δευτερολέπτου Όταν το cnt αυξάνεται σε 100, σημαίνει ότι έχει περάσει 1 δευτερόλεπτο.

Βελτιστοποίηση κώδικα②:

#include <REGX52.H>

sbit LED1 = P3^7;

void Timer0_Init_10ms(void)//定时器初始化10ms
{
	TMOD =0x01;							
	
	TL0 = 0x00; //0000 0000
	TH0 = 0xDC;//1101 1100
	
	TR0 = 1;
	TF0 = 0;
}

void main(void)
{ 
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();
	
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
			
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Ενσωματώστε την αρχικοποίηση του χρονοδιακόπτη T0 σε μια συνάρτηση και καλέστε την απευθείας όταν χρειάζεται.
Αλλά η χρήση TMOD = 0x01 έχει επίσης ελαττώματα:

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001)
而我们使用定时器T0时TMOD初始为0x01,则TMOD的高4位为0x0(0000),则把定时器T1变为一个13位定时器了。所以还需要改进
  • 1
  • 2

Βελτιστοποίηση κώδικα ③:

#include <REGX52.H>

sbit LED1 = P3^7;

void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void main(void)
{ 
	int cnt = 0;
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();
	
	while(1)
	{
		if(TF0 == 1)//10ms报表了
		{	
			TF0 = 0;//软件清零,现在不使用中断
			TL0 = 0x00; //重新给初值
			TH0 = 0xDC;
			cnt++;
			if(cnt == 100)//数100次,相当于1s
			{
				cnt = 0;
				LED1 = !LED1;
			}
			
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Βρίσκουμε ότι η προετοιμασία του TMOD είναι:

TMOD &= 0xF0;		//设置定时器模式
TMOD |= 0x01;		//设置定时器模式
  • 1
  • 2

Ποια είναι τα οφέλη μιας τέτοιας προετοιμασίας;

假如定时器T1正在使用,且为16位定时器。则TMOD的高4位应该为:0x1(0001),而要使用定时器T0,且也为16位定时器,则TMOD =  0x11;
TMOD &= 0xF0;表示TMOD = TMOD & 0xf0,则与出来的TMOD = 0x10,由此可见,这一步就是让TMOD的高4位不变,低4位清零。
TMOD |= 0x01;表示TMOD = TMOD | 0x01,则或出来的TMOD = 0x11,由此可见,这一步就是让TMOD的高4位不变,低4位初始化。
通过这样初始化,既保证了TMOD的高4位不变(不改变定时器T1的初始化),由对低4位进行了改变(对定时器T0初始化)。
当然:也可以直让TMOD = 0x11;
  • 1
  • 2
  • 3
  • 4
  • 5