51单片机学习——定时器中断制作简易数码管电子时钟

 目录

一、硬件电路:STC89C52R,共阴数码管,74hc245,74hc138

1.整体电路图

2.共阴动态数码管原理:

3.74hc138

4. 74hc245:

二.、定时器中断原理

1.定时器寄存器

(1)TMOD寄存器

 (2)TCON寄存器

 2.定时器方式1工作原理图

 3.中断寄存器

(1)IE存储器

(2)TCON存储器

4.中断系统原理图

三、C语言程序


一、硬件电路:STC89C52R,共阴数码管,74hc245,74hc138

1.整体电路图

2.共阴动态数码管原理:

        用段选(P0)控制点亮的数字,用位选(P22,P23,P24)控制点亮哪一位。以很短的间隔逐渐点亮的方式来达到肉眼看起来同时点亮的效果。、

3.74hc138

        真值表如下:

4. 74hc245:

        驱动芯片。由于单片机io口输出电流小,不足以点亮数码管,因此需要74hc245芯片进行驱动。

二.、定时器中断原理

1.定时器寄存器

(1)TMOD寄存器

         TMOD寄存器用于设置定时器工作方式,第四位设置定时器0,高四位设置定时器1。GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号 的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平 232 时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚 为高电平这一条件。 C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式。作者使用方式1。

 (2)TCON寄存器

        TCON高四位用于控制定时器开启和中断申请。低四位用于控制外部中断。

        TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬 件置 1 或清 0 的效果一样。

        TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时, T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动 与停止。

        TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。

        TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同。 

 2.定时器方式1工作原理图

        TH0为高8位,TL0为低8位。定时初值X=2^{16}-N

        作者定时器初值为50ms,即(65536-N)*\tfrac{​{1}}{fosc}*12=0.05,N即为TH和TL0初始配置值。

其中fosc为晶振频率,作者使用晶振11.0592MHz。

 3.中断寄存器

(1)IE存储器

        EX0(IE.0),外部中断 0 允许位;

        ET0(IE.1),定时/计数器 T0 中断允许位;

        EX1(IE.2),外部中断 0 允许位;

        ET1(IE.3),定时/计数器 T1 中断允许位;

        ES(IE.4),串行口中断允许位;

        EA (IE.7), CPU 中断允许(总允许)位。

(2)TCON存储器

        IT0(TCON.0),外部中断 0 触发方式控制位。 当 IT0=0 时,为电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效)。

        IE0(TCON.1),外部中断 0 中断请求标志位。

         IT1(TCON.2),外部中断 1 触发方式控制位。

        IE1(TCON.3),外部中断 1 中断请求标志位。

        TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。

        TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。

4.中断系统原理图

        T0即为定时器0。 

三、C语言程序

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int  u16;

#define shi_1   1  
#define shi_2	9
#define fen_1	3
#define fen_2	4
#define miao_1	0
#define miao_2	0
//暂不完善,每次断电需要手写当前时间

u8 Shu_Ma_Guan_Display[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x40};//数码管显示数字0-9
#define p0	P0
sbit p22=P2^2;
sbit p23=P2^3;
sbit p24=P2^4;
u8 dat[]={0,0,0,0,0,0};



void delay_10us(u16 time)
{while(time--);}

void time0_init_50ms(void)//定时器0初始化:定时50ms
{
	TMOD|=0x01;  //定时器0工作方式1
	EA=1;        //开启总中断开关
	ET0=1;       //开启定时器0中断开关
	TH0=0X4B;    //设置定时时间(高八位) 
	TL0=0XFF;    //设置定时时间(低八位)                 
	TR0=1;      //打开定时器0
}



void smg_display()//数码管动态显示
{
	   	
		p22=1;	 //38译码器进行数码管位选,最右侧数码管亮
		p23=1;
		p24=1;
		p0=Shu_Ma_Guan_Display[dat[5]];//段选
		delay_10us(100);
		p0=0x00;//消影		
	
		p22=0;
		p23=1;
		p24=1;
		p0=Shu_Ma_Guan_Display[dat[4]];
		delay_10us(100);
		p0=0x00;
		
	
		p22=1;
		p23=0;
		p24=1;
		p0=Shu_Ma_Guan_Display[10];
		delay_10us(100);
		p0=0x00;
		
	
		p22=0;
		p23=0;
		p24=1;
		p0=Shu_Ma_Guan_Display[dat[3]];
		delay_10us(100);
		p0=0x00;
		
	
		p22=1;
		p23=1;
		p24=0;
		p0=Shu_Ma_Guan_Display[dat[2]];
		delay_10us(100);
		p0=0x00;
		
	
		p22=0;
		p23=1;
		p24=0;
		p0=Shu_Ma_Guan_Display[10];
		delay_10us(100);
		p0=0x00;
	
	
		p22=1;
		p23=0;
		p24=0;
		p0=Shu_Ma_Guan_Display[dat[1]];
		delay_10us(100);
		p0=0x00;
		
	
		p22=0;
		p23=0;
		p24=0;
		p0=Shu_Ma_Guan_Display[dat[0]];
		delay_10us(100);
		p0=0x00;
		

}



void main()
{	
	
    time0_init_50ms();//定时器初始化50ms
	while(1)
	{
	smg_display();数码管显示
	}
	
	
	
				
}
void smg_1s(void) interrupt 1	//中断服务函数:
{
	static u16 t=0,miao=miao_1*10+miao_2,shi=shi_1*10+shi_2,fen=fen_1*10+fen_2;
	TH0=0X4B; 
	TL0=0XFF;  //每次进入终端服务函数都需要重新配置定时时间
	t++;	
	if(t==20) //50*20ms=1s
	{	miao++;
		t=0;
		if(miao==60)
		{	miao=0;
			fen++;
			if(fen==60)
			{
				fen=0;
				shi++;
				if(shi==24)
				shi=0;
			}
		}
	}
	dat[0]=miao%10; //取秒的个位
	dat[1]=miao/10; //取秒的十位
	dat[2]=fen%10; 
	dat[3]=fen/10;  
	dat[4]=shi%10;
	dat[5]=shi/10;  

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值