51单片机之定时器


定时1秒级联计算方法:
    首先明确 1、机械周期= 1/晶振频率(12MHZ) * 12 =1μS
             2、了解计算定时最大时间:2^16 *1μS=65.536ms
             3、计算50ms 对应的16进制值
                50ms/1μs=50000=0xC350
             4、设置定时器工作为16bit   2^16= 0xFFFF
                设置初值:T0=0xFFFF-0xC350=0x3CAF  即 从这个初始值开始,累计到最高   值时,用时50ms
             5、累计20个50ms  得到1s 定时周期

   

#include<reg51.h>
//共阳极数码管真值表
unsigned char code LedChar[]={
	0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
	0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
	};

void  main()
{
	unsigned int i=0;
    unsigned  char cnt=0;
	unsigned  int tcnt=0;
	TMOD = 0x01;     //设置工作模式
	TH0 = 0xB8;		 //定义初值 高字节
	TL0 = 0x00;		 //定义初值 低字节
	TR0 = 1;		 //开始计数 从初值开始计数++

	while(1)
	{
		if(TF0==1)		// 从初值累计到最高时间0xFFFF 触发一次TF0 溢出标志位  ,先计算20ms 多少个机器周期 ,并且转成16进制  ,
		{
		  TF0=0;
		  TH0=0xB8;
		  TL0=0x00;
		  tcnt++;

		  if(tcnt>=50)
		  {
		  tcnt=0;
		    if(cnt<8)
		   {
			  P0=~(0x01<<cnt);		   //0000 0001->1111 1110		  0000 0010 ->1111 1101
			  P2=LedChar[cnt+1];
		   }     
		   else if(cnt>=8)
		   {
			  P0= ~(0x80>>(cnt-7));        //1000 0000->0111 1111
			  P2=LedChar[cnt-7];
		   }
		
		   cnt++;
	
			if(cnt>=15)
			{
			cnt=0;
			}	  
		  }	
		}	 
	}
}

猜你喜欢

转载自yingang-1982.iteye.com/blog/2056002