登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 单片机定时器应用

[复制链接]
发表于 2018-1-28 21:17:39 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机基础
学习安排: 掌握定时器的基本应用
开始时间: 2018-01-28
结束时间: 2018-01-28
  昨天学到了了用部里的开发板点亮一个led小灯的知识,而今天就更近一步了,学会了利用单片机内部的定时器来进行精准定时,从而实现让数码管计时。

  所谓定时器就是用来计数定时的,在单片机工程中可以说是很重要的一部分了,对于使用定时器之前要先知道它的工作原理。定时器在单片机内部就是一个特殊寄存器,在使用时要对这个特殊寄存器进行一系列的配置,由于单片机中不止一个定时器,所以我就以T0定时器为例,在使用时有以下几个步骤:
   1 设置特殊功能寄存器TMOD,配置好工作方试。定时器有许多种工作模式,平常使用都是将TH0和TL0合为一个16位的计数器,通过查找真值表,需要配置TMOD=0x01。
211738fw36pup2f21uxifx.jpg
211738u55fqddzfvqpcwr8.jpg
   2 设计计数寄存器TH0和TL0的初值。由于使用计数器实际上是通过对TF0是否溢出进行检测,所以如果要达到定时的效果就必须要对计数寄存器赋初值。计算方法是 x*单片机速率/晶振=定时时间。而我们使用的stc12c5a60s2单片机为了兼容传统51单片机,提供了两种速率可供选择,一种是1T,一种是12T,如果要使用1T得速率则需要对AUXR寄存器配置为AUXR = 0x80,如果为配置则默认为12T的速率。

   3  设置TCON,通过TR0置1来让定时器开始计数。这句话的意思就是TR0是T0计时器的开关,若要使用T0计时器,必须要让TR0=1。
211738bz17sss4uzh1d7xe.jpg
  4   通过程序判断TCON寄存器的TF0位的溢出情况。前面说了定时器的使用原理就是当TH0和TL0都溢出时,TF0会由硬件置1,而我们则只需程序来检测TF0是否等于1即可达到定时效果。
211738sdgb5kvpbcrvgdad.jpg
   另外由于TCON寄存器是可位寻址的,而TMOD不可位寻址,这就是上面两个寄存器写法不同的原因。
。。。
 楼主| 发表于 2018-1-28 21:19:39 | 显示全部楼层
下面是针对部里开发板的数码管静态显示程序
#inclide < stc12c5a60s2.h >
sbit ADDR0 = P20;
sbit ADDR1 = P21;
sbit ADDR2 = P22;
sbit ENLED = P11;

unsigned char code LedChar[] = {
        0xc0, 0xf9, 0xa4,0xb0, 0x99,
        0x92, 0x82, 0xf8, 0x80, 0x90};
   
void main ()
{
  unsigned int cnt = 0;
  unsigned char sec = 0;

  ENLED = 1;
  ADDR2 = 1;
  ADDR1 = 0;
  ADDR0 = 1;

  AUXR = 0x80;
  TMOD = 0x01;
  TH0 = 0x83;
  TL0 = 0x00;
  TR0 = 1;

  while (1)
  {
    if (TF0 == 1) {
      TF0 = 0;
      TH0 = 0xb8;
      TL0 = 0x00;
      cnt++;
      if (cnt >= 1000) {
        cnt = 0;
        P0 = LedChar[sec];
        sec++;
        if (sec >= 10) {
          sec = 0;
        }
      }
    }
  }
}

。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表