历史上的今天
返回首页

历史上的今天

今天是:2025年01月03日(星期五)

正在发生

2020年01月03日 | 简易一小时定时器 数码管显示

2020-01-03 来源:51hei

近些天图书馆收书,规定人离开座位不能超过15分钟不然就会把书收走,所以制作了一个计时器,用来指示人离开的时长,按照最简需求设计,计时时长为1小时,超出时间清零。


附带了一个按键,用于计时过程中的暂停,这样这个计时器可以当作秒表使用了,做个题什么的限制一下时间又不用占用手机。而且最关键的是小巧,看起来不会太蠢...
 

 


说明:
1.单片机使用STC15F104W,共有6个I/O
2.数码管为时钟样式的数码管,中间带有“:”的,焊接时按照最短路径焊接,移植程序请考虑修改smgduan[10]的段选值
3.程序定时器0初始值是在12MHz晶振下的初始值,移植程序时请注意修改
4.数码管采用74HC138+74HC595驱动,595典型连接方式到单片机普通I/O,138改为2-4线驱动,S2=0,Y0~Y3进行位选
5.清零操作就重新上电就好啦,毕竟是最简需求嘛
6.整个板子需要4根跳线,分别是
    74HC595的SRCLR'到VCC
    74HC138的S2到GND
    板子连接时138译码器GND到供电地的跳线
    板子背面使用较硬铁丝(剪下的元件引线)连接数码管第4位到138译码器Y3

程序设计思路:
初始化一个5ms的定时器,每计数200次为1s,每秒将时间值变量加一,在主程序中循环处理这个数据,对60取模得到分钟数,取余得到秒数。
将所取到的分钟和秒按位取出,得到待显示的每一位数据,存放在Display_time[4]数组中。调用数码管显示函数进行显示。
在循环中加入一个按键检测,如果按键按下,就将定时器运行位取反,实现暂停效果。
设定一个标志位point,每秒的前一半令其为1,后一半令其为0,在显示函数中对这一位进行判断,决定数码管小数点位是否亮。
注意:时钟数码管的中间“:”是第二位小数点,但是为了简便,将所有小数点全部点亮了。

#include

#include

sbit S1=P3^0;

sbit S2=P3^5;

sbit SER=P3^1;

sbit RCLK=P3^2;

sbit SRCLK=P3^3;//74HC595管脚定义

sbit KEY=P3^4;


//全局变量表

unsigned char code smgduan[10]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7};//给74HC595的段选值

unsigned char Display_Time[4]={0,0,0,0};

unsigned int time=0;

unsigned char cnt=0;//定时器周期计数

bit point=1;

/*##############################################################################################

设计名称:简易一小时计时器

设计者:清河


平台:STC15F104W

硬件部分

数码管显示:位选使用74HC138改为2-4线译码、段选使用74HC595减少IO口使用

        使用4位共阴极数码管,时钟数码管,显示无符号位


注意:为尽可能保证精度,晶振选取12MHz

##############################################################################################*/

void delay(unsigned int cnt)//调用该函数进行一段时间的延时

{

        while(cnt--);

}


void Timer0Init(void)                //5毫秒@12.000MHz

{

        EA=1;

        ET0=1;

        AUXR |= 0x80;                //定时器时钟1T模式

        TMOD &= 0xF0;                //设置定时器模式

        TL0 = 0xA0;                //设置定时初值

        TH0 = 0x15;                //设置定时初值

        TF0 = 0;                //清除TF0标志

        TR0 = 1;                //定时器0开始计时

}


void hc595send(unsigned char dat)//使用SPI向74HC595发送一个字节的数据                                

{  

        unsigned char a;

        SRCLK=0;

        RCLK=0;

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

        {

                SER=dat>>7;

                dat<<=1;

                SRCLK=1;

                _nop_();

                _nop_();

                SRCLK=0;        

        }

        RCLK=1;

        _nop_();

        _nop_();

        RCLK=0;

}


void smgdisplay()//数码管显示函数,参数为需要显示的数组

{

        unsigned char i;

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

        {

                switch(i)//位选,选择点亮的数码管

                {

                        case(0):

                                S1=0;S2=1; break;

                        case(1): 

                                S1=1;S2=0; break;

                        case(2):

                                S1=0;S2=0; break;

                        case(3):

                                S1=1;S2=1; break;

                }

                if(point)

                {

                        hc595send(smgduan[Display_Time[i]]|0x08);

                }

                else

                {

                        hc595send(smgduan[Display_Time[i]]);

                }

                delay(10); //间隔一段时间扫描

                hc595send(0x00);//消隐

        }

}


void main()

{

        Timer0Init();

        while(1)

        {

                Display_Time[0]=(time/60)/10;

                Display_Time[1]=(time/60)%10;

                Display_Time[2]=(time%60)/10;

                Display_Time[3]=(time%60)%10;

                smgdisplay();

                

                if(KEY==0)

                {

                        delay(5000);

                        if(KEY==0)

                        {

                                TR0=!TR0;

                                point=1;

                        }

                        while(!KEY);

                }

        }

}


void Timer0() interrupt 1

{

        TL0 = 0xA0;                //设置定时初值

        TH0 = 0x15;                //设置定时初值

        

        if(cnt==200)//计数到1s

        {

                cnt=0;//清空

                point=1;//秒闪烁:亮

                time++;//时间加1秒

        }

        else

        {

                if(cnt==100)//当计数半秒

                {

                        point=0;//秒闪烁:灭

                }

                cnt++;

        }

        

        if(time==3600)//满值清空

        {

                time=0;

        }

}


插入的代码似乎格式有问题,复制应该不影响编译,但建议下载源代码。

备注:由于该作品的耗电量很小,故使用“充满自停”的移动电源供电时,可能会出现一段时间后自动停止供电的情况,解决办法是使用无充电保护的移动电源或者增加作品负载(加几个灯什么的...)

推荐阅读

史海拾趣

台湾三礼(3L)公司的发展小趣事

近年来,随着环保意识的提升和绿色能源的普及,三礼公司也积极投身于绿色生产领域。2019年,公司在广西南宁开始建设新厂,预定投资3亿元人民币用于厂房及自动化设备的建设。新厂总建筑面积达70,000平方米,将成为公司目前所有生产基地中规模最大的一个。同时,公司还计划全面架设太阳能发电系统,目标是在未来三年内承担公司总需求电量的30%。这一举措不仅有助于降低公司的生产成本,还体现了公司对环保事业的积极贡献。

这五个故事只是三礼公司发展历程中的一部分缩影,但它们却生动地展现了公司在电子行业中的成长轨迹和不懈努力。从北美市场的拓展到中国内地生产能力的扩大,再到技术突破和新产品开发,三礼公司始终保持着敏锐的市场洞察力和强大的创新能力。同时,公司还积极投身于绿色生产领域,为推动电子行业的可持续发展做出了积极贡献。

和芯润德(CoreChips)公司的发展小趣事

在2010年代初,中国的集成电路市场仍被国际巨头所主导,技术壁垒高筑。然而,和芯润德科技有限公司(以下简称“和芯润德”)却勇敢地挑战了这一现状。公司创始人团队凭借对技术的深刻理解和不懈追求,成功研发出首款具有自主知识产权的以太网网络芯片,打破了美系技术的长期垄断。这一突破不仅为和芯润德赢得了市场的认可,也为中国集成电路产业赢得了宝贵的尊严。

EMC Component Group公司的发展小趣事

在技术创新的同时,和芯润德也积极拓展市场。公司凭借卓越的产品性能和优质的服务,成功打入了国内外多个高端市场。特别是在网络通信、智能终端等领域,和芯润德的产品得到了广泛应用。同时,公司还加强了与国际知名企业的合作,共同推动产业链的发展。

General Magnetics Inc公司的发展小趣事
在太阳能发电、风力发电等新能源领域,电子变压器也发挥着重要作用,用于将不稳定的电压转换为稳定的直流电或交流电。
General Diode Corp公司的发展小趣事
送丝不稳定或送丝中断。
ACEINNA公司的发展小趣事
负责向焊接区域提供CO2保护气体,防止空气中的氧气、氮气等对焊缝造成氧化、气孔等缺陷。

问答坊 | AI 解惑

高速模拟电路设计技术

高速模拟电路设计技术 看看就知道有不有用了!! 我觉得很可以的!!! …

查看全部问答>

请问超声波探头

现在学习需要一对超声波传感器,穿透约0.5cm宽度的液体并被检测到,请问什么样的超声波探头可以满足要求呢?谢谢!…

查看全部问答>

Functional.Verification.Coverage.Measurement.and.Analysis

Functional.Verification.Coverage.Measurement.and.Analysis…

查看全部问答>

想做蓝牙~~手头有CSR的BC4。。。想和BLUELAB去开发蓝牙

最近刚接触蓝牙。。。手头有一块CSR的BC4。。。想学习用CSR的 BLUELAB 去开发蓝牙。。。 现在用PSTool可以看到蓝牙固件里的信息,也可以修改波特率什么的。。。那并口应该就算是没问题了吧! 在BLUELAB里是不是可以通过并口跟蓝牙芯片连接。。。 ...…

查看全部问答>

关于kitl

发现wince有kitl的但是不知道怎么用 看网上的资料好像要加入代码 那我应该怎么加入kitl的代码 要是有直接支持kitl的bsp包就好了 我的平台是wince5.0 mini2440…

查看全部问答>

谁用过KEIL里的ISD51功能

我最近在琢磨ISD51功能,可是网上的资料有限,自己调试老是不通,我用的是STC的89C516RD+和飞利浦的89C51RD2兼容 KEIL里有个例子,我用的宏晶的下载板做实验,晶振18.432M,老提示我检查波特率,串口是否连接,可是我都侧过,没问题 DEBUG就是不 ...…

查看全部问答>

帮忙解释“用16位乘法指令完成32位无符号数乘法”的程序

看不懂“用16位乘法指令完成32位无符号数乘法”的程序,请路过的朋友能看得懂的帮忙解释每条指令所表达的含义。 ddata segment N1 db \'Please input a number:\',0dh,0ah,\'$\' N2 db \'Please input another number:\',0dh,0ah,\'$\' N3 d ...…

查看全部问答>

STM32USB主机写CBW

                                 现在主机发送CBW之后,往u盘写入数据时,设备会返回一个nak。我现在的解决方案是在发送完CBW之后,延时100ms,这样 ...…

查看全部问答>

转:C# 串口通信汇总

C#串口操作系列:http://blog.csdn.net/wuyazhe/article/category/695097 (精品,5个系列都有,感谢wuyazhe博主)两个完整例子:http://dldx.csdn.net/fd.php?i=35144030363803&s=210244c0411405405a6adaa4d8818c02http://bbs.csu.edu.cn/bbs/fo ...…

查看全部问答>

超级简单--电源设计入门工具---TI 的Webench

Webench Power Designer是Webench中最基础的设计工具,提供了创建电源或DC-DC转换器所需的全面设计和原型建立工具。WEBENCH电源设计工具让设计者在建立原型前解决开关电源供应器的设计问题,进而减少使用传统设计方法时的时间及麻烦。同时,WEBENCH ...…

查看全部问答>