51单片机学习之路(四)-定时器

写在前面:以下涉及到的程序及电路图不保证为最优方案,会存在很多不足之处,望谅解。另外,C51的内容是在整理很久之前所学的知识,可能会存在错误,欢迎指正。

正文

学习目标:学会使用51单片机中的定时器0。
学习内容

  1. 用定时器0控制LED灯的亮灭
  2. 用定时器在数码管上实现计时
程序一:控制LED灯

功能要求:运行程序后连接在单片机上的LED灯以1s的频率闪烁。
定时器寄存器简单介绍
在本次内容中将使用定时器0,定时器1的使用方式与定时器0大体相同,以下简单介绍一下将要使用到的几个中断寄存器,具体介绍请以官方数据手册为准:
TMOD:定时器模式寄存器,大致分为4个模式:
00:定时器0或1选择13位定时/计数器模式,该模式下TL0只使用低5位,TH0整个8位全用,选择TR0控制,作为定时器使用;
01:定时器0或1选择16位定时/计数器模式,该模式下TL0和TH0的整个8位均全用,选择TR0控制,作为定时器使;
10:定时器0或1选择8位定时/计数器模式,该模式下只有TL0的整个8位参与实际计时,TH0的整个8位为重装做准备,该模式为自动重装模式,当溢出时TH0的值赋予TL0,选择TR0控制,作为定时器使用;
11:定时器0做双8位定时/计数器,TL0作为一个8位定时/计数器由定时器0控制,TH0作为一个8位定时/计数器由定时器1控制。

TH0、TL0:用作计数,其中TH0为高8位,TL0位低8位,从0 开始最大计数0xFFFF。

TR0:当TR0=1时,允许T0开始计数,即允许TH0和TL0计数;当TR0=0时,只有INT0输入高电平时,T0才可以计数。

ET0:T0溢出中断允许位,当ET0=1时,允许中断,反之禁止中断。

EA:总中断允许位,当EA=1时,开放中断,反之,禁止所有中断请求,即上述中断操作将全部失效。

中断优先级:定时器0优先级排在第二位,如图4-1:
在这里插入图片描述图4-1 中断优先级查询(图片来自官方芯片手册 第6章 中断系统)

源程序

#include "reg52.h"

typedef unsigned char uchar;
typedef unsigned int uint;

sbit led = P2^0;	//led灯端口
uint i;		//计时变量

void main()
{
	TMOD |= 0X01;	//选择定时器0模式1,16位,TR0控制
	TL0 = 0x18;		//定时1ms,低8位
	TH0 = 0XFC;		//定时1ms,高8位
	TR0 = 1;		//允许计时
	ET0 = 1;		//溢出中断允许位,置1允许
	EA = 1;			//打开总中断

	while(1);
}

void timer0() interrupt 1	//定时器0中断程序,定时器0优先级为1
{
	TL0 = 0x18;
	TH0 = 0XFC;			//复位TH0和TL0
	i++;
	if(i == 1000)		//当时间计够1s时,i清零,同时led灯状态取反
	{
		i = 0;
		led = ~led;		//状态取反,即灯亮时取反灭,灯灭时取反亮s
	}
}

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

程序二:数码管计时

功能要求:实现正计时0~F。
源程序

#include "reg52.h"

typedef unsigned char uchar;
typedef unsigned int uint;

#define display  P0		//定义数码管端口为P0
uint i;		//计时变量
uchar temp; //数码管变量
uchar code smg[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
		      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	//定义数码管显示内容0~15(F)

void main()
{
	TMOD |= 0X01;				//选择定时器0模式1,16位,TR0控制
	TL0 = 0x18;		//定时1ms,低8位
	TH0 = 0XFC;		//定时1ms,高8位
	TR0 = 1;			//允许计时
	ET0 = 1;			//溢出中断允许位,置1允许
	EA = 1;				//打开总中断

	display = 0x3f;		//初始化显示0
	
	while(1)
	{
		if(i == 0)		//当i清0时显示数据加1
		{
			display = smg[temp];		//显示数据随temp的自加而自增
		}
	}
}

void timer0() interrupt 1		//定时器0中断程序,定时器0优先级为1
{
	TL0 = 0x18;
	TH0 = 0XFC;		//复位TH0和TL0
	i++;
	if(i == 1000)		//当时间计够1s时,i清零,同时temp自加1
	{
		i = 0;
		temp++;
		if(temp == 16)		//限制显示最大加到F
			temp = 0;
	}
}

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值