51定時器/計數器齊上陣,借鑑

Real_Biter_Oliver發表於2019-01-26
NE555脈衝發生器
#include "reg52.h"			

typedef unsigned int u16;	
typedef unsigned char u8;

//--定義使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//顯示0~F的值

u8 DisplayData[8];

//--定義全域性變數--//
unsigned long   Freq;        //用來存放要顯示的頻率值
unsigned long	TimeCount;   //用於計算1S鐘的

void delay(u16 i)
{
	while(i--);	
}

void DigDisplay()//數碼管動態掃描函式,迴圈掃描8個數碼管顯示
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位選,選擇點亮的數碼管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//顯示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//顯示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//顯示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//顯示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//顯示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//顯示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//顯示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//顯示第7位	
		}
		GPIO_DIG=DisplayData[i];//傳送段碼
		delay(10); //間隔一段時間掃描	
		GPIO_DIG=0x00;//消隱
	}
}

void Timer_Config()//配置定時/計數器T0和T1
{
	//--定時器T1做計數器,工作方式1(16位定時器),只由TRx開啟計數器--//
	//--定時器T0做定時器,工作方式1(16位定時器),只由TRx開啟定時器--//	
	TMOD=0x51;

	//--設定定時器晶振為12MHZ時定時50ms--//
	TH0=0x3C;
	TL0=0xB0;

	//--開啟中斷-//
	ET0=1;
	ET1=1;
	EA=1;

	//--開啟定時器*/
	TR0=1;
	TR1=1;
}

void main()
{	
	Timer_Config();
	
	while(1)
	{
		if(TR1 == 0)         //當計數器停下的時候,表明計數完畢
		{
			Freq = Freq + TL1;         //讀取TL的值
			Freq = Freq + (TH1 * 256); //讀取TH的值

			//--求頻率的個十百千萬十萬位--//
			DisplayData[0] = smgduan[Freq%1000000/100000];	
			DisplayData[1] = smgduan[Freq%100000/10000];	
			DisplayData[2] = smgduan[Freq%10000/1000];	
			DisplayData[3] = smgduan[Freq%1000/100];	
			DisplayData[4] = smgduan[Freq%100/10];	
			DisplayData[5] = smgduan[Freq%10];
			
			//--顯示完,重新計算下一次頻率。--//	
			Freq = 0;//將計算的頻率清零
			TH1 = 0; //將計數器的值清零
			TL1 = 0;
			TR0 = 1; //開啟定時器
			TR1 = 1; //開啟計數器	
		}

		//--顯示求得的數值--//
		DigDisplay();
	}				
}

void Timer0() interrupt 1
{
	//--12MHZ設定定時50ms的初值--//
	TH0=0x3C;
	TL0=0xB0;
	
	TimeCount++;
	if(TimeCount==20)//計時到1S
	{
		TR0=0;
		TR1=0;
		TimeCount=0;		
	}		
}

void Timer1() interrupt 3
{	
	//--進入一次中斷,表明計數到了65536--//
	Freq=Freq+65536;		
}

 

相關文章