历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2020年03月24日 | 基于51单片机的秒表和数显时钟

2020-03-24 来源:eefocus

刚刚学过51单片机最重要的两个部分,定时器和中断,学完后应用定时器和数码管,首先,我们可以做出一个秒表程序,做出后,我们再在秒表的基础上,做一个数显时钟

#include


sbit k1=P3^1;   //定义四个按键

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;


sbit LSA=P2^2; //38译码器数码管位选

sbit LSB=P2^3;

sbit LSC=P2^4;


typedef unsigned char u8;   //对数据类型进行声明定义

typedef unsigned int u16;


u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不带小数点

   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,

                               0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //带小数点


u16 intnum; //定义时间变量


/****************************延时函数**************************/

void delay(u16 t)

{

         u8 x,y;

for(x=t;x>0;x--)

{

          for(y=110;y>0;y--)

  {

  }

}

}


/**********************显示函数*******************************/

void display()

{

u16 wei[4];

wei[0]=intnum%10; //对各个位取模

wei[1]=intnum/10%10;

wei[2]=intnum/100%10;

wei[3]=intnum/1000%10;



LSA=0; LSB=0; LSC=0; P0=smgduan[wei[0]];delay(10); P0=0x00; 

    LSA=1; LSB=0; LSC=0; P0=smgduan[wei[1]];delay(10); P0=0x00;

    LSA=0; LSB=1; LSC=0; P0=smgduan1[wei[2]];delay(10); P0=0x00; 

    LSA=1; LSB=1; LSC=0; P0=smgduan[wei[3]];delay(10); P0=0x00; 


}



/********************定时器0初始化函数************************/

void init_t0()


{

        TMOD=0x01;    

TH0=(65536-10000)/256;    //给TH0赋初值

TH1=(65526-10000)%256;    //给TH1赋初值



EA=1;    //开总中断

ET0=1;    //开定时器中断

TR0=0;    //关闭定时器0

}


/**********************按键函数******************************/

void keydown()

{

        if(k1==0)

{

     

delay(10);

if(k1==0)

{

      TR0=1; //开启定时器

}

}



if(k2==0)

{

     

delay(10);

if(k2==0)

{

      TR0=0;    //关闭定时器

}

}

if(k3==0)

{

     

delay(10);

if(k3==0)

{

      TR0=0; //关闭定时器

  intnum=0; //时间值清零

}

}

if(k4==0)

{

   

delay(10);

if(k4==0)

{

      TR0=0; //关闭定时器

  intnum=0; //时间值清零

}

}





}



/***************定时器0中断服务函数***************/

void int_t0() interrupt 1

{

        TH0=(65536-10000)/256;

TH1=(65526-10000)%256;



intnum++;

}



/**************主函数****************************/

void main()

{

init_t0();

intnum=0;

while(1)

{

keydown();

display();

}

}


下面,我们在秒表的基础上,对代码进行改进,将它改成一个数显时钟

代码如下


#include



sbit k1=P3^1;   //定义四个按键

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;



sbit LSA=P2^2; //38译码器数码管位选

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit beep=P1^5;


typedef unsigned char u8;   //对数据类型进行声明定义

typedef unsigned int u16;


u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不带小数点

   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,

                    0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //带小数点


u16 intnum,second,minute,hour; //定义时间变量



/****************************延时函数**************************/

void delay(u16 t)

{

         u8 x,y;

for(x=t;x>0;x--)

{

          for(y=110;y>0;y--)

  {

  }

}

}



/**********************显示函数*******************************/

void display()

{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 

        LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;

        LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 

        LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 

LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;

        LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;

}



/********************定时器0初始化函数************************/

void init_t0()



{

        TMOD=0x01;    

TH0=(65536-10000)/256;    //给TH0赋初值

TH1=(65526-10000)%256;    //给TH1赋初值



EA=1;    //开总中断

ET0=1;    //开定时器中断

TR0=1;    //开启定时器0

}



/**********************按键函数******************************/

void keydown()

{

        if(k1==0)

{

     

delay(200);

if(k1==0)

{

      second=0;

  intnum=0;  

}

}



if(k2==0)

{

     

delay(200);

if(k2==0)

{

      hour++;    

}

}

if(k3==0)

{

     

delay(200);

if(k3==0)

{

      minute++;  

}

}

if(k4==0)

{

   

delay(200);

if(k4==0)

{

      minute--;

}

}





}



/***************定时器0中断服务函数***************/

void int_t0() interrupt 1

{

        TH0=(65536-10000)/256;

TH1=(65526-10000)%256;

        intnum++;

if(intnum>=100)

{

intnum=0;

second++;

}

if(second>=60)

{

second=0;

minute++;

}

if(minute>=60)

{

     minute=0;

hour++;

}

if(hour>=24)

{

hour=0;

}

}



/**************主函数****************************/

void main()

{

init_t0();

intnum=minute=second=hour=0;



while(1)

{

keydown();

display();

}

}






















#include



sbit k1=P3^1;   //定义四个按键

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;



sbit LSA=P2^2; //38译码器数码管位选

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit beep=P1^5;







typedef unsigned char u8;   //对数据类型进行声明定义

typedef unsigned int u16;





u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不带小数点

   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,

                                   0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //带小数点





u16 intnum,second,minute,hour; //定义时间变量



/****************************延时函数**************************/

void delay(u16 t)

{

         u8 x,y;

for(x=t;x>0;x--)

{

          for(y=110;y>0;y--)

  {

  }

}

}



/**********************显示函数*******************************/

void display()

{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 

    LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;

    LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 

    LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 

LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;

    LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;

}



/********************定时器0初始化函数************************/

void init_t0()



{

        TMOD=0x01;    

TH0=(65536-10000)/256;    //给TH0赋初值

TH1=(65526-10000)%256;    //给TH1赋初值



EA=1;    //开总中断

ET0=1;    //开定时器中断

TR0=1;    //开启定时器0

}



/**********************按键函数******************************/

void keydown()

{

        if(k1==0)

{

     

delay(200);

if(k1==0)

{

      second=0;

  intnum=0;  

}

}



if(k2==0)

{

     

delay(200);

if(k2==0)

{

      hour++;    

}

}

if(k3==0)

{

     

delay(200);

if(k3==0)

{

      minute++;  

}

}

if(k4==0)

{

   

delay(200);

if(k4==0)

{

      minute--;

}

}





}



/***************定时器0中断服务函数***************/

void int_t0() interrupt 1

{

        TH0=(65536-10000)/256;

TH1=(65526-10000)%256;

        intnum++;

if(intnum>=100)

{

intnum=0;

second++;

}

if(second>=60)

{

second=0;

minute++;

}

if(minute>=60)

{

     minute=0;

hour++;

}

if(hour>=24)

{

hour=0;

}

}



/**************主函数****************************/

void main()

{

init_t0();

intnum=minute=second=hour=0;



while(1)

{

keydown();

display();

}

}





















#include



sbit k1=P3^1;   //定义四个按键

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;



sbit LSA=P2^2; //38译码器数码管位选

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit beep=P1^5;







typedef unsigned char u8;   //对数据类型进行声明定义

typedef unsigned int u16;





u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不带小数点

   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};



u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,

                    0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //带小数点





u16 intnum,second,minute,hour; //定义时间变量



/****************************延时函数**************************/

void delay(u16 t)

{

         u8 x,y;

for(x=t;x>0;x--)

{

          for(y=110;y>0;y--)

  {

  }

}

}



/**********************显示函数*******************************/

void display()

{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 

        LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;

        LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 

        LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 

LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;

        LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;

}



/********************定时器0初始化函数************************/

void init_t0()



{

        TMOD=0x01;    

TH0=(65536-10000)/256;    //给TH0赋初值

推荐阅读

史海拾趣

Directed Energy Inc公司的发展小趣事

在电子行业中,创新是企业持续发展的关键。Directed Energy Inc始终将创新作为企业的核心竞争力之一,不断投入研发资源,推动技术创新和产品升级。公司拥有一支高素质的研发团队,他们紧跟行业发展趋势,不断探索新的技术和应用,为公司的发展注入了源源不断的动力。这种持续的创新精神使得Directed Energy Inc在电子行业中始终保持领先地位。

Comax Industrial Co Ltd公司的发展小趣事

Comax Industrial Co Ltd公司自创立之初,便明确了其在电子行业中的定位与发展方向。公司初期便注重技术研发,引进了一批高素质的技术人才,并投入大量资源进行技术研发与创新。通过不懈的努力,Comax成功开发出一系列具有竞争力的电子产品,并在市场上获得了良好的口碑。这些产品不仅满足了客户的需求,也为公司的发展奠定了坚实的技术基础。

ADPOW公司的发展小趣事

随着电源管理技术的不断成熟,ADPOW公司开始将技术应用于更多领域,推出了一系列创新产品。这些产品不仅在性能上有所提升,更在外观设计、用户体验等方面进行了优化。同时,公司积极拓展市场,与多家电子设备制造商建立合作关系,将产品广泛应用于手机、电脑、家电等领域。

EUPEC [eupec GmbH]公司的发展小趣事

EUPEC一直致力于技术创新和研发,不断推动电力半导体技术的进步。在多个关键领域,EUPEC都取得了重要的技术突破,如提高电力转换效率、降低能耗等。这些技术突破不仅提升了EUPEC产品的竞争力,也为客户带来了实实在在的经济效益。同时,EUPEC还积极拓展国际市场,产品广泛应用于电解铝、高压直流输电、软启动、直流传动、高压无功补偿设备等领域。

Digilent公司的发展小趣事

作为电子行业的领军企业之一,DIALIGHT始终将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有创新性和竞争力的LED产品。同时,DIALIGHT还积极与高校、科研机构等合作,共同推动LED照明技术的进步和应用。

對餘科技(DIOFIT)公司的发展小趣事

在追求经济效益的同时,DIOFIT公司也积极履行社会责任,致力于环保事业。他们注重节能减排和资源循环利用,采用环保材料和生产工艺,降低产品对环境的污染。同时,DIOFIT公司还积极参与各类公益活动,为社会发展和环境保护贡献自己的力量。

问答坊 | AI 解惑

PIC IIC SLAVE 问题

高分征PIC IIC SLAVE 程序。…

查看全部问答>

研究s3c2410的sdram控制器时遇到问题

s3c2410的手册上,关于sdram时钟周期的设置有下面几个参数: ADDR,nGCS,nOE,nWAIT,DATA 一点都看不懂,也很难查到资料,请各位给点提示或者资料好吗?谢谢。 …

查看全部问答>

SD卡保护

如何获取SD卡特征码? 现在SD卡都是当作存储介质用,其实据说它是有安全特征码的,不知道如何获取呢。…

查看全部问答>

用C#.net和EVC建立操作SQL SERVER C,哪个更好一些?

用C#.net和EVC建立操作SQL SERVER C,哪个更好一些? 我们老师给了个作业,就是让在CE下建立一个数据库,并且可以和SQL SERVER数据库达到同步。但是有两个选择摆在我的面前,是用C++做还是用C#.net做。 我比较倾心于.net。 有没有哪位高人可以指 ...…

查看全部问答>

视频解码后采集到sram的程序。

这是本人写的关于将视频解码后的YCbCr422中一帧图像的亮度信号Y保存到sram中,写完一帧后从sram读出进行后续分析的verilog HDL代码。现在的问题是输出的数据仅仅是最后一个数据,而地址却是逐渐累加的,没发现什么错误。希望高手们给分析一下,不胜 ...…

查看全部问答>

【MSP430共享】用于加速器控制的通用型TCP_IP-多串口协议转换器的研制

摘要: 在加速器控制领域 , 经常涉及到要将带有标准 R S - 2 3 2串行接口的设备通过以太网连接来实 现远程测控任务, 本文所介绍的设计工作解决了 8个串口设备通过一台基于 C P L D和 MS P 4 3 0 技术的 通用型 TC P / I P - 多串口协议转换器来 ...…

查看全部问答>

想学习430啊

今天在同学那儿玩啊,偶然看到430感觉他独特的特点,可以再很多领域得到跟多的使用和发展,我是一名学习测试测量的学生,在我的微机原理课里学习的是单片就是51,感觉学的都是很简单,或者说都快被淘汰的东西啊,桌椅自己很想充实一下自己,多学习 ...…

查看全部问答>

SPI、IIC、IIS、UART的应用分析

SPI   SPI接口的全称是\"Serial Peripheral Interface\",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。  SP ...…

查看全部问答>