找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1696|回复: 1
收起左侧

51单片机数码管时钟(带138译码器)

[复制链接]
ID:718952 发表于 2020-3-30 17:57 | 显示全部楼层 |阅读模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         //数码管位选数据

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;//位选控制,二进制在138译码器里转成十进制对应的数码管位

uint miao=0;                //秒
uint fen=0;                        //分
uint shi=0;                    //时
uint n=0;                        //100us计数次数
uint date[]={0,0,0,0,0,0};          //时,分,秒的个位和十位,此数组起到过度段码参数的作用

void delay(uint z)                         //扫描显示延时函数
{
     uint x,y;
         for(x=z;x>0;x--)
          for(y=50;y>0;y--);
}
/************************************************************/
void led_num(uchar we)                 //数码管位选
        {

         switch(we)//直接屏蔽了用不到的两个位
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;

                        case(3):
                                LSA=1;LSB=1;LSC=0; break;
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;

                        case(6):
                                LSA=0;LSB=1;LSC=1; break;
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;
               
                }
          }
/****************************************************************/
void led_date(uint a)                                     //数码管段选
{
         P0=leddata[a];
}
/***************************************************************/                                                                       
void display()                                                        //显示函数,逐条执行
{          
        led_num(0);//送位选
        led_date(date[0]);//送段选
        delay(1);//显示延时
        P0 = 0x00;//结合前面的先送位选信号,再送段选信号,再消除段选端依然存在的高电平,可消除残影

        led_num(1);
        led_date(date[1]);
        delay(1);
        P0 = 0x00;

        led_num(3);
        led_date(date[2]);
        delay(1);
        P0 = 0x00;
         
        led_num(4);
        led_date(date[3]);
        delay(1);
        P0 = 0x00;

        led_num(6);
        led_date(date[4]);
        delay(1);
        P0 = 0x00;

        led_num(7);
        led_date(date[5]);
        delay(1);
        P0 = 0x00;

         
}
/***********************************************************************/
void time_init()                                                   //定时器初始化函数
{
    TMOD=0x02;                                                          //选择方式2
        TH0=156;                                                          //重装初值为156
        TL0=156;                                                          //运行值为156
        EA=1;                                                                  //开总中断
        ET0=1;                                                                  //开定时器0中断
        TR0=1;                                                                  //开定时器0
}
/***********************************************************************///主函数
void main()
{

   time_init();
   while(1)
   {
       display();

   }


}


/************************************************************************/
void timer() interrupt 1                                          //定时器0中断
{         
     n++;
         if(n==10000)                                                                 //当n=10000时,表示1s到了 !
         {         
             n=0;
             miao++;
                 if(miao==60)
                 {
                     miao=0;
                     fen++;
                         if(fen==60)
                         {
                             fen=0;
                                 shi++;
                                 if(shi==24)
                                 {
                                    shi=0;
                                 }
                         }
                 }
                 date[0]=miao%10; //显示秒的个位
                 date[1]=miao/10; //显示秒的十位

                 date[2]=fen%10;
                 date[3]=fen/10;

                 date[4]=shi%10;
                 date[5]=shi/10;
       
         }

          
}
//此例程使用的是8个共阴数码管(2个4位的),位选端接138译码器输出端,段选端接74HC573输出,P0接573的输入。

回复

使用道具 举报

ID:734445 发表于 2020-4-21 15:48 来自手机 | 显示全部楼层
请问有电路仿真图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表