历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2020年04月18日 | 利用51单片机做一个简易时钟

2020-04-18 来源:eefocus

利用独立键盘,数码管完成一个简易的时钟,按键一可以修改时间,按键二可以设置闹钟,按键三进行加一操作,按键四进行减一操作。


主函数:


void main()

{

    bsp_init();

    while(1)

    {

        TimeTim();              //正常时间在走

        bsp_KeyScan();          //键盘扫描看哪个功能键被按下

        bsp_KeyProc(keyvalue);  //根据键值进行相应的功能处理 

        SetValueShow();         //数码管上显示的值

        ShowSegCC();            //显示在数码管上

        bsp_CheckAlarm();       //闹钟检查

    }   

}


时钟模块:


unsigned char hour = 2, min = 2, sec = 3;       //设置时间初值

unsigned char ahour = 0, amin = 0, asec = 0;    //设置闹钟初值

unsigned char time = 0;


void delay_us(unsigned char t)

{

    while(--t);

}


void delay_ms(unsigned int t)   //t最大为255

{

    while(t--)

    {

        delay_us(245);

        delay_us(245);

    }

}


void TimeTim()

{

     if(settype == 0 && alarmvalue == 0)     //当不在闹钟状态也不在修改时间状态的时候时间正常走

     {

         if(count == 20)

         {

            count = 0;

            sec++;

            if(sec == 60)

            {

                sec = 0;

                min++;

                if(min == 60)

                {

                    min = 0;

                    hour++;

                    if(hour == 24)

                    {

                        hour = 0;

                    }

                }

            }

         }

    }

}


//检查时间是否到了闹钟时间

void bsp_CheckAlarm(void)

{

    if((hour == ahour) && (min == amin) && (sec == asec))

    {

        hour = 0;

        min = 0;

        sec = 0;

    }

}


键盘模块:


sbit SETTIME = P0^0;    //修改时间

sbit SETALARM = P0^1;   //设置闹钟

sbit INC = P0^2;        //加1

sbit DEC = P0^3;        //减1


unsigned char keyvalue = 0;

unsigned char settype = 0;      //0是初始状态正常显示,1是修改秒,2是修改分,3是修改时

unsigned char alarmvalue = 0;   //0是初始状态,1是修改秒,2是修改分,3是修改时


void bsp_KeyScan(void)

{

    if(SETTIME == 0)//K1按键被按下

    {

        keyvalue = 1;

        while(!SETTIME);//等待按键释放


    } 


    if(SETALARM == 0)

    {

        keyvalue = 2;

        while(!SETALARM);


    }


    if(INC == 0)

    {

        keyvalue = 3;

        while(!INC);

    }


    if(DEC == 0)

    {

        keyvalue = 4;

        while(!DEC);

    }

}


void bsp_KeyProc(unsigned char keyv)

{

    if(keyv == 1)

    {

        settype++;

        if(settype == 4)

        {

            settype = 0;

        }

        keyvalue = 0;    //键值要清0!!!

    }


    if(keyv == 2)

    {

        alarmvalue++;

        if(alarmvalue == 4)

        {

            alarmvalue = 0;

        }

        keyvalue = 0;

    }


    if(keyv == 3)

    {

        timeadd();

        keyvalue = 0;

    }


    if(keyv == 4)

    {

        timedec();

        keyvalue = 0;

    }

}


void timeadd()

{

    //设置时间加1

    if(settype == 1)

    {

        if(sec < 59)

        {

            sec++;

        }


        else

        {

            sec = 0;

        }

    }


    else if(settype == 2)

    {

        if(min < 59)

        {

            min++;

        }


        else

        {

            min = 0;

        }

    }


    else if(settype == 3)

    {

        if(hour < 23)

        {

            hour++;

        }


        else

        {

            hour = 0;

        }

    }


    //设置闹钟加1 

    if(alarmvalue == 1)

    {

        if(asec < 59)

        {

            asec++;

        }


        else

        {

            asec = 0;

        }

    }


    else if(alarmvalue == 2)

    {

        if(amin < 59)

        {

            amin++;

        }


        else

        {

            amin = 0;

        }

    }


    else if(alarmvalue == 3)

    {

        if(ahour < 23)

        {

            ahour++;

        }


        else

        {

            ahour = 0;

        }

    }

}


void timedec()

{


    //设置时钟减1

    if(settype == 1)

    {

        if(sec > 0)

        {

            sec--;

        }


        else

        {

            sec = 59;

        }

    }


    else if(settype == 2)

    {

        if(min > 0)

        {

            min--;

        }


        else

        {

            min = 59;

        }

    }


    else if(settype == 3)

    {

        if(hour > 0)

        {

            hour--;

        }


        else

        {

            hour = 23;

        }

    }



    //设置闹钟减1

    if(alarmvalue == 1)

    {

        if(asec > 0)

        {

            asec--;

        }


        else

        {

            asec = 59;

        }

    }


    else if(alarmvalue == 2)

    {

        if(amin > 0)

        {

            amin--;

        }


        else

        {

            amin = 59;

        }

    }


    else if(alarmvalue == 3)

    {

        if(ahour > 0)

        {

            ahour--;

        }


        else

        {

            ahour = 23;

        }

    }

}


数码管模块:


#define SEGPORT P1

sbit WEI = P2^1;

sbit DUAN = P2^0;


unsigned char code TableCA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  //共阳数码管段选码表,无小数点

unsigned char code TableSel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位选码表

unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管段选码表,无小数点

unsigned char Show[8] = {0};

//unsigned int showvalue = 0;

//unsigned int time = 0;


void ShowSegCA(unsigned char t)

{

    SEGPORT = TableCA[t];   

}

//1到255显示

void ShowSegCC(void)

{

    static unsigned char i = 0;


    //消隐

    SEGPORT = 0x00;

    DUAN = 1;

    DUAN = 0;


    //选通位码

    WEI = 1;

    SEGPORT = TableSel[i];

    WEI = 0;


    //选通位码

    DUAN = 1;

    SEGPORT = Show[i];

    DUAN = 0;


    i++;

    if(i == 8)

    {

        i = 0;

    }

推荐阅读

史海拾趣

BAHCO公司的发展小趣事

随着市场的不断变化和消费者需求的多样化,BAHCO也在不断调整和优化产品线。除了传统的五金工具外,BAHCO还积极开发新的产品领域,如电动工具、测量仪器等。这些新产品的推出不仅丰富了公司的产品线,也满足了不同消费者的需求。同时,BAHCO还注重产品的环保性能和可持续性发展,致力于为消费者提供更加环保、高效的产品解决方案。

Frequency Sources公司的发展小趣事

面对日益严峻的环境问题和不断变化的市场需求,Frequency Sources公司积极响应国家环保政策和可持续发展战略,致力于研发绿色、环保、高效的频率源产品。同时,公司还继续加大在技术创新方面的投入力度,不断推出具有自主知识产权的新产品和新技术。这种可持续发展的理念和技术创新的精神使得公司在激烈的市场竞争中始终保持领先地位并实现了持续健康的发展。

需要注意的是,以上故事是基于电子行业的一般情况和频率源技术的特点来构建的虚构故事,并不直接对应任何具体公司的实际情况。在实际应用中,请根据具体公司的历史和发展情况进行调整和修改。

启臣微(Chip)公司的发展小趣事

作为一家高新技术企业,启臣微深知绿色生产的重要性。公司采用先进的生产工艺和设备,实现了生产过程中的节能减排。同时,公司还积极参与环保公益活动,倡导绿色生活方式,为社会的可持续发展贡献了自己的力量。

Hengstler GmbH公司的发展小趣事

随着公司业务的不断发展,启臣微开始积极拓展海外市场。公司在西安设立研发中心,在深圳和昆山设立销售中心,并与多家国际知名企业建立了合作关系。这些举措不仅提升了公司的国际影响力,也为公司带来了更多的发展机遇。

Flamar公司的发展小趣事

在追求经济效益的同时,Flamar公司始终不忘履行企业社会责任。公司积极响应全球绿色可持续发展号召,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产工艺、推广节能产品等措施,Flamar公司有效降低了产品生命周期中的环境影响。此外,公司还积极参与公益事业和社会活动,为推动电子行业的绿色可持续发展贡献自己的力量。

Everbuild公司的发展小趣事

为了进一步扩大市场份额,Everbuild开始积极拓展国际市场。公司派遣专业的团队参加国际电子产品展览会,与国际知名厂商进行技术交流和合作。同时,Everbuild还针对不同国家和地区的市场需求,推出了定制化的电子产品解决方案。这些努力使Everbuild的产品逐渐进入国际市场,并赢得了越来越多客户的信任和支持。

问答坊 | AI 解惑

usb 主机在什么情况下会不停的给设备发送复位信号呢?请高手些指教哈!

我现在的设备端不停的收到复位信号,接着是超时,不知道是在什么情况下主机才会发复位信号?…

查看全部问答>

这样的报表用怎么做?

数量    厂家     数量     型号      数量                           n ...…

查看全部问答>

wince 应用程序安装请教

魅族安装应用程序是这么做的。 四、发布应用程序 …

查看全部问答>

求购《Tornado/VxWorks入门与提高》

求购,《Tornado/VxWorks入门与提高》,哪里能买到呢? 网上的书店找了好多都是缺货,那位仁兄帮帮忙 谢谢 mryanzh@126.com…

查看全部问答>

EVC怎么控制菜单的checked属性?(基于对话框)

我用evc做了一个基于对话框的工程,我用代码来加上Menu,但我怎么控制菜单的checked属性呢? 我就是想实现选择一个菜单后有个小勾,就想windows里面的查看方式一样,比如列表,缩略图,小图标什么的,选择后有小勾的效果。 谁知道啊?…

查看全部问答>

STM32无法更新程序

本人购买了一块STM32F103ZET6评估板,配有KEIL3和ULINK下载器。后因需要防止程序被读出,想尝试下读保护功能,于是在程序中添加了使能读保护的代码。板子复位后正常运行,查询读保护状态位已置位,但无法更新程序。查阅资料得知使能读保护后 ...…

查看全部问答>

New head job opportunity for you

Here are some new job opportunities for you from EMC China,if it\'s fit for you .Plz touch me,thanks for your support! Christina(028)86701200 QQ:1106525264   Principal Software QA Engineer - USD/Chengdu Responsibilities ...…

查看全部问答>

如何利用FPGA做高阶FIR滤波器设计

小弟最近在做毕业设计,用到了高阶FIR滤波器,一头雾水,查找了一些资料后,了解了一种方法:利用分布式串并结合的算法可以实现。里面有用到FPGA的查找表和流水线,我对FPGA不怎么熟悉,不知道怎么调用这两个东西,或是自己设计?怎么设计?哪位大 ...…

查看全部问答>

EEWORLD大学堂----电源设计小贴士39:同步整流带来的不仅仅是高效率

电源设计小贴士39:同步整流带来的不仅仅是高效率:https://training.eeworld.com.cn/course/479 电源设计小贴士39:同步整流带来的不仅仅是高效率 …

查看全部问答>

刚开始学verilog 问个问题啊

quartus II 中 写verilog的时候,敲enter键有时会出现箭头,怎么设置才能消除箭头??求解…

查看全部问答>