欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 08:58:17
...

定时器与中断(基于海创电子的讲解,海创的视频真的讲的很好,很多知识都讲透了,超级推的,感兴趣的可以去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单片机学习笔记之中断与定时器(一)
TF1/0:定时器T1/0的溢出标志位,相当于检测水满了的工具,产生溢出事可由硬件置“1”
51单片机学习笔记之中断与定时器(一)
51单片机学习笔记之中断与定时器(一)
TR1/0:TR1=1时允许定时器T1开始计时,TR1=0是禁止T1计时
TR0同样道理,不过是定时器0的
51单片机学习笔记之中断与定时器(一)

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

51单片机学习笔记之中断与定时器(一)
51单片机学习笔记之中断与定时器(一)
我们要使用的是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<reg52.h>
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单片机学习笔记之中断与定时器(一)
自己写的程序

#include<reg52.h>
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:定义全局变量