基于51单片机定时,数码管显示时间

基于51单片机定时,数码管显示时间

要想让数码管显示时间,就得让数码管显示,然后需要让显示的数字按秒、分、时进位。数码管显示可以看我前面文章:
基于51单片机数码管显示

单片机的定时器中断
51单片机内部有两个16位可以编程的定时器T0/计数器T1,52单片机内多了一个T2定时器/计数器;

定时器/计数器的实质是加1计数器(16位),由高8位和低8位2个寄存器组成。TMOD 是定时器/计数器的工作方式寄存器,确定工作方式和功能: TCON 是控制寄存器,控制TO、TI的启动和停止及设置溢出标志。
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分 频后送来;另一个是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器加 1,当加到计数器为全I时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON寄存器中TFO或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器工作于定时模式,则表示定时时间已到:如果工作于计数模式,则表示计数值已满。
由上可知,由溢出的计数器的值减去计数初值才是计数器的计数值。
设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tey就是定时时间t。
定时器初值计算

定时时间T=(2的N次方-X)12/单片机晶振频率(方式0时,N=13 方式1时,N=16 方式2时,N=8)

打个比方计时2ms,当晶振为12M。
方法一
定时时间2ms=(2的16次方-时间常数X)12/f 即晶振为12M f=121000000
2ms=(2的16次方-时间常数X)12/(12
1000000)
方法二
12MHz除12为1MHz,也就是说一秒=1000000次机器周期。2ms=50000次 机器周期。

时间常数X=2000
TH0=(65536-2000)/256; 就是转换成十六进制 再除以256 取整数 即高8位送时间常数寄存器的高8位计数器
TL0=(65536-2000)%256; 就是转换成十六进制 再除以256 取余数 即低8位送时间常数寄存器的低8位计数器

单片机在使用定时器或计数器功能时,通常需要设置2个与定时器有关的寄存器:定时器/计数器工作方式寄存器TMOD与定时器/计数器控制寄存器TCON。
定时器/计数器工作方式寄存器TMOD
TMOD各位定义如下表:

位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 GATE C/T M1 M0 GATE C/T M1 M0

D7–D4是定时器1 D3–D0是定时器0
TMOD的高4位用于设置定时器1,低4位用于设置定时器0,对应4位含义如下:
GATE一门控制位。GATE=0,定时器/计数器启动与停止仅受TCON寄存器中的TRX(X=0, 1)来控制; GATE=1,定时器/计数器启动与停止由TCON寄存器中的TRX (X=0, 1)和外部中断引脚(INTO或INT1)上的电平状态来共同控制.
C/T一定时器模式和计数器模式选择位。C/T=1, 为计数器模式: C/T=0 为定时器模式。M1 M0是工作方式选择位。每个定时器计数器都有4种工作方式,它们由MIMO设定,如下表所示

M1 M0 工作方式
0 0 方式0 是13位定时器/计数器
0 1 方式1 是16位定时器/计数器
1 0 方式2 是8位初值自动重装的8位定时器/计数器
1 1 方式3 是仅仅适用与T0分为两个8位计数器,T1停止计数

定时器/计数器控制寄存器TCON

定时器/计数器控制寄存器TCON在特殊功能寄存器中,字节地址为88H, 位地址(由低位到高位)分别是88H~8FH,可进行位寻址。TCON寄存器用来控制定时器的启、停,以及标志定时器溢出和中断情况。单片机复位时,TCON 全部被清0.
其各位定义如下表所示.其中TFI、 TRI、TFO和TRO位用于定时器/计数器; 1IEI、 ITI、 IEO和ITO位用于外部中断。

位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H

TF1 定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0.注意,如果使用定时器的中断,那么该位完全不用人为去操作;如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0.
TR1 定时器1运行控制位。由软件清0关闭定时器1.当GATE=I且INT1为高电平时, TR1置1,启动定时器1;当GATE=0时, TRI置1, 启动定时器1.
TF0 定时器0溢出标志,其功能及操作方法同TF1.
TR0 定时器0运行控制位,其功能及操作方法同TR1.
IE1 外部中断1请求标志.

扫描二维码关注公众号,回复: 12046024 查看本文章

要让数码管显示时间要使用寄存器TMOD定时器0,工作方式1;
代码如下

void T0_init(){
    
                        
 TMOD = 0x01; //设置定时器0为工作方式1(M1 M0为01)
 TH0 = (65536-50000)/256;//装初值12Mhz晶振定时50ms  
 TL0 = (65536-50000)%256;  
 EA = 1;//开总开关     
 ET0 = 1;//开定时器0中断     
 TR0 = 1;//启动定时器0    
}
void timer0_int() interrupt 1{
    
    
 TH0 = (65536-50000)/256; //重装初值
 TL0 = (65536-50000)%256;
 i++;//每加一次就判断一次看是否到达1s
   if(i == 20){
    
    
   i = 0;  
   miao++//每加一次就判断一次看是否到达1分
     if(miao == 60){
    
    
     miao = 0;
     fen++;//每加一次就判断一次看是否到达1小时
       if(fen == 60){
    
    
        fen = 0;  
        shi++;
    	  if(shi == 24){
    
    
     	  shi = 0;  
     	  fen = 0;
     	  miao = 0;
     }
   }
 }
 miao_g = miao%10;//求余得到秒的个位   
 miao_s = miao/10;//取十得到十位 这就是送到数码管元素的下标与数组相对应 下同
 fen_g = fen%10;  
 fen_s = fen/10;
 shi_g = shi%10;  
 shi_s = shi/10;
  }
}

数码管显示函数如多段数码管动态显示相似可以看上文
代码与原理图已经上传资源,感兴趣可以看看,也请各位大佬纠正;

猜你喜欢

转载自blog.csdn.net/Lucifer_min/article/details/109264704