×
单片机 > 单片机程序设计 > 详情

简单做的基于51单片机的数码管时钟

发布时间:2021-04-25 发布时间:
|

看看抽屉的材料,就想做做东西玩玩。本来想做99码表的,结果按键开关不够,就改成了时钟。话不多说,直接上图。
最小系统

 



显示模块
 


最后效果
 

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
 

单片机源程序如下:

/*********************************************************************************

*实验名   :数码管动态显示

*实验效果        :8位数码管显示数字12345678

*注意   : 每位数码管显示之间延迟时间小于3ms可看见8位数码管同时点亮

*

*********************************************************************************/

#include

#define uchar unsigned char

#define uint unsigned int

        

uint k=0;

uint second=0;//秒

uint min =0;//分

uint hour=1;//时


sbit we1=P3^3; //位选

sbit we2=P3^1;

sbit we3=P3^2;

sbit we4=P3^0;

sbit L0=P2^0;


uchar code sz[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,

                   0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 

                   0x5e , 0x79 , 0x71 , 0x00};         //0-9&A-F&“不显示”  字型码


void delay(uint xms)                  //xms等于几就延迟几毫秒

{

    uint i,j;

        for(i=xms;i>0;i--)

            for(j=112;j>0;j--);

}


void Init_timer0(void)

{

  TMOD |= 0X01;                      //工作方式1 内部寄存器控制的定时功能

        TH0=0X3c;                         //高八位的初值

        TL0=0Xb0;                         //第八位初值

        EA=1;                            //开启整体中断允许

        ET0=1;                           //开启定时器0中断允许

        TR0=1;                                                         //开始计数

}


void Timer0_isr(void)interrupt 1

{

  TH0=0x3c;

        TL0=0xb0;

        k++;

}


void main()

{

        Init_timer0();

    while(1)

        {

                if(k==20)  //20次1秒

                {

                second++;

                k=0;

                if(second==60)

                {

                  second =0;

                        min++;

                        if(min==60)

                        {

                           min=0;

                                 hour++;

                                if(hour==13)

                                {

                                  hour=1;

                                }

                        }

                }

                

                }

                P1=sz[min%10];   //分显示

                we4 =0;

                delay(5);

                we4=1;

                        

                P1=sz[min/10];   

                we3=0;

                delay(5);

                we3=1;

                

                P1=sz[hour%10];   //时显示

                we2=0;

                delay(5);

                we2=1;

                

                P1=sz[hour/10];   

                we1=0;

                delay(5);

                we1=1;

                

                /*P1=sz[0];  //显示0

                we1=0;

                delay(10);

                we1=1;

                

                P1=sz[1];   //显示1

                we2=0;

                delay(10);

                we2=1;

                

                P1=sz[2];   //显示2

                we3=0;

                delay(10);

                we3=1;

                

                P1=sz[3];   //显示3

                we4=0;

                delay(10);

                we4=1;*/

        }

}

…………………



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多