历史上的今天
返回首页

历史上的今天

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

正在发生

2021年08月05日 | 基于8051实现的可启停/显示或隐藏时间/设定当前时间的时钟

2021-08-05 来源:eefocus

程序实现的功能:


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


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


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


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


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


6.向8051发送"hour:minute:second.E(hour、minute、second均为具体的数字, 且不足10 十位要添零补位)"后, 时钟按照给出的时间的整点开始计时.


#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;//隐藏当前时间

}

else if(buf[0] >= '0' && buf[0] <= '9' && buf[1] >= '0' && buf[1] <= '9'

&& buf[2] == ':' && buf[3] >= '0' && buf[3] <='9' && buf[4] >= '0' && buf[4] <= '9' 

&& buf[5] == ':' && buf[6] >= '0' && buf[6] <='9' && buf[7] >= '0' && buf[7] <= '9'

&& buf[8] == '.')

{

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

hour   = (buf[0] - 48) * 10 + (buf[1] - 48);

minute = (buf[3] - 48) * 10 + (buf[4] - 48);

second = (buf[6] - 48) * 10 + (buf[7] - 48);

t = 0;//重新设定时间后, 从整点开始计时

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

}

}

}

}

return 0;

}

 实验箱上电后,

启动时钟基本步骤: 

 1. 向8051发送"Start.E",

 

2. 向8051发送"Show.E", 

3. 时钟开始工作. 

 

推荐阅读

史海拾趣

BusBoard公司的发展小趣事

品质是企业的生命线。BusBoard公司深知这一点,因此从原材料采购到生产加工再到产品出厂,每一个环节都严格把控品质。公司建立了完善的品质管理体系,对每一道工序都进行严格的检验和测试。同时,公司还注重员工品质意识的培养和提升,确保每一个员工都能以高度的责任心对待自己的工作。这种对品质的执着追求使得BusBoard公司的产品在市场上赢得了良好的口碑。

芯佰微(Corebai)公司的发展小趣事

随着技术的不断发展,芯佰微逐步拓展了自己的产品线,覆盖了放大器、接口电路、电源管理、时间数字转换器、DAC数模转换、ADC模数转换等多个领域。同时,公司积极开拓国内外市场,与众多知名企业建立了合作关系,将产品广泛应用于手持移动终端、消费类电子产品、个人电脑及周边设备、网络通信设备、医疗设备、办公设备等多个领域。这些努力使得芯佰微的产品在市场上获得了广泛认可。

Exar公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Exar公司始终坚持以创新为核心竞争力。公司不断投入研发资金,加强技术创新和产品研发力度,推出了一系列具有自主知识产权的新产品。同时,Exar还积极关注行业发展趋势和市场动态,不断调整和优化产品线,以适应市场的变化和发展。在未来,Exar将继续坚持创新驱动的发展战略,努力成为电子行业的领军企业。

请注意,以上故事框架仅供参考,具体的故事内容需要根据实际情况进行补充和完善。

DURATOOL公司的发展小趣事

DURATOOL公司自成立以来,一直致力于电子工具的技术创新。在20世纪90年代,公司研发出了一款具有革命性的数字万用表,该产品在精确度、稳定性和操作便捷性方面均大幅超越当时的市场主流产品。这一创新不仅为DURATOOL公司赢得了大量忠实用户,也为其在电子测量工具市场树立了技术领先的形象。随后,DURATOOL公司不断加大研发投入,推出了一系列具有竞争力的新产品,逐步巩固了其在电子工具行业的领先地位。

Base Two (2) Systems公司的发展小趣事

Base Two (2) Systems公司自创立之初,便以技术创新为核心竞争力。在创始团队的带领下,公司研发团队不断攻克技术难关,成功研发出一系列具有领先水平的电子产品。这些产品不仅性能卓越,而且具有广泛的应用前景,为公司在市场上赢得了良好的口碑。

国兴(GOODSKY)公司的发展小趣事

随着公司业务的不断发展壮大,Base Two (2) Systems开始实施国际化战略。公司积极拓展海外市场,与多个国家和地区的合作伙伴建立了合作关系。同时,公司还在海外设立了研发中心和生产基地,以便更好地服务全球客户。这一国际化战略的实施,使得公司的业务范围更加广泛,也为公司的未来发展打开了新的篇章。

这五个故事展示了Base Two (2) Systems在电子行业中的发展历程和取得的成就。通过技术创新、市场扩张、研发投入、品质管理和国际化战略的实施,公司逐渐发展成为电子行业中的佼佼者,为行业的发展做出了积极的贡献。

问答坊 | AI 解惑

编译DirectDrawCreateEx 出错!!请高手指点!!

编译时 DirectDrawCreateEx 有问题,代码如下: if( FAILED( dirdr = DirectDrawCreateEx( NULL, (VOID**)&m_pDD,IID_IDirectDraw7, NULL ) ) )                 return FALSE; 连接库有: winmm.lib dx ...…

查看全部问答>

请问为什么CPU,内存,硬盘的性能参数在不断飙升?

比如以前,我们说微处理器的出现是因为大规模集成电路的使用,那么请问最近这十年的性能的飙升是因为什么? 像内存,为什么以前只有64KB那么多,一下子飙升了上百倍,上千倍,而且体积还是那么大? …

查看全部问答>

DM900A数据接受问题

有谁有DM900A数据接受方面的程序,代码资料可以提供下嘛?email:jsmeteor@126.com…

查看全部问答>

向达人请教一个UBOOT(i386)的简单问题~~

汇编不好,看UBOOT刚启动就困住了,好几天了都还没整明白。 在汇编语言子论坛里发过,但没有什么同学。来这里试试。 ================start16.s================ #define BOOT_SEG        0xffff0000      &n ...…

查看全部问答>

STM32怎么开始学?

请推荐个开发板版本,我去赛格找找告知下大概价位…

查看全部问答>

软件看门狗程序中reboot()功能实现不了

程序中的一块要实现软件看门狗功能,中间到reboot(0x00)并不能实现目标机重启,求高手指点~~~ /*includes*/ #include \"vxWorks.h\" #include \"logLib.h\" #include \"math.h\" #include \"stdioLib.h\" #include \"stdio.h\" #incl ...…

查看全部问答>

高手来看看这个变容二极管调频电路

本电路是在改进型并联二极管震荡电路的基础上设计的,未加变容二极管之前,电路可以起振。但加上变容二极管后,测得输出信号仅为调制信号!!那个哭啊……还请高手指点!!上图………

查看全部问答>

前一次中断程序没执行完下一次又来申请,怎么办?

M128中断时,前一次的中断没有执行完,下一次的中断申请又到来。这时候,处理器是放弃下次的中断申请去执行未执行完的中断程序,还是放弃未执行完的程序,去响应下次的中断申请?…

查看全部问答>

dds9850 dds资料大全 dds程序 dds原理图

本帖最后由 paulhyde 于 2014-9-15 02:52 编辑  …

查看全部问答>

MSP430+LCD12864十万火急,跪求帮助,万分感谢!!!

快被弄疯了,真心求助,跪求别水贴,有什么不清楚的就问,我在线等,挺急的!谢过!!! 硬件:MSP430G2553+Lcd12864R,单片机由电脑供电,12864外接五负电源。 环境:IAR For MSP430 问题:下载成功无报错,但无显示 具体请款如下: 1、全部 ...…

查看全部问答>