前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单片机入门:定时器/计数器应用

单片机入门:定时器/计数器应用

作者头像
电子工程师成长日记
发布2022-07-21 15:49:59
5830
发布2022-07-21 15:49:59
举报

利用单片机内部定时器/计数器中断实现一个数码管的秒记数,重点学习定时器/计数器的工作方式以及其控制寄存器TMOD、TCON的功能,在程序实现过程中掌握定时器/计数器中断的一般步骤。

51单片机内部含有两个定时器/计数器,分别是T0和T1,在增强型51系列单片机中,如STC89C51RC,内部除了含有T0和T1外,还有T2定时器/计数器。定时器/计数器主要由于精确的定时,也可用于对外部脉冲进行计数以及为作为串行通信的波特发生器。定时/计数器不同的功能是通过对相关特殊功能寄存器的设置和程序设计来实现的。

为了获得1秒时间,T0中断需要发生200次。程序包含主函数,T0的初始化函数和T0中断服务函数,显示语句放在中断服务函数内,程序如下:

代码语言:javascript
复制
/************************************************************************************/
//利用定时器0中断,实现SEG0秒计数
/************************************************************************************/
#include<reg52.h>
code unsigned char seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char cp,i;                  //声明全局变量
void timer0_isr(void)  interrupt 1      // timer0中断服务函数
{
  TR0 = 0;                     //停止计数
  TL0 = 0x78;                  //TL0重新预置,把63536转化为16进制后的低8位
  TH0 = 0xec;                  // TH0重新预置
  TR0 = 0;                     //开始计数
  cp++;                        // timer0中断1次,变量cp加1
  if(cp == 200)                   //中断200次,时间刚好为1秒
  {
    cp = 0;
    i ++;
  }
  P2 = 0xdf;            //P2输出数码管的位选信号,seg0亮
  if(i == 10) i = 0;
  P0 = seven_seg[i];              // P0输出显示数据
  TR0=1;
}
void timer0_initialize(void)            // timer0中断初始化函数
{
  EA = 0;                       //设置中断允许寄存器IE中的 EA位,关闭中断总开关
  TMOD = 0x01;                  //设置计时器模式控制寄存器,Time0工作在定时方式1,16为定时器
  TR0 = 0;       //设置计时器控制寄存器TCON寄存器的TR0位为0,Timer0停止计数
  TL0 = (65536 - 5000) % 256;   //设置定时器的低8位初值,计5000个机器周期脉冲就会溢出
  TH0 = (65536 - 5000) / 256;; //设置定时器的高8位初值,假设单片机晶振为12MHz。
                  //频率,单片机的机器周期为1微秒,Timer0每1微秒加1
                  //计数,加满溢出变产生中断,从计数到中断刚好为5毫秒
  PT0 = 1;                      //设置中断优先次序寄存器IP中的PT0位,Timer0中断优先
  ET0 = 1;                      //设置中断允许寄存器IE中ET0的位,开启中断小开关
  EA = 1;                       //打开中断总开关
  TR0 = 1;                      //开始计数
}
void main (void)
{
  timer0_initialize();          // timer0初始化,为中断做好准备
  while (1);             //等待中断
}

仿真原理图如下:

仿真视频如下:

http://mpvideo.qpic.cn/0bf2x4aayaaaa4aafxulm5pvbp6dbs7qadaa.f10002.mp4?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子工程师成长日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档