历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2018年07月21日 | 51单片机之数码管显示实验

2018-07-21 来源:eefocus

/* 

名称:51单片机之数码管显示实验 

说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。 

本实验编写了几个数码管显示的简单程序。在此不做赘述了。


*/


#include


#define uchar unsigned char



//共阳极段码(a在高位,dp在低位)

uchar code _data[16] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,

                                                0x11,0xC1,0x63,0x85,0x61,0x71

                                                };


//共阳极段码(a在低位,dp在高位)

uchar code _data1[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,

                                                0x83,0xC6,0xA1,0x86,0x8E

                                                };                                              


//延时函数

void delay_ms(unsigned int n)

{

    unsigned int i=0,j=0;

    for(i=0;i

        for(j=0;j<123;j++);

}



//一位数码管循环显示0-F(共阳极)

void OneNixieTube()

{

    uchar i = 0;


    while(1)

    {

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

            {

                P2 = _data1[i];         

                delay_ms(1000);

            }




    }

}




//静态数码管循环显示0-8

void StaticNixieTube()

{

    uchar i = 0,temp = 0;

    while(1)

    {

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

            {


                //片选部分

                if(i%8 == 0)

                    temp = 0x01;

                else

                    temp = temp<<1;

                P0 = ~temp;                    //P0为片选输出端口,低电平有效

                //显示部分

                P2 = ~_data1[i];           //P2为显示输出端口



                delay_ms(1000);

            }

    }


}



//动态数码管显示(0-7,8-F,8个数码管分两次显示)

void DynamicNixieTube()

{

    uchar i = 0;

    unsigned int delay_time = 0;        //0-7 8-F每段的延时时间


    uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};        //片选码


        while(1)

        {


            if(delay_time++ < 250)

            {

                //0-7段显示

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

                {

                    P0 = CS[i];

                    P2 = ~_data1[i];


                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来


                }

            }

            else if(delay_time++ < 500 )        //???都是循环250次,为什么0-7段显示的时间长于8-F段显示的时间???

            {

                //8-F段显示

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

                {

                    P0 = CS[i];

                    P2 = ~_data1[i+8];


                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来


                }


            }

            else

                delay_time = 0;                 //重新置零


        }

}



//数码管显示指定时间格式为 HH-MM-SS

void DisplayTime(uchar hour,uchar min,uchar sec)

{

    uchar time[8] = {0};

    uchar i = 0,j = 0;

    uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};        //片选码



    //获取时间的每位信息

    if(hour >= 0 && hour <=23 )

    {

            time[0] = hour / 10;

            time[1] = hour % 10;


            time[2] = ':';

    }



    if(min >= 0 && min <= 59)

    {

        time[3] = min /10;

        time[4] = min % 10;


        time[5] = ':';


    }


    if(sec >= 0 && sec <= 59)

    {

        time[6] = sec / 10;

        time[7] = sec % 10;

    }



    //显示部分

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

    {

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

                {

                    P0 = CS[i];             //片选


                    //显示时间

                    if(i != 2 && i != 5)

                    {

                        j = time[i];

                        P2 =  ~_data1[j];

                    }

                    else                        //显示分隔符‘-’

                    {

                        j = 0xBF;

                        P2 = ~j;

                    }


                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来


                }

    }




}



int main()

{

    //  OneNixieTube();

    //  StaticNixieTube();

    //DynamicNixieTube()

        //DisplayTime(12,40,56);





    return 0;

}


推荐阅读

史海拾趣

Electrocube Inc公司的发展小趣事

Electrocube Inc公司的创始人在创立之初便面临着重重挑战。当时,电子行业正处于快速发展阶段,市场竞争激烈。然而,创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,成功开发出了一款高性能、低成本的电容器产品。这款产品迅速获得了市场的认可,为公司赢得了第一桶金,也为后续的发展奠定了坚实的基础。

高博(GBG)公司的发展小趣事

品质是企业生存之本。谷峰公司始终将产品质量放在首位,建立了严格的质量控制体系,确保每一款产品的性能和质量都达到行业领先水平。同时,公司还注重品牌建设,通过参加国际展会、发布新产品、提供优质服务等方式,不断提升GOFORD品牌的知名度和美誉度。如今,GOFORD已成为电子行业可信赖的高可靠性功率器件供应商之一。

Broadcom(博通)公司的发展小趣事

1991年,加州大学洛杉矶分校的工程学教授亨利·山缪利和他的博士班学生亨利·尼古拉斯,以各出资5000美元的方式,在美国加州尔湾小镇共同创立了博通公司。初创时期,博通主要致力于开发机顶盒的宽带通信芯片。随着技术的不断进步和市场需求的增长,博通的产品逐渐受到业界的认可,销售额稳步上升。

晶群科技(Gem-micro)公司的发展小趣事

博通在有线和无线通信半导体领域一直保持着技术创新的领先地位。公司不断投入研发,推出了一系列具有竞争力的产品,包括宽带通信芯片、无线局域网芯片组等。这些产品的成功应用,不仅提升了博通的市场地位,也为整个电子行业的发展做出了重要贡献。

EF Johnson Technologies Inc公司的发展小趣事

在电子通信技术的浪潮中,EF Johnson Technologies Inc公司凭借其卓越的研发团队,成功开发出一款新型无线通信设备,该设备在信号稳定性和传输距离上均取得了重大突破。这一技术突破不仅让EF Johnson在市场上获得了显著的竞争优势,也推动了整个行业的技术进步。随着产品的广泛应用,EF Johnson逐渐确立了其在无线通信领域的领先地位。

Daniels Manufacturing公司的发展小趣事

随着全球电子行业的快速发展,DMC意识到必须走向国际市场,以寻求更大的发展空间。在20世纪90年代,DMC开始实施国际化战略,通过设立海外分支机构、与当地企业合作等方式,逐步拓展国际市场。同时,DMC还积极参与国际展览和技术交流,提高品牌知名度和影响力。这些努力使得DMC在国际市场上逐渐崭露头角,产品出口量持续增长。

问答坊 | AI 解惑

LED的生产的几种封装形式

1、引脚式(Lamp)LED封装   引脚式封装就是常用的Æ3-5mm封装结构。一般用于电流较小(20-30mA),功率较低(小于0.1W)的LED封装。主要用于仪表显示或指示,大规模集成时也可作为显示屏。其缺点在于封装热阻较大(一般高于100K/W),寿命较短。 ...…

查看全部问答>

500分寻找CRC方面的专家解决问题!分不够另开贴给分!

有套串口通讯协议,部分内容如下: 帧头   命令码         数据长度  数据          校验     帧尾 16     02 00 00 ...…

查看全部问答>

wince下如何隐藏输入法图标

有些界面下根本不需要SIP,我想把它隐藏掉  相信大家也都遇见过这种问题  你们是怎么解决的?…

查看全部问答>

单片机测控系统中的抗干扰技术 (转载)

单片机测控系统中的抗干扰技术 (转载!) 摘 要:本文针对单片机测控系统中的干扰因素,并结合实际应用系统给出了采取软、硬件两种方法抗干扰的具体措施。 关键词:单片机测控系统抗干扰? 概述 干扰是造成单片机测控系统故障的主要原 ...…

查看全部问答>

谁知道那种座机后面长途锁是怎么回事吗?

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 大家好,就像座机电话后面长途锁,拧到左边就能打长途,拧到右边就不能打长途了,这种信号锁叫什么名字啊。什么工作原理呢?好奇,望大家赐教啊....... …

查看全部问答>

力科发布业界最全面的MIPI测试解决方案

力科发布业界最全面的MIPI测试解决方案…

查看全部问答>

intouch的硬件狗及授权的问题?

在购买inotuch硬件狗和授权文件时,是否规定了使用单位,如果多余的硬件狗或授权文件可否用在其他地方? 请购买过的朋友帮忙解答一下…

查看全部问答>

STM8S的bootloader,能STM32一样串口ISP?

仔细看了UM0560,UM0462,并试了一下UM0462.zip;还是不知道STM8S能不能像STM32一样,通过串口ISP? UM0560里提到可以通过UART、CAN、SPI等进行bootloader,好像是通过寄存器的值来选择启动方式。 但是,如果我只有一个STM8S板,没有ST-LINK ...…

查看全部问答>

基于IEC61850的智能电子设备(IED)系统解决方案

智能电网和IED 智能电网是一种使用信息和通信技术对电网内信息进行采集,并基于采集到的信息(例如发电厂和电能消耗的对等信息)可以自动协调的电网。智能电网通过电力系统的高度自动化,可以改进发电和配电的效率、可靠性、经济性以保证电力网络的 ...…

查看全部问答>