定时器的基本原理和应用

题目背景

利用51单片机的定时/计数器T0的模式1实现间隔定时,每隔1秒L1指示灯闪烁一下,也就是亮0.5秒,熄灭0.5秒;每隔10秒L8指示灯闪烁一下,也就是也就是亮5秒,熄灭5秒。

分析

计数初值。

定时/计数器,本质上就是计数器,计数到溢出时产生中断。作为计数器时,计数信号来源是周期性的内部时钟脉冲。作为定时器时,计数信号来源是非周期性的外部输入信号

51单片机一共有两个定时/计数器,T0和T1,均为16位的加法计数器。
高8位,THx,低8位,TLx。

1s = 1000ms
1ms = 1000us
1us = 1ns
51单片机内部采用12分频,如果采用12MHz的晶振,时钟脉冲是1us,最大定时时间为65535us ~ 65.5ms。
如果要定时10ms,需要给一个计数初值65535 - 10000 = 55535 = 0xd8ef,TH设置为0xd8,TL设置为0xef。也就是从55535开始计数,计数到溢出时产生中断信号,此时为10ms。

相关寄存器

除了TH和TL之外,还有TMOD寄存器和TCON寄存器。

TMOD

注意TMOD只能字节寻址

这里只需设置TMOD为0x01即可。

TCON

这里用到了TR0,来启动T0。

此外,还需要设置IE寄存器,因为和中断相关。

IE

代码

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

// 用到的两个LED灯
sbit L1 = P0 ^ 0;
sbit L8 = P0 ^ 7;

// 控制HC138译码器选通信道
void HC138(uchar channel)
{
	switch(channel)
	{
		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 InitTimer0()
{
	TMOD = 0x01;
	TH0 = (65535 - 50000) / 256;
	TL0 = (65535 - 50000) % 256;
	
	ET0 = 1;
	EA = 1;
	// 由TR0来启动
	TR0 = 1;
}

uchar count = 0;
void ServiceTImer0() interrupt 1
{
	// 没有自动重装功能,需要重新写入计数初值
	TH0 = (65535 - 50000) / 256;
	TL0 = (65535 - 50000) % 256;
	
	count ++ ;
	if (count % 10 == 0)
	{
		L1 = ~L1;
	}
	
	if (count == 100)
	{
		L8 = ~L8;
		count = 0;
	}
}

void main()
{
	HC138(4);
	InitTimer0();
	while(1)
	{
		
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值