【蓝桥杯单片机笔记5】定时器简单应用及进阶

定时器,其实就是咱数电里面计时数的一种应用,带着学习计数器的思维来看单片机里面的定时器就会感觉简单一些了。

先简单说说原理。

比赛用的板子系统时钟是10MHz=0.1us

定时器时钟是5MHz=0.2us

板子有两个定时器T0和T1,都是十六进制的,由高八位的THx和低八位的TLx两个寄存器促成,计到65535之后,再输入一个信号,计数器就会堆栈溢出了,溢出位置是TCON寄存器的TF0或者TF1的位置。

如果要定时10ms的话,相当于计数10000个脉冲后计数器就计到最大值了

板子的定时器最大值为0xffff=65535

这里采用异步置数的方法进行及时,所以初始值应该设为65535-50000=15535=0x3caf

说一下怎么换算得到的:

初始值寄存器TH0=(65535-10000)/256=0xd8

TL0=(65535-10000)%256=0xef

其实在写代码的时候写到前面一步就可以了,计算机会自己进行计算的

51单片机的定时/计数器

51单片机有两个定时/计数器T0和T1,为16位加法计数器,由低8位TLx和高8位THx两个寄存器组成,最大计数值为65535个计数脉冲。
该加1计数器的计数脉冲来源有2个:
<1> 系统时钟振荡器输出的12分频。
<2> T0或T1引脚输入的外部脉冲信号。
每接收到一个计数脉冲,计数器就会加1,当计数值累计至全为1时(8位255,13位8191,16位65535),再输入一个计数脉冲,计数器便会溢出回零,并且计数器的溢出是TCON寄存器的TF0或TF1位置1,同时向内核提出中断请求。如果定时/计数器工作于定时模式,则表示间隔定时时间到,如果工作与计数模式,则表示计数值已满。
假设单片机的外部晶振为12MHz,那么,经过12分频后输入计数器的计数脉冲为1MHz,即每个脉冲的周期为1us。因此定时器T0的16位工作模式最大的定时时间为65535us,65.5ms。如果要定时10ms的话,计数器就不能够从0开始计数了,必须给它一个计数初值。怎么计算这个初值呢?
要定时10ms,则相当于计数10000个脉冲后计数器的值就到达65535了,那么开始计数的这个地方就是计数初值。
65535 - 10000 = 55535 = 0xd8ef
把这个计算得到的初值写入TH0和TL0寄存器即可:
TH0 = 0xd8;或者 TH0 = (65535 - 10000) / 256;
TL0 = 0xef; 或者 TL0 = (65535 - 10000) % 256;

定时/计数器相关的寄存器

【蓝桥杯单片机笔记5】定时器简单应用及进阶_第1张图片

主要就是两个函数:初始化和中断服务函数

(1)初始化

配置工作模式,对TMOD寄存器编程,参照上面写的功能进行设置
计算计数初值,对THx和TLx寄存器进行赋值
使能定时/计数器中断,ET0或ET1置1
打开总中断,EA =1
启动定时器,TR0或TR1置1

(2)中断服务函数
 如果不是自动重装模式,需要对THx和TLx重新赋值。
进行间隔定时程序的编写

写个代码实现一下

要求:使用板子的定时或计数器T0的模式1实现间隔定时,每个1秒L1闪烁一次(点亮0.5秒,熄灭0.5秒)每隔10秒L2闪烁一次

#include "reg52.h"  

sbit L1 = P0^0;        
sbit L2 = P0^1;
      
void selectHC573()
{
  P2=(P2&0x1f)|0x80;
}

void InitTimer0()
{
  TMOD=0x01;            //16位定时模式
  TH0=(65535-50000)/256;//定时50ms
  TL0=(65535-50000)%256;

  ET0=1;//定时中断使能//使能定时器T0中断
  EA=1;//使能总中断   
  TR0=1;//启动定时器T0
}

unsigned char count=0;

void SeviceTimer0() interrupt 1		   //中断号,计时器是1
{
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;

  count++;
  if((count%10)==0)
  {
   L1=~L1;
   }
  if(count==100)
  {
  L2=~L2;
  count=0;
  }
}

void main()
{ 
 selectHC573();
 InitTimer0();
 while(1)
 {
  
 }
}

【蓝桥杯单片机笔记5】定时器简单应用及进阶_第2张图片

#include"reg52.h"

sbit S4=P3^3;
sbit S5=P3^2;

unsigned char m=0,s=0,ms=0;

unsigned char code SMG_Duan[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

void HC138(unsigned char m)
{
	switch(m)
	{
		case 4:P2=(P2&0x1f)|0x80;break;	
		case 5:P2=(P2&0x1f)|0xa0;break;	
		case 6:P2=(P2&0x1f)|0xc0;break;	
		case 7:P2=(P2&0x1f)|0xe0;break;	
	}
}

void SMGdisplay_bit(unsigned char pos,unsigned char value)
{
	HC138(6);
	P0=0x01<

独立按键+数码管+计时器

你可能感兴趣的:(蓝桥杯单片机学习记录,单片机,蓝桥杯)