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

Puzhong 51 सूक्ष्मनियन्त्रक: समयनिर्धारकाणां गणकस्य च विस्तृतव्याख्यानम् अनुप्रयोगश्च (7)

2024-07-12

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

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

आमुख

टाइमर्, काउण्टर् च हार्डवेयर मॉड्यूल् सन्ति, येषां उपयोगः समयान्तराणां मापनार्थं वा घटनानां गणनायाः वा भवति । तेषां उपयोगः बहुषु अनुप्रयोगेषु यथा सटीकसमयविलम्बं जनयितुं, आवृत्तीनां मापनं, बाह्यघटनानां गणना इत्यादिषु कर्तुं शक्यते । ५१ सूक्ष्मनियन्त्रकस्य समयनिर्धारकः सूक्ष्मनियन्त्रकस्य आन्तरिकसम्पदां भवति, तस्य परिपथस्य संयोजनं संचालनं च सूक्ष्मनियन्त्रकस्य अन्तः एव सम्पन्नं भवति अस्मिन् लेखे ५१ सूक्ष्मनियन्त्रके टाइमर्-गणकयोः कार्यसिद्धान्तस्य, विन्यासविधिस्य, अनुप्रयोगस्य च विस्तरेण परिचयः भविष्यति ।

अस्मिन् अध्याये व्यत्ययसम्बद्धं ज्ञानं विशिष्टसामग्रीणां कृते कृपया पश्यन्तु ।व्यत्यय प्रणाली व्याख्या

नोटः- समयनिर्धारकसंसाधनाः सूक्ष्मनियन्त्रकस्य आदर्शेन सह सम्बद्धाः सन्ति

समयनिर्धारकः कथं कार्यं करोति

समयनिर्धारकः सूक्ष्मनियन्त्रकस्य अन्तः लघु अलार्मघटिका इव भवति घण्टायाः निर्गमसंकेतस्य अनुसारं गणना-एककस्य मूल्यं प्रत्येकं "एकसेकेण्ड्" एकेन वर्धते । यदा गणना-एककस्य मूल्यं "सेट् अलार्म-स्मरणसमये" वर्धते, तदा गणना-एककं व्यत्यय-प्रणाल्यां व्यत्यय-अनुरोधं निर्गच्छति, "रिंग-स्मरणं" जनयिष्यति, तथा च कार्यक्रमं निष्पादनार्थं व्यत्यय-सेवा-कार्यं प्रति कूर्दति .

समयनिर्धारकस्य/गणकस्य कार्यसिद्धान्तः घण्टानाडीषु आधारितः भवति । समयनिर्धारकविधाने ते गणनाय आन्तरिकघटिकास्रोतः उपयुञ्जते; प्रत्येकं समयनिर्धारकस्य/गणकस्य एकः रजिस्टरः भवति यः वर्तमानगणनामूल्यं संगृह्णाति ।

TMOD टाइमर/काउंटर ऑपरेटिंग मोड रजिस्टर

समयः गणना च कार्याणि विशेषकार्यपञ्जिकायाः ​​TMOD इत्यस्य नियन्त्रणबिट्-द्वारा नियन्त्रितानि भवन्ति । सीटी Csqrt{T}टी चयनं कर्तुं TMOD रजिस्टरस्य सूचना निम्नलिखितसारणीयां सूचीबद्धा अस्ति । द्रष्टुं शक्यते यत् २ टाइमर्/काउण्टर् मध्ये चत्वारः ऑपरेटिङ्ग् मोड्स् सन्ति, ये TMOD इत्यस्य M1 तथा M0 इत्येतयोः माध्यमेन चयनिताः सन्ति । द्वयोः टाइमर्/गणकयोः मोड् ०, १, २ च समानाः सन्ति, परन्तु मोड् ३ प्रत्येकस्मिन् मोड् मध्ये कार्याणि यथा सन्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

टाइमर वर्किंग मोड

रजिस्टर TMOD रजिस्टर् मध्ये M1 तथा M0 सेट् कृत्वा टाइमर्/काउण्टर् 0 तथा 1 इत्येतयोः चत्वारः भिन्नाः ऑपरेटिंग् मोड् भवन्ति ।

मोड 0 (13-बिट टाइमर/काउंटर) .

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
कार्यविधिचित्रं निम्नलिखितम् अस्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

मोड् १ (१६-बिट् टाइमर्/काउण्टर) २.

मोड् १ मोड् ० इत्यस्य समानः अस्ति केवलं TH0 तथा TL0 इत्येतयोः सर्वे १६ बिट् उपयुज्यन्ते । अस्मिन् मोड् मध्ये TL0 इत्यस्य 8-बिट् ओवरफ्लो TH0 यावत् वहति, TH0 इत्यस्य ओवरफ्लो च TCON मध्ये ओवरफ्लो ध्वजं TF0 सेट् करोति ।

यदा GATE=0(TMOD.3), यदि TR0=1, तर्हि समयनिर्धारकः गण्यते । यदा GATE=1 भवति तदा बाह्यनिवेशः INTO इत्यस्य समयनिर्धारकं 0 नियन्त्रयितुं अनुमतिः भवति, येन नाडीविस्तारमापनं प्राप्तुं शक्यते । TRO TCON रजिस्टर् मध्ये नियन्त्रणबिट् अस्ति ।

नोटः STC89C51RC/RD+ श्रृङ्खलायाः सूक्ष्मनियन्त्रकस्य समयनिर्धारके द्वौ गणनादरौ स्तः: एकः 12T मोडः अस्ति, प्रत्येकं 12 घण्टासु 1 योजयति, पारम्परिकस्य 8051 सूक्ष्मनियन्त्रकस्य समानः, अन्यः 6T मोडः अस्ति, प्रत्येकं 6 घण्टासु 1 योजयति, गतिः The T0 दरः, यः पारम्परिकस्य 8051 सूक्ष्मनियन्त्रकस्य 2 गुणा भवति, सः उपयोक्तृप्रोग्रामं दहनसमये STC-ISP प्रोग्रामर् मध्ये सेट् भवति ।

मोड २ (८-बिट् स्वतः पुनः लोड् मोड्) २.

अस्मिन् मोड् मध्ये टाइमर्/काउण्टर् स्वयमेव 8-बिट् काउण्टर् पुनः लोड् कर्तुं शक्नोति TL0 इत्यस्य ओवरफ्लो न केवलं TF0 सेट् करोति, अपितु TH0 इत्यस्य सामग्रीं TL0 इत्यत्र पुनः लोड् करोति । (TH0 प्रथमं सेट् कर्तुं शक्यते, पुनःस्थापनकाले च TH0 इत्यस्य सामग्री अपरिवर्तिता एव तिष्ठति)
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

मोड ३ (द्वौ ८-बिट् गणकौ) २.

Timer 0 कृते अस्मिन् मोड् मध्ये Timer 1 गणनां स्थगयति, प्रभावः च TR1 इत्यस्य 0 इति सेट् करणस्य समानः भवति ।


टाइमर 0 कृते अस्मिन् मोड् मध्ये टाइमर 0 इत्यस्य TL0 तथा TH0 द्वौ स्वतन्त्रौ 8-बिट् गणकौ रूपेण कार्यं कुर्वन्ति । अधोलिखिते चित्रे 3 मोड् मध्ये टाइमर् 0 इत्यस्य तर्कचित्रं दृश्यते । TL0 टाइमर 0 इत्यस्य नियन्त्रणबिट् व्याप्नोति: सीटी Csqrt{T}टी , GATE, TRO, INTO तथा TFO इति । THO टाइमर फंक्शन् (काउण्टर पीरियड्) यावत् सीमितं भवति तथा च टाइमर 1 इत्यस्य TR1 तथा TF1 इत्यत्र कब्जां करोति । अस्मिन् समये TH0 समयनिर्धारकं 1 व्यत्ययं नियन्त्रयति ।

अतिरिक्तं ८-बिट् टाइमर्/काउण्टरं योजयितुं मोड् ३ प्रदत्तः अस्ति, येन सूक्ष्मनियन्त्रकं त्रीणि टाइमर्/काउण्टर् ददाति । मोड् ३ केवलं टाइमर्/काउण्टर् ० कृते एव प्रयोज्यः यदा टाइमर् T1 मोड् ३ मध्ये भवति तदा सः TR1-0 इत्यस्य समकक्षः भवति तथा च गणनां स्थगयति, तथा च T0 इत्यस्य उपयोगः द्वौ टाइमर् इत्यस्य रूपेण कर्तुं शक्यते
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

टाइमर विन्यास प्रक्रिया

  1. T0 तथा T1 कथं कार्यं कुर्वन्ति इति निर्धारयितुं TMOD कृते मूल्यानि नियुक्तं कुर्वन्तु ।
  2. समयनिर्धारणसमयानुसारं प्रारम्भिकमूल्यं गणयन्तु, TH0, TL0 अथवा TH1, TL1 इत्यत्र लिखन्तु ।
  3. यदि व्यत्ययस्य उपयोगः भवति तर्हि EA इत्यस्मै मूल्यं नियुक्तं कृत्वा टाइमर कुलव्यत्ययं उद्घाटयन्तु ।
  4. टाइमर/काउण्टर टाइमिंग् अथवा गणना आरभ्यतुं TR0 अथवा TR1 सेट् कुर्वन्तु।

नोट्: STC-ISP प्रोग्रामिंग टूल् गणना कर्तव्यस्य समयस्य प्रारम्भिकमूल्येन सह आगच्छति यत् भवान् चयनितस्य मोड् इत्यस्य अनुसारं कोडं प्रतिलिखितुं शक्नोति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

कोडप्रदर्शनम् - LED1 १ सेकेण्ड् अन्तरालेन ज्वलति

LED1 सूचकप्रकाशः टाइमर 0 व्यत्ययस्य माध्यमेन 1 सेकण्डस्य अन्तरालेन ज्वलति इति नियन्त्रितः भवति: D1 P2_0 पिन इत्यनेन सह सम्बद्धं भवति प्रत्येकं समये interrupt trigger function इत्यस्य उपयोगः भवति यदा 1000 भवति तदा एकं सेकण्ड् भवति ।

#include <REGX52.H>

sbit LED1 = P2^0;

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		LED1 = !LED1;
	}
	count++;
}


void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}


void main()
{
	Timer0_Init();
	while(1)
	{
		
	}	
}
  • 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

कोडप्रदर्शनम् - बटन् १ LED रनिंग लाइट् इत्यस्य स्थितिं नियन्त्रयति

अस्मिन् प्रदर्शने INTRINS.H पुस्तकालये _crol_left shift तथा ​​_cror_right shift कार्याणि उपयुज्यन्ते यदा KEY1 बटनं दबावति तदा LED चालनप्रकाशः दिशास्थितिं परिवर्तयिष्यति, ज्वलति च । भौतिकचित्रसंयोजनम् : K1 P0_0 पिन इत्यनेन सह सम्बद्धं भवति, अष्टौ LED प्रकाशाः च P2 पिनमध्ये सम्मिलिताः भवन्ति ।

  • कोटिः(unsigned char val, unsigned char n): वर्णाः दक्षिणतः परिभ्रमन्तु, तथा च val इत्यस्य दक्षिणतः n बिटैः परिभ्रमन्तु ।
  • crol(unsigned char val, unsigned char n): वर्णाः वामभागे परिभ्रमन्तु, val इत्यस्य वामभागे n बिटैः परिभ्रमन्तु
#include <REGX52.H>
#include <INTRINS.H>

sbit KEY1 = P0^0;
sbit KEY2 = P0^1;
unsigned char LEDMode;

void DelayXms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		if(LEDMode == 0)
			P2 = _crol_(P2,1);
		if(LEDMode == 1)
			P2 = _cror_(P2,1);

	}
	count++;
}

unsigned char Getkey()
{
	unsigned char keyNumber = 0;
	if(KEY1 == 0)
	{
		DelayXms(5);
		while(KEY1 == 0);
		DelayXms(5);
		keyNumber = 1;
	}
	if(KEY2 == 0)
	{
		DelayXms(5);
		while(KEY2 == 0);
		DelayXms(5);
		keyNumber = 2;
	}
	return keyNumber;
}


void main()
{
	unsigned char keyNum = 0;
	P2 = 0xfe;
	Timer0_Init();
	while(1)
	{
		keyNum = Getkey();
		if(keyNum)
		{
			if(keyNum == 1)
			{
				LEDMode++;
				if(LEDMode>=2)
				{
					LEDMode = 0;	
				}
			}
		}
	}
}
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

कोड प्रदर्शनम् - LCD1602 टाइमर घड़ी प्रदर्शनम्

अयं प्रदर्शनसङ्केतः LCD1602 मॉड्यूलस्य उपयोगं प्रदर्शनरूपेण करोति LCD1602 मॉड्यूलस्य विस्तरेण व्याख्यानं न भविष्यति, विशेषाध्यायनिर्देशाः च पश्चात् प्रदत्ताः भविष्यन्ति । यदि भवद्भ्यः LCD1602 पुस्तकालयस्य आवश्यकता अस्ति तर्हि भवान् मां निजीरूपेण सन्देशं कर्तुं शक्नोति। भौतिकचित्रसंयोजनम् : केवलं LCD1602 मॉड्यूल् बोर्ड् मध्ये प्लगं कुर्वन्तु।

#include <REGX52.H>
#include "LCD1602.h"

unsigned char Sec=55,Min=59,Hour;//秒分时

void DelayXms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;//打开T0中断
	EA = 1;//打开总中断
	TR0 = 1;				//定时器0开始计时
}

void External0_ISR(void) interrupt 1
{
	static unsigned int count = 0;
	TL0 = 0x18;	//需要手动复原			
	TH0 = 0xFC;	//需要手动复原
    // 中断处理代码
	if(count == 1000)
	{
		count = 0;
		Sec++;
		if(Sec == 60)
		{
			Sec = 0;
			Min++;
			if(Min == 60)
			{
				Min = 0;
				Hour++;
				if(Hour == 24)
				{
					Hour = 0;
				}
			}

		}
	}
	count++;
}

void main()
{
	Timer0_Init();
	LCD_Init();
	LCD_ShowString(1,1,"Time:");
	LCD_ShowString(2,1,"00:00:00");
	while(1)
	{
		LCD_ShowNum(2,1,Hour,2);
		LCD_ShowNum(2,4,Min,2);
		LCD_ShowNum(2,7,Sec,2);
	}	
}
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75