51单片机 定时器 T0 控制数码管显示

 

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义LED1管脚
u8 smg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void time0_init(void)
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}

void main()
{	
	time0_init();//定时器0中断配置
	while(1);
}

void time0() interrupt 1 //定时器0中断函数
{
	static u16 i;     //定义静态变量i
	static u8 a=0;
	TH0=0XFc;	        //给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i%1000==0)
	{ 
		i=0;
		P1=~smg_code[a];
		a++;
	}	
	if(a>9)
	{
		a=0;
	}
}

主要讲一下中断函数里的代码

void time0() interrupt 1 //定时器0中断函数
{
	static u16 i;     //定义静态变量i
	static u8 a=0;
	TH0=0XFc;	        //给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i%1000==0)
	{ 
		i=0;
		P1=~smg_code[a];
		a++;
	}	
	if(a>9)
	{
		a=0;
	}
}

常用在定时中断里的代码

static u16 i ;

i++;

if(i%1000==0){

        i=0;

        //要干的事

}

为什么要写这段代码呢?

        首先定时器能定的最长时间是多少?

        这里就由TH0和TL0决定,一共是16位(二进制)对吧,也就是十进制的65535,最多能计时          65.535毫秒。

        如何计算时间的呢?

        也就是单片机它会在1微秒的时间计时一次,总共能计65535次,当到65535时计满,就从0            重新计时,如此循环。

这段代码的作用就是能定时更长时间,

怎么做到的呢?

我们分析一下整个过程,这个定时器T0它配置的是定时1毫秒对吧,就是说每1毫秒会进入中断函数一次,进来后就加1,然后判断,判断是不是进来1000次了,不是 是不是要跳出中断函数,再过1毫秒再进入中断函数,再判断,当满足1000次时执行if里面的代码。

这里有几个细节,第一,每次进入中断函数要再次给TH0和TL0赋初值,保证在中断函数每次计时时间为1毫秒。 第二,变量i需要是静态变量,跳出中断函数也会保留i的大小,确保他每次进入中断函数知道自己是第几次进来的。 第三,当进来1000次时把置0,重新开始计算进来的次数。

不难看出,我这里定时是1秒。 整体功能是控制静态数码管显示,第1秒显示0,第二秒显示1等,当显示9后回到0重新开始显示。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值