文章目录
前言
本次主要介绍一下关于单片机的实验: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单片机定时器/计数器系统应用案例电路图