प्रौद्योगिकी साझेदारी

०४: समयनिर्धारकः

2024-07-12

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


यदा समयनिर्धारकस्य उपयोगः भवति तदा सः गणनाय आन्तरिकदोलकपरिपथस्य उपरि अवलम्बते । यदा समयनिर्धारकस्य उपयोगाय विन्यस्तं भवति तदा प्रतियन्त्रचक्रं प्रति गणकस्मृतेः मूल्यं १ वर्धते ।

1. समयनिर्धारकं कथं सेट् कर्तव्यम्

1. स्फटिकदोलकः (crystal oscillator) स्पन्दनानि उत्सर्जयति, समयनिर्धारणाय च स्पन्दनानां संख्यां अभिलेखयति ।
2. नाडीयाः आवृत्तिः घण्टायाः आवृत्तिः भवति, अस्याः आवृत्तेः परस्परं दोलनकालः (घटिकाचक्रः) भवति, यः सङ्गणके समयस्य लघुतमः एककः अपि भवति
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

यथा चित्रे दर्शितम् : स्फटिकदोलकस्य आवृत्तिः ११.०५९२मेगाहर्ट्जः भवति, ततः तस्य घण्टाचक्रं १/११.०५९२मेगाहर्ट्ज (द्वितीयं) भवति, अर्थात् एकं नाडीचक्रं एतावन्तः सेकेण्ड् यावत् भवति

3. यन्त्रचक्रं CPU चक्रं भवति, मूलभूतक्रियायाः कृते आवश्यकः समयः यन्त्रचक्रम् इति कथ्यते । सामान्यतया यन्त्रचक्रे अनेकघटिकचक्राणि भवन्ति । सामान्यतया १२ गुणाः/६ गुणाः भवति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

  • १ योजयित्वा कियत् समयः व्यतीतः ?
    यदा स्फटिकदोलकस्य आवृत्तिः ११.०५९२मेगाहर्ट्जः भवति तदा सा ११०५९.२केहर्ट्ज = ११०५९२००हर्ट्ज इत्यस्य बराबरः भवति
    यन्त्रचक्रम् = १२ x घण्टाचक्रम् = १२ x (१/घटिका आवृत्तिः) सेकण्डः = १२ / घण्टा आवृत्तिः सेकण्डः = १२ / ११०५९२०० सेकण्डः = १२ ००० ००० / ११०५९२०० सूक्ष्मसेकेण्ड् = १.०८५ (अस्माकं)
    अर्थात् 12 इत्यस्य गुणनखण्डस्य उपयोगं कुर्वन् गणकः प्रत्येकं 1.085us +1 भविष्यति

2. गणना कथं कार्यान्वितुं शक्यते ?

प्रासंगिकपञ्जिकानां विन्यस्तीकरणेन : निम्नलिखितचित्रे समयनिर्धारकस्य प्रासंगिकपञ्जिकाः दर्शिताः सन्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

  • यथा चित्रे दर्शितं, २ रजिस्टर्स् सन्ति : प्रथमं TCON द्वितीयं च TCOM, ययोः द्वयोः अपि ८ बिट् प्रत्येकं भवति ।
  • यथा चित्रे दर्शितं, द्वौ प्रकारौ समयनिर्धारकौ स्तः प्रथमः बिट् टाइमर् T0, द्वितीयः च टाइमर् T1 तौ द्वौ अपि १६ बिट् ।

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 इत्यस्य कुलम् १६ बिट् सन्ति, ये उच्चेषु ८ बिट् TH0 तथा निम्न ८ बिट् TL0 इति विभक्ताः सन्ति । अतः कुलम् २^१६ सङ्ख्याः (६५५३६) गणयितुं शक्यन्ते, १ सङ्ख्यायाः गणनायाः चक्रं च १.०८५us भवति, अतः पूर्वनिर्धारितं ० तः गणना आरभ्यत इति, सञ्चितसमयः च प्रायः ७१ms भवति

3. प्रकरणम् : 1s अन्तरालेन चालू-निष्क्रान्तं च कर्तुं LED-इत्यस्य नियन्त्रणार्थं टाइमर T0 इत्यस्य उपयोगं कुर्वन्तु ।

संहिता १ : १.

#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 प्रत्येकं १० मिलीसेकेण्ड् मध्ये १ वर्धते यदा cnt १०० यावत् वर्धते तदा १ सेकण्ड् अतीतः इति अर्थः ।

कोड अनुकूलन2: 1.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

Timer T0 initialization इत्येतत् function इत्यस्मिन् encapsulate कृत्वा आवश्यकतायां प्रत्यक्षतया आह्वयन्तु ।
परन्तु TMOD = 0x01 इत्यस्य उपयोगेन एतादृशस्य आरम्भीकरणस्य अपि दोषाः सन्ति:

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

संहिता अनुकूलनम् 3: .

#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