电子钟,跑表,定时炸弹详解//周文东//2019.1.29

/*-----------------------------------------------
  名称:电子时钟
  编写:周文东
  日期:2019.1
  修改:无
  内容:8位数码管分别显示小时,分钟, 秒
------------------------------------------------*/
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^3;//定义锁存使能端口 段锁存
sbit LATCH2=P2^2;//                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
unsigned char ms;//定义一个变量
unsigned char sec,min,hour;//定义秒,分,时

void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
void Deal_Tim(void);
/*------------------------------------------------
                    函数与主函数
------------------------------------------------*/
void TIM_Init()
{
  TMOD = 0X01;//开启定时器0
    TH0 = 0X3C;//初始值的高四位。
    TL0 = 0XB0;//初始值的低四位。
    EA = 1;//中断允许总开关
    ET0 = 1;//定时器0 中断允许。
    TR0 = 1;//TCON控制寄存器,定时器0的运行控制位
}

void main()
{

 TIM_Init();
    
 while(1)
      {
         Deal_Tim();//调用时间处理函数。
                
                 TempData[0]=dofly_DuanMa[hour/10];//分解显示信息, 
                 TempData[1]=dofly_DuanMa[hour%10];
                 TempData[2]=0x40;
                 TempData[3]=dofly_DuanMa[min/10];//分解显示信息, 
                 TempData[4]=dofly_DuanMa[min%10];
                 TempData[5]=0x40;
                 TempData[6]=dofly_DuanMa[sec/10];//分解显示信息, 
                 TempData[7]=dofly_DuanMa[sec%10];
                 Display(0,8);
      }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}
/*------------------------------------------------
 显示函数,用于动态扫描数码管
 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示
 从第三个数码管开始显示
 如输入0表示从第一个显示。
 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      unsigned char i;
      
      for(i=0;i<Num;i++)
       { 
       DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
       
       Delay(200); // 扫描间隙延时,时间太长会闪烁,
                   //太短会造成重影

       }

}

void ISR_TIM(void) interrupt 1
{
  EA = 0;//进入中断函数时,先关闭。
    
    TH0 = 0X3C;//高四位
    TL0 = 0XB0;//低四位
    
    ms++;
    if(ms == 20)//因为一个周期是50ms,当计量ms为20,即20*50ms=1s时,sec+1
    {
      ms = 0;//ms归0
        sec++;
    }
    
    EA =1;//中断允许总开关打开
}

void Deal_Tim(void)//时间处理函数,将秒,分, 时的进位单独写一个函数,减少中断函数运行时间。
{
  if(sec == 60)//当秒为60时,秒归0,分+1
    {
      sec = 0;
        min++;
    }
    if(min == 60)//当分为60时,分归0,时+1
    {
      min = 0;
        hour++;
    }
    if(hour == 24)//当时为24时,小时归0,
    {
      hour = 0;
    }
}

 

跑表(精度0.01s)

#include<reg51.h> 

#define DataPort P0 
sbit LATCH1=P2^3;//定义段
sbit LATCH2=P2^2;//定义位       

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//
unsigned char TempData[8]; 
unsigned char j;//定义计数
unsigned char ms, s;//定义毫秒与秒

void Delay(unsigned int t); 
void Display(unsigned char FirstBit,unsigned char Num);
void Deal_Tim(void);
/*------------------------------------------------
                    函数与主函数
------------------------------------------------*/
void TIM_Init()//定时器0的初始定义
{
  TMOD = 0X01;
    TH0 = 0xd8;
    TL0 = 0xf0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

main()
{

 TIM_Init();
    
 while(1)
      {
         Deal_Tim();
                
                 TempData[0]=dofly_DuanMa[s/10]; 
                 TempData[1]=dofly_DuanMa[s%10];
             TempData[2]=0x80;
                 TempData[3]=dofly_DuanMa[ms/10];
                 TempData[4]=dofly_DuanMa[ms%10]; 
                 
                 Display(3,5);
      }
}

void Delay(unsigned int t)//delay函数
{
 while(--t);
}

void Display(unsigned char FirstBit,unsigned char Num)
{
      unsigned char i;
      
      for(i=0;i<Num;i++)
       { 
       DataPort=0;   
       LATCH1=1;     
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit];  
       LATCH2=1;     
       LATCH2=0;

       DataPort=TempData[i]; 
       LATCH1=1;     
       LATCH1=0;
       
       Delay(200); 
                   

       }

}

void ISR_TIM(void) interrupt 1
{
  EA = 0;
    
    TH0 = 0xd8;
    TL0 = 0xf0;
    
    j++;
    if(j == 1)
    {
      j = 0;
        ms++;
    }
    
    EA =1;
}

void Deal_Tim(void)
{
  if(ms == 100)
    {
      ms = 0;
        s++;
    }
    if(s == 100)
    {
      s = 0;
    }
}

 

10秒定时炸弹

#include <reg51.h>

#define DataPort P0 
sbit LATCH1=P2^3;
sbit LATCH2=P2^2;
sbit B1 = P1^0;
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8]; 
unsigned char j = 0;
unsigned char s = 10;//由10倒数
unsigned int n;//定义一个蜂鸣器循环时长

void Delay(unsigned int t); 
void Display(unsigned char FirstBit,unsigned char Num);
/*------------------------------------------------
                    函数与主函数
------------------------------------------------*/
void TIM_Init()
{
  TMOD = 0X01;
    TH0 = 0x3c;
    TL0 = 0xb0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

main()
{

 TIM_Init();
    
 while(1)
      {
                
                 TempData[0]=dofly_DuanMa[s/10]; 
                 TempData[1]=dofly_DuanMa[s%10]; 
                 
                 Display(6,2);
                
                
      }
}

void Delay(unsigned int t)
{
 while(--t);
}

void Display(unsigned char FirstBit,unsigned char Num)
{
      unsigned char i;
      
      for(i=0;i<Num;i++)
       { 
       DataPort=0;   
       LATCH1=1;     
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit];  
       LATCH2=1;     
       LATCH2=0;

       DataPort=TempData[i]; 
       LATCH1=1;     
       LATCH1=0;
       
       Delay(200); 
                   

       }

}

void ISR_TIM(void) interrupt 1
{
  EA = 0;
    
    TH0 = 0x3c;
    TL0 = 0xb0;
    
    j++;
    if(j == 20)
    {
      j = 0;
        s--;
    }
    if(s == 0)
 {
        TempData[0]=dofly_DuanMa[s/10];
          TempData[1]=dofly_DuanMa[s%10]; 
                 
          Display(6,2);
            n = 2000;
            while(n--)
         {
               B1 = ~B1;
               Delay(100);
         }
            TR0 = 0;
 }
    
    EA =1;
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方案设计: 数字跑表的核心部件是计数器,给出合理的时钟脉冲从而实现最低位的计数以及对高位的进位。时序脉冲源由555定时器构成的多谐振荡器,设置特定的参数可以产生频率为100Hz的时序脉冲,为计数器提供时序脉冲,使之进行计数。计数器由3对74LS390双十计数器芯片组成,通过芯片间的连接实现百分秒、秒、分计时电路,量程在00分00.00秒~~59分59.99秒,把小数点后面的两位设计成一百进制的计数器,秒数和分钟数分别设计成60进制的计数器数,计数器输出连接译码器,译码器再连接7位数码管显示的数码管,从左到右分别为分十位,分个位,秒十位,秒个位,百分秒十位,百分秒个位。逻辑门控制构成RS触发器,通过实现电路的通断控制计数器的启动/暂停及清零。 接通电源后,直接显示计时器启动,SW1处于低点平,SW2处于高电平。开关SW2接高电平(上端),电路即开始计时,将开关SW2接低电平(下端),电路就暂停计时,清零开关SW1接高电平(下端),计时清零且停止,显示器显示“0”。这样就实现了数字跑表的各项基本功能。 设计要求: 1. 量程在00分00.00秒~~59分59.99秒即时间以1小时为一个周期; 2. 具有‘分’、‘秒’、‘1/100秒’的十进制数字显示; 3. 要有外部开关,控制计数器的直接清零、启动和暂停/连续计时功能; 4. 用7位数码管显示分、秒; 5. 画出部分和整体的电路图,以及元器件及参数选择。 工作原理: 1.利用555计时器构成能产生特定脉冲的多谢振荡器,产生100Hz的脉冲信号,满足数字跑表的脉冲需求; 2.用多功能计数器产生一百进制和六十进制,实现数字跑表的计数功能; 3.利用各种门电路的组合,实现数字跑表的启动、暂停和清零; 4.利用译码器和数码管实现译码及显示功能。 系统框图: Altium Designer画的原理图和PCB图如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值