定时器/计数器设计实验

要求:了解定时器的各种工作方式, 掌握定时器/计数器的使用和编程方法

 实验题目:采用12MHZ时钟频率的单片机,通过一个开关输入,触发定时计数。按下开关10次,计算按键的平均时间,并通过数码管显示出来。

定时器/计数器设计实验_第1张图片

#include
#include
#define uint unsigned int
#define uchar unsigned char

uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77};//0-10的数值编码
uchar Digits_of_6DSY[]={0,0,0,0,0,0};
uint Count=0;//中断次数
sbit Dot=P1^7;//小数点

void Delay()
{
	uchar n=10,i;
	while(n--)
		for(i=0;i<120;i++);
}

void Show_Count_ON_DSY()
{
	P0=~DSY_CODE[Count];//数码管上显示中断的次数		
	Delay();		
}

void EX_INT0() interrupt 0
{
	char i = 0;
	Count++;//统计中断次数
	if(Count>11) //大于十置零
	{
		while(i < 6)
		{
			Digits_of_6DSY[i]=0;
			++i;
		}
		Count=0;
		TH0=-1000/256;//1MS定时
		TL0=-1000%256;
		TR0 = 1;
	}
	Show_Count_ON_DSY();
}

void Time0() interrupt 1
{
	uchar i,j,n;
	TR0 = 0;
	TH0=-1000/256;//1MS定时
	TL0=-1000%256;
	if(Count<=10)
	{
		Digits_of_6DSY[0]++;//0.1ms累加
		for(i=0;i<5;i++) //处理进位问题
		{
			if(Digits_of_6DSY[i]==10)
			{
				Digits_of_6DSY[i]=0;
				if(i<5)
					Digits_of_6DSY[i+1]++;
			}
		}
	    j=0x7f;
			for(n=5;n!=-1;n--)
			{
				j=_crol_(j,1);
				P2=j;
				P1=DSY_CODE[Digits_of_6DSY[n]];//显示数位
				if(n==1)
					Dot=1;
				Delay();
			}
	}
	else
		return ;
	TR0 = 1;
}

void main()
{
	uchar j,n;
	P0=0xFF;
	P1=0x00;
	P2=0xFF;
	IE=0x83;	   //允许INT0中断以及定时器0中断
	IT0=1;		   //下降沿触发
	TMOD=0x01;
	TH0=-1000/256;
	TL0=-1000%256;
	TR0=1;
	
	while(1)
	{
	if(Count>10) { 
	   TR0=0;
		while(1)
		{
			j=0x7f;
			for(n=5;n!=-1;n--)
			{
				j=_crol_(j,1);
				P2=j;
				P1=DSY_CODE[Digits_of_6DSY[n]];//显示数位
				if(n==2)
					Dot=1;
				Delay();
			}
		}} 	
	   //Show_Count_ON_DSY();//显示中断次数	
	}
}


你可能感兴趣的:(单片机89C51)