美文网首页
单片机实现秒表,通过一个按键控制秒表的暂停、启动、复位

单片机实现秒表,通过一个按键控制秒表的暂停、启动、复位

作者: DoctorLDQ | 来源:发表于2017-04-25 19:54 被阅读1675次

    最近学习到单片机,老师要求我们用单片机实现一个秒表。在求助了各种网上的资源后发现还是一脸mb,所以决定自己动手,丰衣足食。以下就是具体的代码实现及运行结果。  #include "reg52.h"  #includetypedef unsigned int u16;

    typedef unsigned char u8;

    sbit LSA=P2^2;

    sbit LSB=P2^3;

    sbit LSC=P2^4;

    sbit k2=P3^2;

    u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

    u8 code num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

    u8 ssec,sec,flag=0,wan=0;

    u8  DisplayData[4];

    u8 val0;  //最高位

    u8 val1; //次高位

    u8 val2;

    u8 val3;

    void delay(u16 i)

    {

    while(i--);

    }

    void Timer0Init()

    {

    TMOD|=0X01;

    TH0=0Xd8;

    TL0=0Xf0;

    ET0=1;

    EA=1;

    TR0=0;

    }

    void DigDisplay()

    {

    u8 i;

    for(i=0;i<4;i++)

    {

    switch(i)

    {

    case(0):

    LSA=1;LSB=1;LSC=1; break;//显示第0位

    case(1):

    LSA=0;LSB=1;LSC=1; break;//显示第1位

    case(2):

    LSA=1;LSB=0;LSC=1; break;//显示第2位

    case(3):

    LSA=0;LSB=0;LSC=1; break;//显示第3位

    }

    P0=DisplayData[i];

    delay(100);

    P0=0x00;

    }

    }

    void datapros()

    {

    DisplayData[0]=smgduan[ssec%10];

    DisplayData[1]=smgduan[ssec%100/10];

    DisplayData[2]=smgduan[sec%10]+0x80;

    DisplayData[3]=smgduan[sec/10];

    // val=smgduan[sec/10];

    }

    void trans(u8 x)

    {

    u8 i;

    for(i=0;i<10;i++)

    {

    if(x==i)

    {

    SBUF=num[i];

    }

    }

    while(!TI);

    TI=0;

    }

    void send()

    {

    TI=0;

    if(TR0=1)

    {

    trans(val0);

    trans(val1);

    trans(val2);

    trans(val3);

    SBUF=0x0a;

    while(!TI);

    TI=0;

    }

    }

    void Timer0() interrupt 1

    {

    u8 i;

    TH0=0Xd8;

    TL0=0Xf0;

    ssec++;

    i++;

    val2=i%100/10;

    val3=i%10;

    if(ssec==100)

    {

    ssec=0;

    sec++;

    val0=sec/10;

    val1=sec%10;

    send();

    if(sec>=60)

    {

    sec=0;

    }

    }

    }

    void keypros()

    {

    if(k2==0)

    {

    delay(1000);

    flag++;

    if(k2==0)

    {

    // TR0=1;

    while(!k2);

    switch(flag)

    {

    case 1:TR0=1;break;

    case 2:TR0=0;break;

    case 3:ssec=0;sec=0;TR0=0;flag=0;break;

    }

    }

    }

    }

    void UsartInit()

    {

    SCON=0x50;  // SCON: 模式 1, 8-bit UART, 使能接收

    TMOD |= 0x20;      // TMOD: timer 1, mode 2, 8-bit 重装

    TH1=0xFD;      // TH1:  重装值 9600 波特率 晶振 11.0592MHz

    TL1=0xFD;

    TR1=1;          // TR1:  timer 1 打开

    }

    void main()

    {

    Timer0Init();

    UsartInit();

    while(1)

    {

    datapros();

    keypros();

    DigDisplay();

    }

    }

    相关文章

      网友评论

          本文标题:单片机实现秒表,通过一个按键控制秒表的暂停、启动、复位

          本文链接:https://www.haomeiwen.com/subject/iqcbzttx.html