历史上的今天
返回首页

历史上的今天

今天是:2025年08月05日(星期二)

正在发生

2021年08月05日 | 基于8051实现的可启停/显示或隐藏时间的电子时钟(Version1.2)

2021-08-05 来源:eefocus

程序实现的功能:


1. 实验箱上电后, 不显示当前时间.


2. 向8051发送"Show.E"后, 显示当前时间.


3. 向8051发送"Hide.E"后, 隐藏当前时间.


4. 向8051发送"Start.E"后, 时钟开始计时.


5. 向8051发送"Stop.E"后, 时钟停止计时(若当前处于"Show"状态, 则显示停止计时前的时间).


#include

 

#include

 

unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9

 

char buf[30];//存放收到的数据

 

int tcount = 0;//记录经过的2ms区间段个数

 

int t = 0;

 

int hour = 23, minute = 59, second = 55;

 

char en = 0;//电子时钟显示表示, 默认为不显示

 

char en_ = 0;//电子时钟启停标志, 默认为停止

 

void clear(int i)//清屏函数

{

P2 = i << 2;

P0 = 0;

}

 

void T0_INT() interrupt 1 //timer0中断, 每2ms触发一次

{

TR0 = 0;//关闭timer0

TH0 = 0xF8;

TL0 = 0x30;//65536 - 2000 = 63536 = F830H

if(tcount % 6 == 0)

{

//秒数个位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 0;//右数第一个数字亮

P0 = DIG_CODE[second % 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 0;

P0 = DIG_CODE[second % 10];

}

else//时钟不显示

{

clear(tcount % 6);;

}

tcount ++;

}

}

else if(tcount % 6 == 1)

{

//秒数十位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 1 << 2;//右数第二个数字亮

P0 = DIG_CODE[second / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 1 << 2;

P0 = DIG_CODE[second / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

tcount ++;

}

}

else if(tcount % 6 == 2)

{

//分钟个位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 2 << 2;//右数第三个数字亮

P0 = DIG_CODE[minute % 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 2 << 2;

P0 = DIG_CODE[minute % 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

tcount ++;

}

}

else if(tcount % 6 == 3)

{

//分钟十位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 3 << 2;//右数第四个数字亮

P0 = DIG_CODE[minute / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 3 << 2;

P0 = DIG_CODE[minute / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

tcount ++;

}

}

else if(tcount % 6 == 4)

{

//小时个位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 4 << 2;//右数第二个数字亮

P0 = DIG_CODE[hour % 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 4 << 2;

P0 = DIG_CODE[hour % 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

tcount ++;

}

}

else if(tcount % 6 == 5)

{

//小时十位

if(en_ == 1)//时钟启动状态

{

if(en == 1)//时钟显示

{

P2 = 5 << 2;//右数第二个数字亮

P0 = DIG_CODE[hour / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

t ++;

tcount ++;

}

else//时钟暂停状态

{

if(en == 1)//时钟显示

{

P2 = 5 << 2;

P0 = DIG_CODE[hour / 10];

}

else//时钟不显示

{

clear(tcount % 6);

}

tcount ++;

}

}

if(tcount == 500)

{

tcount = 0;

}

if(t == 500)//2ms * 500 = 1000ms = 1s -> 1s时间到

{

t = 0;

second ++;

if(second == 60)

{

second = 0;

minute ++;

if(minute == 60)

{

minute = 0;

hour ++;

if(hour == 24)

{

hour = 0;

}

}

}

}

TR0 = 1;//重新开启timer0

}

 

int main()

{

int i = 0;

clear(7);

TMOD = 0x21;

SCON = 0x50;//设置串行通信格式

TH0 = 0xF8;

TL0 = 0x30;

TH1 = 0xE6;

TL1 = 0xE6;

IE = 0x82;

TR0 = 1;//开启timer0

TR1 = 1;//开启timer1以产生波特率

while(1)

{

if(RI == 1)//收到数据

{

RI = 0;

buf[i ++] = SBUF;//接收串口发来的数据

buf[i] = '';//手动添加字符串结束标志

if(i == 29)//防止数组访问越界

{

i = 0;

}

if(buf[i - 1] == 'E')//到达结尾

{

i = 0;

if(strcmp(buf, "Start.E") == 0)

{

en_ = 1;//启动时钟计时

}

else if(strcmp(buf, "Stop.E") == 0)

{

en_ = 0;//暂停时钟计时

}

else if(strcmp(buf, "Show.E") == 0)

{

en = 1;//显示当前时间

}

else if(strcmp(buf, "Hide.E") == 0)

{

en = 0;//隐藏当前时间

}

}

}

}

return 0;

}


推荐阅读

史海拾趣

谷峰(GOFORD)公司的发展小趣事

为了进一步提升市场竞争力,GStek积极寻求与产业链上下游企业的战略合作。公司与知名功率元件供应商NIKO-SEM微电子集团建立了长期稳定的合作关系,共同推动电源管理技术的创新与发展。此外,GStek还积极整合产业链资源,优化供应链管理,确保产品质量的稳定性和供货的及时性。这些措施不仅提升了GStek的综合竞争力,也为其未来的发展奠定了坚实的基础。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

为了进一步提升市场竞争力,GStek积极寻求与产业链上下游企业的战略合作。公司与知名功率元件供应商NIKO-SEM微电子集团建立了长期稳定的合作关系,共同推动电源管理技术的创新与发展。此外,GStek还积极整合产业链资源,优化供应链管理,确保产品质量的稳定性和供货的及时性。这些措施不仅提升了GStek的综合竞争力,也为其未来的发展奠定了坚实的基础。

Goodwork Semiconductor ( GW )公司的发展小趣事
在某些对电压稳定性要求较高的家用电器中(如高精度测量仪器、精密医疗设备等),可控硅交流稳压器也能得到应用。
华宇创公司的发展小趣事

为了进一步扩大市场份额,华宇创开始积极拓展国内外市场。公司参加了多场国际电子展和博览会,与全球各地的客户建立了广泛的联系。同时,华宇创还与国际知名电子企业建立了战略合作关系,共同研发新技术、新产品。这些国际合作不仅为华宇创带来了更多的商业机会,也提升了公司在国际市场的地位和影响力。

艾迈斯(AMASS)公司的发展小趣事

随着电子行业的快速发展,艾迈斯(AMASS)公司意识到只有不断创新才能保持领先地位。为此,公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,艾迈斯成功研发出了多款具有创新性的连接器产品,其中包括高性能、高安全性的智能设备动力连接器。这些产品的推出不仅提升了公司的技术实力和市场竞争力,也为整个行业的发展带来了积极的影响。

FOTEK公司的发展小趣事

福禄克并未止步于传统电子测试工具领域,而是积极探索新的增长点。2005年,公司推出了一系列室内空气质量(IAQ)测试工具,旨在为HVAC、建筑物维修和IAQ专业人员提供综合的精密仪器产品组合。这些产品凭借其精确性、可靠性和易用性,迅速获得了市场的认可。此后,福禄克进一步拓展至生物医学领域,推出了电气安全性测试仪、病患模拟器等先进设备,在生物医学测试和模拟产品领域取得了领先地位。

问答坊 | AI 解惑

关于GetModuleFileName一直返回NULL的问题

下面这个函数目的是获取当前运行的应用程序的目录,但使用GetModuleFileName返回的总是0.不知道为何。 bool GetCurrentPath(LPTSTR szPath)   {           HMODULE handle = GetModuleHandle(NULL); &nbs ...…

查看全部问答>

请教两个问题

1、Ndis库没有向nids微端口驱动的接口函数(如初始化函数等)下发irp,那代码中的irp是从哪里来的?ndis微端口驱动自己组建的吗? 2、如何看到ndis微端口驱动中irp中包含的是什么板侧的指令?如断链指令…

查看全部问答>

3G工程师成为大学毕业生择业首选

中国3G时代即将到来,社会对3G嵌入式软件人才的渴求使3G人才已经成为业界关注“3G软环境”的焦点之一。目前,我国的3G核心人才仅有不足万人,而且基本上都被几大运营商和设备厂商所掌握。广大手持端设备制造商所急需的嵌入式开发人才、软件开发商所 ...…

查看全部问答>

大家在做网络设计时候一般是用哪款工具来调试网络程序的?

准备用44b0来学习网络通讯软件编程序. 好像有一款工具是专门探测电脑网络数据.就象Bus Hound看USB数据一样. 但不记得这款软件的名称. 大家在做网络设计时候一般是用哪款工具来调试网络程序的?…

查看全部问答>

大虾们推荐一本关于制版方面经典的书呗?

不是那种进阶版的;就是普通的入门提高级的。讲解环境最好是DXP,或者往上版本的。谢过了。…

查看全部问答>

GPIO的输入中断(上升沿和下降沿触发)能区分上升沿和下降

                                 GPIO的输入中断(上升沿和下降沿触发)能区分上升沿和下降沿吗?…

查看全部问答>

STM8勘误表去那找,谢谢(最好直接给出链接)

                                 RT…

查看全部问答>

有关长整形(long int)?

今天编程时发现用long int 定义的变量当大于 32768时就会益处!难道iar c语言中没有真正的long int吗??…

查看全部问答>

片子单向可控硅被烧的原因

日光灯用到一个白炽灯声控开关上,为什么会把片子单向可控硅都烧了?求答案。…

查看全部问答>