(给自己看)51单片机定时器

用法

dsq.c文件:(main.c文件可以直接用time_init()来调用但是目前来看中断由于涉及变量得通过 extern 【变量】来实现,因此干脆将中断放在主函数中)

void time_init()  //初始化定时器
{  
	TMOD=0x01;
	TF0=0;        //定时器的计数起点为0
	TR0=1;        //启动定时器0
	TH0=0xFC;    // TH0=0x3C;
	TL0=0x18;     // TL0=0xAF;    
	
	ET0=1;       //允许中断
	EA=1;        //允许中断
	
	
}


void time_routine() interrupt 1{   //中断
	 TH0=0xFC;         TH0=0x3C;(这个是时钟芯片的)    //定时器复位
	  TL0=0x18;        TL0=0xAF;                   //定时器复位
	count++;
	if(count==20){
		ms++;
		if(ms>=61)
			{
			mm++;
				ms=0;
		}
			if(mm>=61)
			{
			mh++;
				mm=0;
		}
			if(mh>=25)
			{
			
				mh=0;
		}
		
	}
}

                                                                                         ——来自普中51单片机开发攻略_V1.2

计时方法

     当你使用12MHZ的外部晶振的时候,机器周期=1/1M=1us。

    如果我们想定时1ms的初值是多少呢? 1ms/1us=1000。也就是要计数1000个,

初值=65535-1000+1  (因为实际上计数器计数到65536 (2的16次方)才溢出,所以后面要加1

                  也就是说溢出:后面加一,这样实际到65536(65535+1)就中断一次。

     

                           64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。

那为什么会用TH0,Y=TL0分别存放64536的一部分呢?

 TH0存放高八位,TL0存放低八位;

THx =(65536-1000)/256;TLX =(65536-1000)%256;

1111 1111=256,因此/256获取高八位%256获取低八位

但是这里有个问题,如果以TH0=0xFC,TL0=0x18的话,最低间隔就是1ms,如果我想要0.5ms就不行了(应该)。

目前是大一新生,忘海涵,如果有问题请和我讲

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值