在致力于复习并强化先前所学单片机知识的目标导向下,

本文将会引入一个小型项目,同时提供与之对应的完整程序以及详尽讲解,

以此助力读者对单片机知识体系的深入理解与熟练掌握,进一步提升在该领域的实践能力与知识运用水平。

要求:
基本功能:利用数码管显示电子时钟的时、分、秒。要求计时准确,显示稳定,无虚影。
扩展功能:整点报时功能。计时遇整点蜂鸣器发声提示。

程序(根据下面的仿真图编写的程序,仿真图与普中A7的线路基本一致,只有74HC138的输出端是相反的):

    #include<reg51.h>
#define uint unsigned int
#define uchar unsigned char 
#define duanma P0

 sbit wxc=P2^4;
 sbit wxb=P2^3;
 sbit wxa=P2^2;

 uint aa=0,shi=0,fen=0,miao=0,s1,s2,f1,f2,m1,m2;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79, 0x71,0x00 };

void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void display(uint a,uint b,uint c)
{
    s1=a/10;
    s2=a%10;
    f1=b/10;
    f2=b%10;
    m1=c/10;
    m2=c%10;

    wxc=1;wxb=1;wxa=1;   
    duanma=table[s1];
    delay(1);
    wxc=1;wxb=1;wxa=0;   
    duanma=table[s2];
        delay(1);     

    wxc=1;wxb=0;wxa=1;   
    duanma=0x40;     
        delay(1);
        
    wxc=1;wxb=0;wxa=0; 
    duanma=table[f1];
        delay(1);
        wxc=0;wxb=1;wxa=1;   
    duanma=table[f2];
    delay(1);
    wxc=0;wxb=1;wxa=0;   
    duanma=0x40;
        delay(1);     

    wxc=0;wxb=0;wxa=1;   
    duanma=table[m1];      
        delay(1);
        
    wxc=0;wxb=0;wxa=0;   
    duanma=table[m2];
        delay(1);
    
}

void main()
{
    TMOD=0x10;//0001 0000
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    EA=1;
    ET1=1;
    TR1=1;
    while(1)
    {
        if(aa==20)
        {
        aa=0;
        miao++;
        if(miao==60)
        {
        miao=0;
        fen++;
        if(fen==60)
        {
            fen=0;
            shi++;
            if(shi==24)
            {
                shi=0;
            }
        }
        }
        
        
    }
        display(shi,fen,miao);
    }
    }
void ds50ms() interrupt 3
{
    TH1=(65535-50000)/256;
    TL1=(65535-50000)%256;
    aa++    ;   
}

程序讲解:







上面的注释10ms是错误的,这个中断服务程序是每0.05秒执行一次
程序验证:
1、proteus仿真验证


2、单片机运行验证

程序是根据仿真图编写的,而普中A7的原理图和仿真图只有74HC138输出的部分是相反的。

可以手动更改74HC138的输出线路或者自行更改代码

最后修改:2025 年 01 月 09 日