MCS-51单片机:定时器/计数器系统与应用设计


前言

  本次主要介绍一下关于单片机的实验:MCS-51单片机定时器/计数器系统与应用设计。


一、MCS-51单片机定时器/计数器系统原理

1.1 引脚介绍

  本电路中用到了STC89C52单片机的P0的八个管脚,P2的P2.2,P2.3,P2.4管脚。

1.2 定时器/计数器的结构原理图

          在这里插入图片描述
A、C/T* —计数器模式和定时器模式选择位
  a、C/T*=0,定时器模式,对系统时钟12分频后的脉冲进行计数。
  b、C/T*=1,计数器模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。
B、GATE—门控位
  a、GATE=0,定时器是否计数,由控制位TRx(x = 0,1)来控制。
  b、GATE=1,定时器是否计数,由外中断引脚INTx* 上的电平与运行控制位TRx共同控制。
C、M1、M0—工作方式选择位
  a、M1,M0的编码分别对应0,0时,它的工作选择为方式0,是13位定时器/计数器
  b、M1,M0的编码分别对应0,1时,它的工作选择为方式1,是16位定时器/计数器
  c、M1,M0的编码分别对应1,0时,它的工作选择为方式2,是8位的常数自动重新装载的定时器/计数器
  d、M1,M0的编码分别对应1,1时,它的工作选择为方式3,仅适用于T0,此时T0分成2个8位计数器,T1停止计数。
D、TF1、TF0—计数溢出标志位
  当计数器计数溢出时,该位置“1”。使用查询方式时,此位可供CPU查询,但应注意查询后,用软件及时将该位清“0”。使用中断方式时,作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。
E、TR1、TR0—计数运行控制位
  TR1位(或TR0)=1,启动;TR1位(或TR0)=0,停止。该位可由软件置“1”或清“0”。

1.3 方式1计时的有关程序

  实际应用中,一般不用方式0,常采用方式1,用方式1计时的有关程序:
A、设置TMOD寄存器
  C/T*=0;GATE位为0;TMOD寄存器应初始化为0x01。
B、计算定时器T0的计数初值
  系统时钟为12Mhz时,对应的是一个机器周期(即数一个脉冲的时间)为1微秒,故可以计算得出最大的计时时间为65.536毫秒。如果时间太长的话,我们可以设定一个较小的时间,然后循环它的一定次数(可以计算得出)。
C、设置IE寄存器
  将IE寄存器中的EA、ET0位置换到1。
D、启动和停止定时器T0
  TR0=1,则启动定时器T0;TR0=0,则停止定时器T0定时。

二、MCS-51单片机定时器/计数器系统应用案例功能

   用定时器计数器制作一个秒表,从00秒计时到60秒,用两位八段数码管显示。

三、MCS-51单片机中断应用案例程序代码

  代码如下(示例):

#include<reg52.h>   //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示0~9的值
sbit weia=P2^2;   //管脚进行声明定义
sbit weib=P2^3;
sbit weic=P2^4;
u8 n=0;
u8 i=0;
void delay(u16 i)   //延时函数
{
	while(i--);	
}
void Timer0Init()
{
	TMOD=0X01;   //选择为定时器模式,工作方式1,仅用TR0打开启动。
	TH0=0Xd8;   //给定时器赋初值,定时10ms
	TL0=0Xf0;	
	ET0=1;   //打开定时器中断允许
	EA=1;   //打开总中断
	TR0=1;   //打开定时器
}
void main()
{	
	Timer0Init();   //定时器初始化
	while(1)
	{
	   weia=1;weib=1;weic=1;   //控制第一个数码管
       P0=smgduan[n/10];   //第一个数码管显示为秒数除以10的商
       delay(100);   //延时
	   weia=0;weib=1;weic=1;   //控制第二个数码管
       P0=smgduan[n%10];   //第二个数码管显示为秒数除以10的余数
       delay(100);  //延时
	   P0=0;  //消隐
	}		
}
void Timer0() interrupt 1  //中断程序
{
	TH0=0xd8;   //给定时器重新赋值							
    TL0=0xf0;
    i--;	     //循环次数							
    if(i<=0)
    {
	  n++;
	  if(n>60)  //n满60,重置n=0
	  {
	  	 n=0;
	  } 
	  i=100;   //重置循环次数				   
    }
}



四、MCS-51单片机定时器/计数器系统应用案例电路图

     在这里插入图片描述

    在这里插入图片描述 在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道无方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值