手把手教你单片机——定时器

定时器

目的 每过一秒静态数码管加一

代码

#include"reg51.h"
#include"intrins.h"
#define seg P0                           //宏定义
typedef unsigned int u16;
typedef unsigned char u8;
u16 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   /共阴极数码管编码 CC为共阴   CA为共阳
u16 num=0;     
u16 i=0;
void delay(u16 i)          							//延时函数  (约10微秒)
{
	while(i--);
}

void tim0_init()                        //定时器初始化函数
{
	EA=1;                                //中断总允许位
	TMOD=0X01;                           //TMOD高四位是T1 低四位是T0   前两位是选择方式,第三位是选择计数器(1)或者定时器(0)  第四位门控位
	TH0=0xd8;                            //高八位
	TL0=0xf0;														 //第八位 (最后备注讲解怎么求初值)
	ET0=1;                               //定时器计数器中断允许位
	TR0=1;                               //开启定时
}

void main()                            
{
	tim0_init();  
	while(1)
	{
		seg=~smg[num];               //因为用的共阳极   但是编码是共阴极 所以需要取反
		delay(10);                          //消影 
	}
}

void tim0()  interrupt 1                //中断服务函数 
{
  TH0=0xd8;                             //对高低位重新初始化
	TL0=0xf0;
	i++; 
	if(i==100)                             //根据初值 进入一次中断是10ms 所以100次是1秒
	{
	   num++;
		i=0;
	}
	
	if(num==10)                             //十进制中静态数码管最多显示数字9
	{
		num=0;
	}
}

protues仿真图

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

元器件

AT89C51 (AT89C52)
res (电阻)
power (电源)
seg CA(共阳极数码管)

备注

关于高低八位的初值计算
因为是方式一 所以最大值为65536 累积加到65536才触发中断
如果选择12W晶振 即累计加100次为1ms

如果使用定时计数器 T1
需要在初始化函数中将 ET0改为ET1
TR0改为TR1
TOMD 最后两位为方式选择
00 方式0
01 方式1
10 方式2
11 方式3

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值