51单片机学习笔记之中断与定时器(一)

定时器与中断(基于海创电子的讲解,海创的视频真的讲的很好,很多知识都讲透了,超级推的,感兴趣的可以去B站搜来看看)

可以借鉴参考手册,辅助学习真的好!

中断和定时器
定时器:类似于一个水桶,先装好一定的水,如果在规定的时间内水满了,水会溢出,说明我们规定的时间到了。
时钟周期:相当于单片机的一个最小单位,一个时钟周期内单片机仅完成一个最基本的动作
表达式为:1/(晶振*1000000)
机器周期:单片机完成完成一个基本操作所需要的时间,是时钟周期的12倍

假设我们定时20ms(晶振为12M,有些开发板的晶振是11.592M的,注意看一下)
晶振的震动次数*(12/12000000)=0.02(化为秒来算)
次数=20000
则装的水为65536-20000=45536
如果采用定时模式1,我们需要将45536化为十六进制装入寄存器TH0和TL0中(TH0是高8位,TL0是低8位,记法TH:Time Hight TL:Time Low)
装载方法:
TH0:45536/256=177,177转化为16进制 **还可以直接这样写//**TH0=(65536-20000)/256
TL0:45536%256=224,224转化为16进制 TL0=(65536-20000)%256

常用的寄存器*(注意可位寻址的意思是可以直接进行位操作,就是可以直接对位进行控制)*

TCON寄存器

51单片机学习笔记之中断与定时器(一)_第1张图片
TF1/0:定时器T1/0的溢出标志位,相当于检测水满了的工具,产生溢出事可由硬件置“1”
在这里插入图片描述
在这里插入图片描述
TR1/0:TR1=1时允许定时器T1开始计时,TR1=0是禁止T1计时
TR0同样道理,不过是定时器0的
在这里插入图片描述

TMOD寄存器(注意不可操作,就直接十六进制写入TMOD=0x–)

51单片机学习笔记之中断与定时器(一)_第2张图片
51单片机学习笔记之中断与定时器(一)_第3张图片
我们要使用的是TL和TH,则要控制各自定时器的M1和M0为0和1,如上图所示,定时器0就是TMOD=0x01;直接像点灯一样控制电平一样

查询法配置定时器的步骤(用if函数来查询)

1.通过配置寄存器TMOD确定定时模式,即工作模式,一般为模式一
2.将计算得到的初值装载到TH0和TL0中(这是定时器0的,若是定时器1则为TH1和TL1)
3.通过配置TR0启动定时器0(定时器1则为TR1)
4.判断标志位TF0,若TF0为1表示溢出,通过软件清零再重新进行监测
我自己写的代码,我是根据参考手册和步骤一条一条的打的,没有抄别视频的,这里说一句,参考手册牛逼!!

#include
sbit  led =P2^0;

void main()
{
   TMOD=0x01;       		 //确定容器的大小,工作模式
   TH0=(65536-48300)/256;	//50ms	装载初值
   TL0=(65536-48300)%256;
   TR0=1;					//打开定时器T0  可以记为 Time Run 0  启动嘛
   while(1)
   {   
      unsigned int count;
   	  if(TF0==1)
	  {
		 TF0=0;
		 TH0=(65536-48300)/256;	//50ms	 重装初值
   		 TL0=(65536-48300)%256;
		 count++;
		 if(count>=20)		   //1s闪烁
		 {
		 	led=~led;
			count=0;
		 }

	  }
   }
}

中断法配置定时器(用中断函数来写)

中断:本来再做某件事,然后突然去处理某事,处理完后回来继续处理未处理完的事。
中断有嵌套的

中断函数的编写格式:void 变量名() interrupt 中断号

中断常用的寄存器
EA:总中断允许控制位,使用中断时必须使EA=1
ET0:T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断
ES:串口1中断允许位。ES=1,允许串口1中断,ES=0,禁止串口1中断
51单片机学习笔记之中断与定时器(一)_第4张图片
自己写的程序

#include
sbit led =P2^1;
void main()
{
   EA=1;					  //开启总中断,这个相当于校长
   TMOD =0x01;
   TH0=(65536-48300)/256;	  //50ms
   TL0=(65536-48300)%256;
   TR0=1;				 //	打开定时器T0
   ET0=1;				 //允许中断	   这个相当于班主任,只有校长和班主任同意中断才能中断
  
   while(1)
   {
   		;
   }
}
 void time0() interrupt 1
 {
   unsigned int count;
   TF0=0;					//注意TF0同时是中断请求标志位,
                           //TF0=1,请求中断	
   TH0=(65536-48300)/256;	  //50ms 装初值
   TL0=(65536-48300)%256;
   count+=1;
   if(count>=20)
   {
   	 led=~led;
	 count=0;
   }

 }

static:定义全局变量

你可能感兴趣的:(51单片机,定时器)