历史上的今天
返回首页

历史上的今天

今天是:2025年08月04日(星期一)

正在发生

2021年08月04日 | 可显示或隐藏秒数的两不同周期倒计时器(基于8051)

2021-08-04 来源:eefocus

程序实现的功能:


1. 实验箱上电后, 两计时器即开始计时, 但不显示.


2. 若向8051发送"显示秒数"命令,  则指定的某个倒计时器显示秒数.


3. 若向8051发送"隐藏秒数"命令, 则指定的某个倒计时器隐藏秒数.


#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;//记录经过的5ms区间段个数

 

int sec1 = 15, sec2 = 25;//倒计时初始值

 

int sec1_ = 0, sec2_ = 0;//实时变化

 

int en1 = 0, en2 = 0;//两计时器秒数显示标志, 默认为不显示

 

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

{

TR0 = 0;//关闭timer0

TH0 = 0xEC;

TL0 = 0x78;//65536 - 5000 = 60536

if(tcount % 4 == 0)

{

if(en1 == 1)

{

//显示个位数(第一个倒计时器)

P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮

P0 = DIG_CODE[sec1_ % 10];

}

tcount ++;

}

else if(tcount % 4 == 1)

{

if(en1 == 1)

{

//显示十位数(第一个倒计时器)

P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮

P0 = DIG_CODE[sec1_ / 10];

}

tcount ++;

}

else if(tcount % 4 == 2)

{

if(en2 == 1)

{

//显示个位数(第二个倒计时器)

P2 = 100 << 2;//P2 = 0001 0000 -> (P24, P23, P22) = (1, 0, 0) -> 右数第五个数字点亮

P0 = DIG_CODE[sec2_ % 10];

}

tcount ++;

}

else if(tcount % 4 == 3)

{

if(en2 == 1)

{

//显示十位数(第二个倒计时器)

P2 = 101 << 2;//P2 = 0001 0100 -> (P24, P23, P22) = (1, 0, 1) -> 右数第六个数字点亮

P0 = DIG_CODE[sec2_ / 10];

}

tcount ++;

}

if(tcount == 200)

{

tcount = 0;

if(-- sec1_ == -1)

{

sec1_ = sec1;

}

if(-- sec2_ == -1)

{

sec2_ = sec2;

}

}

TR0 = 1;//重新开启timer0

}

 

int main()

{

int i = 0;

P2 = 111 << 2;//选中左数第一个数字

P0 = 0;//数码管灭

TMOD = 0x21;

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

TH0 = 0xEC;

TL0 = 0x78;//65536 - 5000 = 60536 = EC78H

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, "Show countdown 1st.E") == 0)//Show countdown 1st.E命令

{

en1 = 1;

}

else if(strcmp(buf, "Hide countdown 1st.E") == 0)//Hide countdown 1st.E命令

{

en1 = 0;

}

else if(strcmp(buf, "Show countdown 2nd.E") == 0)//Show countdown 2nd.E命令

{

en2 = 1;

}

else if(strcmp(buf, "Hide countdown 2nd.E") == 0)//Hide countdown 2nd.E命令

{

en2 = 0;

}

}

}

}

return 0;

}


推荐阅读

史海拾趣

EFINIX公司的发展小趣事

为了加速Quantum™可编程加速器技术的商业化进程,EFINIX公司与中芯国际集成电路制造有限公司展开合作。中芯国际是世界领先的集成电路晶圆代工企业之一,其先进的制造能力为EFINIX公司提供了强有力的支持。双方合作仅用了不到六个月的时间,就成功交付了首批Quantum™可编程加速器产品样本,创造了行业内的里程碑。

EDDING公司的发展小趣事

在2000年代初,ECLIPSE公司是一家专注于企业级软件开发的公司。公司内部的一个小型团队开发了一个名为“Eclipse”的集成开发环境(IDE),用于提高内部项目的开发效率。随着Eclipse的内部使用越来越广泛,公司高层意识到其巨大的潜力,决定将Eclipse开源,并成立专门的Eclipse部门来管理和推广这一项目。通过开放源代码和社区合作,Eclipse迅速吸引了全球开发者的关注,并逐渐成长为开源开发领域的领军者。

AURORA公司的发展小趣事

AURORA公司一直致力于提升自动驾驶技术的安全性和可靠性。通过不断研发和创新,AURORA在自动驾驶算法、传感器融合、数据处理等方面取得了显著进展。公司的技术团队不断攻克技术难题,推动自动驾驶技术向更高等级迈进。同时,AURORA还积极与高校和研究机构合作,共同推动自动驾驶技术的研发和应用。

Dymec公司的发展小趣事

随着业务的不断拓展,Dymec公司逐渐意识到品质对于品牌的重要性。公司决定加大对产品质量的投入,从原材料采购到生产流程,再到质量检测,每一个环节都严格把控。这种对品质的执着追求使得Dymec公司的产品在市场上获得了良好的口碑,公司也逐渐成为了电子连接器行业的知名品牌。

Eby Company公司的发展小趣事

eBay的成功不仅仅局限于美国市场。从早期开始,eBay就积极寻求全球化扩张。通过与不同国家和地区的合作伙伴建立合作关系,eBay逐步进入了欧洲、亚洲和拉丁美洲等市场。这种全球化战略使eBay能够接触到更广泛的用户群体,进一步巩固了其在全球在线拍卖市场的领先地位。

Good Will Instrument Co., Ltd.公司的发展小趣事

为了提供更好的物流服务,eBay推出了国际运送计划(eBay International Shipping)。该计划允许卖家将来自同一订单的多件物品合并在一个包裹中运送,从而减少了买家支付的运费。这一举措不仅提高了物流效率,也增加了买家的购买意愿。eBay还与其他物流公司合作,提供更快捷、更可靠的配送服务。

问答坊 | AI 解惑

2008电子设计大赛集结号(最新策划2008.8.5)

本帖最后由 paulhyde 于 2014-9-15 09:48 编辑 你参加过电子设计竞赛吗?你知道每年都有哪些电子设计竞赛能让你大显身手吗?在此,总结出2008年度一些半导体厂商举办的电子竞赛,你可以更全面的了解各个竞赛围绕的技术、竞赛日程、奖项设置等信息 ...…

查看全部问答>

关于全国电子设计竞赛和出国

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 9月的电子大赛,EE们应该都知道吧? 对出国有没有用呢?不知道是不是该花时间在这个方面?  …

查看全部问答>

求职面试,不被招聘官喜欢的几种人

我们知道,求职面试,招聘者比较看重应试人员的某些优点。如果你具有这些优点,那就可能捷足先登,有被优先择用的可能;用样,招聘者也比较关注应聘者的某些缺点,如果你具有这些缺点,那就可能名落孙山,有被淘汰出局的危险。所以,求职者应该了解 ...…

查看全部问答>

S3C2410技术交流QQ群

S3C2410技术交流QQ群68766459…

查看全部问答>

uclinux jedce_probe探测ID,变成flash的内容

Flash:两片SST39VF3201 ,一片挂CS0:地址0x80000000 一片挂CS1:地址0x81000000 使用jecdec探测 static struct map_info lpc24xx_map[2] = { {     .name =        \"LPC24XX\",     .bankw ...…

查看全部问答>

转发:请教:Linux驱动程序中的llseek函数

在Linux下写了一个存储器的驱动程序,需要对这个存储器进行片内寻址(片内地址为16位,分为高8位和低8位两段),用llseek函数实现。 static loff_t   llseek (struct  file* mfile,  loff_t  offset,&nbs ...…

查看全部问答>

USB键盘驱动的问题

在Windows XP下,我插入USB键盘后看到系统在设备管理器中变化了两个,一个是键盘下的KeyBoard Device,一个是人体输入设备下的USB人体输入设备,请问这两个相互之间是怎样联系的啊?? 再者:我在写一个键盘的驱动程序,要求是读取USB键盘数据 ...…

查看全部问答>

evc下怎么编写扩展DLL

我在VC60下面做了个扩展的DLL。VC下一直用得挺好。 但现在要把那个程序移植到EVC下面,界面部分已经移植好了,现在就差这个DLL了, 我按照VC60下面的方法做,不行。 哪位大侠知道EVC下怎么做扩展DLL。…

查看全部问答>

WINCE动态调用DLL的问题

刚接触WINCE不久,用的是EVC4和自带的模拟器,程序需要动态调用DLL,LoadLibrary(TEXT(\"\\WINDOWS\\XX.dll\"))返回NULL,可能是路径不正确,请指导下。 XX.dll已用Remote File Viewer导至模拟器\\WINDOWS目录下 EVC生成的EXE文件是在模拟器根目 ...…

查看全部问答>

MTK异常重启分析工具

基于ARM体系,能够自动检测并且记录异常发生位置(非打印trace),并能分析出调用函数栈,误差率…

查看全部问答>