学习日志-C51-定时器时钟

学习日志-C51-定时器与中断系统
1.定时器/计数器:
(1)定时器简单介绍
STC89C52含3个定时器:T0、T1、T2。
T0、T1工作模式:
模式0:13位定时器
模式1:16位定时器(最常用)
模式2:8位自动重装模式
模式3:两个8位计数器
模式1:
在这里插入图片描述

计数:为16位计数器,由TL0的8位与TH0的8位组成,TL0低8位溢出向TH0进位,可存入0~65535,当计数到最大值后继续计数产生溢出,TF0溢出标志位,产生中断。
时钟:时钟有两个来源,系统时钟和外部引脚,SYSclk为系统时钟,晶振上有标注。C/T=0时,连接系统时钟的分频输出,做定时器,C/T=1时,连接外部引脚的脉冲输入,做计数器。
(2)定时器的初值设置
启动定时器,每过一个机器周期(12MHZ,则为1微秒),初值寄存器(TH0,TL0)自动加1,直到记满溢出。
在65536微秒内:
在这里插入图片描述

则可设置TH0=(65536-10000)/256;TL0=(65536-10000)%256;
在65535微秒外:
需加入循环语句实现,如果定时1s,则需10000微秒*100,即上述10000微秒的程序循环100次即可。
(3)编程思路:
①工作模式配置
在这里插入图片描述

TMOD:编程方式寄存器,使用定时器0,则需配置低4位:工作在模式1,则M1为0,M0为1,工作在定时器模式,则C/T为0,GATE为0,TR0为1则定时器启动,无需INT0配合使用,则TMOD=0000 0001
②初值设置:可采用上述初值计算方式自行计算,或使用stc-isp驱动中定时器计算器获得初始函数。
③启动
在这里插入图片描述

TCON为中断控制寄存器,为可位寻址,即可单独赋值,配置TCON寄存器, TR0=1,则定时器启动。初始化时将TF0(溢出标志位)置0。等待数值溢出后,TF0由系统自动赋值为1。
④重置初值:在溢出之后需重新设置初值。并清除溢出,将TF0置0.

2.中断系统
(1)中断源:
8个中断源:定时器0、定时器1、定时器2、串口中断、外部中断0、外部中断1、外部中断2、外部中断3。
(2)中断允许
中断允许寄存器(可位寻址)
在这里插入图片描述

EA为总开关,只有EA为1,中断系统才可使用,其他为各个中断源分开关,置1,允许中断请求,EA=1,中断开放(总开关),ET0=1,定时器0允许产生中断。
(3)中断请求
定时器0中断请求的形式为产生溢出,即TF0为1。
在这里插入图片描述

(4)中断响应
当发出中断请求后,先判断当前是否满足中断响应的条件,根据优先级判断中断响应顺序,只有一个定时器0的中断请求则立刻响应,保存当前的断点,进入中断服务程序。
在这里插入图片描述

与子程序不同的是,主程序中不会给出调用中断服务程序的语句,而是根据中断号跳转到对应的中断服务程序。
(5)中断返回:返回断点。
3.程序实现
该程序通过C51定时器0以及中断程序,实现24小时时钟,并呈现在LCD1602上。
定时器初始化函数:

#include <REGX52.H>
void Timer0Init()		//1ms,@11.0592MHz
{
	TMOD &= 0xF0;			//高4位不变,低4位清零
	TMOD |= 0x01;			//最低位置1,完成工作模式设置
	TL0 = 0x66;				//初值配置
	TH0 = 0xFC;				//初值配置,初值设置一次溢出为1毫秒
	TF0 = 0;				//溢出位清零
	TR0 = 1;				//定时器启动
	EA=1;          //中断系统允许总开关
	ET0=1;				//定时器0允许中断
	
}

主程序:

#include <REGX52.H>
#include "t0.h"
#include "LCD1602.h"
unsigned char sec=55,min=59,hour=23;//设置时间初值,也可不设置,即为0
void main()
{
	LCD_Init();//LCD初始化
	Timer0Init();//定时器初始化
	LCD_ShowString(1,1,"CLOCK:");
	LCD_ShowString(2,1,"  :  :");
	while(1)
	{
		LCD_ShowNum(2,1,hour,2);//显示小时
		LCD_ShowNum(2,4,min,2);//显示分钟
		LCD_ShowNum(2,7,sec,2);//显示秒钟
	
	}

}
//中断程序
void Timer0_Rountine() interrupt 1
{
	static unsigned int t0count;//设置计次
	TL0=0x66;				//初值设置
	TH0=0xFC;				//初值设置
	t0count++;//计次加1
	if(t0count>=1000)//计次为1000,即为1ms*1000,得到1s
	{
		t0count=0;//1s后计次清零
		sec++;//秒数加1
		if(sec>=60)
		{
			sec=0;//60s后秒数清零,分钟加1
			min++;
			if(min>=60)
			{
				min=0;//60分钟后分钟数清零,小时加1
				hour++;
				if(hour>=24)
				{hour=0;}//超过24小时则清零
			}
		}
	
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值