美文网首页
8位数码管显示时间(proteus)

8位数码管显示时间(proteus)

作者: tomato_20fc | 来源:发表于2019-03-22 10:37 被阅读0次

    注: 此例程基本完全抄袭博客---利用单片机的数码管模拟时钟的显示时间---

    • 原理图如下:
    原理图.png
    锁存器使用的74LS373
    8位共阴极数码管
    时间不太准
    代码如下:
    #include <reg52.h>
    #define SEGPORT P0
    //段选和位选引脚,其中段选控制数码管的显示内容,位选控制哪一个数码管亮
    sbit seg_select = P2^0;        
    sbit bit_select = P2^1;        
    //共阴极数码管编码表
    unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};               
    //位码
    unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
    unsigned char TempData[8];
    //初始化时间
    unsigned char shi = 9, fen = 28, miao = 30;
    //显示
    void display()
    {
          static unsigned char i = 0;
    //初始化数码管,让数码管都灭
          SEGPORT = 0x0;
          seg_select = 1;
          seg_select = 0;
          SEGPORT = 0xff;
          bit_select = 1;
          bit_select = 0;
    //显示
          SEGPORT = TempData[i];
          seg_select = 1;
          seg_select = 0;
          SEGPORT = weima[i];
          bit_select = 1;
          bit_select = 0;
            i++;
          if(8 == i)//只有8位
            {
                    i = 0;
        }  
    }
    void time0_init(void)//定时器0初始化
    {
          EA = 1;                             
          TMOD |= 0x01;                        
    //一次定时20ms
          TH0 = (65536 - 20000) / 256;
          TL0 = (65536 - 20000) % 256;        
          ET0 = 1;                    
          TR0 = 1;
    }
    //定时器0中断
    void timer0_isr() interrupt 1
    {
          static unsigned char i = 0;
              TH0 = (65536 - 20000) / 256;
          TL0 = (65536 - 20000) % 256;    
          i++;  
            if(50 == i) //1s
            {
                    i = 0;
                    miao++;
                    if(60 == miao)
                    {
                            miao = 0;
                            fen++;
                            if(60 == fen)
                            {
                                fen = 0;
                                    shi++;
                                    if(24 == shi)
                                    {
                                            shi = 0;
                                    }
                            }
                        }
            }
    
            TempData[0] = duanma[shi / 10];
            TempData[1] = duanma[shi % 10];
            TempData[2] = 0x40;
            TempData[3] = duanma[fen / 10];
            TempData[4] = duanma[fen % 10];
            TempData[5] = 0x40;
            TempData[6] = duanma[miao / 10];
            TempData[7] = duanma[miao % 10];
    
    }
    
     
    //定时器1初始化
    void time1_init(void)
    {
    
              EA = 1;
          TMOD |= 0x10;
          TH1 = (65536 - 20000) / 256;
          TL1 = (65536 - 20000) % 256;
          ET1 = 1;
          TR1 = 1;
    }
    void time1_isr() interrupt 3
    {
              TH1 = (65536 - 1000) / 256;
          TL1 = (65536 - 1000) % 256;     
          display();
    } 
    void main()
    
    {
         time0_init();
         time1_init();
         while(1)
         {
               }
    }
    
    

    相关文章

      网友评论

          本文标题:8位数码管显示时间(proteus)

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