51单片机完全学习——定时器和计数器

一、定时器如何工作

  1. 先设置好定时器的是时钟源(51不需要)
  2. 初始化时钟相关寄存器
  3. 设置定时时间
  4. 设置中断处理程序
  5. 打开定时器
  6. 定时器计数结束后会产生中断,然后执行中断处理程序

二、寄存器的工作原理

硬件在软件层面就抽象成了寄存器,寄存器和硬件之间有双向影响,软件可以读写寄存器,寄存器是软件能够控制硬件的关键。寄存器一般按位定义,寄存器使用地址访问,编程上像内存一样。各种内部外设的编程接口就是寄存器,寄存器会随着单片机的复杂而复杂,一定要学会使用C语言来操作寄存器。

三、51单片机定时器简介

定时器的本质是对脉冲进行计数,51定时器T0和T1是加法计数器。(需要注意定时时时间的设置为65535-需要定的时间)如果计数脉冲来自系统时钟,则为定时方式。如果技术脉冲来自单片机外部引脚,则为计数方式,每来一个脉冲加1。T0有4种模式,T1有3种方式。

定时器相关寄存器:TCON、TMOD、TL0、TL1、TH0、TH1。其中MSB表示高位,LSB表示低位。具体的寄存器功能看数据手册就可以了,这里就不赘述了。

GATE一般的作为计数器是才等于1,相当于在外部满足某些条件时,才会计数,做为定时器时一般都等于0。由于定时器是16位的,因此最多可以计数65536个脉冲,因此最多可以定时65.536个毫秒。由于使用的是12MHz的晶振进行了12分频,因此一个脉冲就是1个微秒。因此比如我们想要定时1000微秒,那么我们的初始值为65535-1000,然后将这个数的高8为放到TH0,低8位放到TL0中。主要是因为51单片机是加法定时器。

四、定时器编程实战

//#include <reg51.h>
#include <intrins.h>

#include "shumaguan.h"
//#include "dainzhen.h"
#include "anjian.h"

u8 cont = 0;

void main(void)
{
	u8 key = 0;
	TMOD = 0x01;    //设置定时器的工作模式位16位
	TH0 = 0x3c;     //设置定时器的初始值高8位
	TL0 = 0xb0;     //设置定时器的初始值低8位
	TR0 = 1;        //开启定时器T0
	ET0 = 1;        //打开定时器T0的中断
	EA = 1;         //打开总中断
	
	while(1)
	{
	  key = anjian_juzhen();
      ShuMaGuanShow(0, key-1);
  }
}


void timer0_int(void) interrupt 1 using 1   //中断处理程序中使用内部寄存器bank1 r0 r1这些寄存器都有4个bank
{                                           //这样在运行中断的时候就不用再保存主程序的寄存器了,可以提高程序运行速度
    TH0 = 0x3c;
	TL0 = 0xb0;	
	if (cont == 20)
	{
      LED = !LED;
      cont = 0;
	}
	cont++;
	
}

关于编程注意:一定不要忘记打开中断,因为我们使用中断来进行处理,一方面要设置定时器的相关寄存器,另一方面还要设置中断相关的寄存器。再就是我们如果想要定比较长的时间,可以和我一样使用一个变量cont,多中断几次才会进入我们想要处理的程序。还有就是由于16位定时器不能自动重载。因此我们需要在中断处理程序中重新赋初值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值