博客
关于我
基于8051实现的双倒计时器(Version1.0)
阅读量:362 次
发布时间:2019-03-05

本文共 4450 字,大约阅读时间需要 14 分钟。

 程序实现的功能:

1. 实验箱上电后, 两倒计时器都不显示, 且都处于暂停状态.

2. 向8051发送"Show countdown 1st.E"后, 第一个倒计时器显示秒数(初始为0, 然后从15开始倒计时).

3. 向8051发送"Show countdown 2nd.E"后, 第二个倒计时器显示秒数(初始为0, 然后从25开始倒计时).

4. 向8051发送"Start countdown 1st.E"后, 第一个倒计时器开始倒计时.

5. 向8051发送"Start countdown 2nd.E"后, 第二个倒计时器开始倒计时.

6. 向8051发送"Hide countdown 1st.E"后, 第一个倒计时器隐藏秒数.

7. 向8051发送"Hide countdown 2nd.E"后, 第二个倒计时器隐藏秒数.

8. 向8051发送"Stop countdown 1st.E"后, 第一个倒计时器暂停倒计时.

9. 向8051发送"Stop countdown 2nd.E"后, 第二个倒计时器暂停倒计时.

思路解析:

注: 通过tcount将一个大的刷新模块分为四个小的刷新模块, 通过t1、t2记录倒计时器秒数减少的情况.

#include 
#include
unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9char buf[30];//存储接收到的命令int tcount = 0;//记录经过的5ms区间段个数int sec1 = 15, sec2 = 25;//倒计时初始值int sec1_ = 0, sec2_ = 0;//实时变化int t1 = 0, t2 = 0;char en1 = 0, en2 = 0;//两计时器秒数显示标志, 默认为不显示char 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)//若倒计时器1启动 { //显示个位数(第一个倒计时器) P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮 if(en1 == 1)//若倒计时器1显示秒数 { P0 = DIG_CODE[sec1_ % 10]; } else { P0 = 0;//不显示数字 } t1 ++; } else//若倒计时器1暂停 { //显示个位数(第一个倒计时器) P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮 if(en1 == 1)//若倒计时器1显示秒数 { P0 = DIG_CODE[sec1_ % 10]; } else { P0 = 0;//不显示数字 } } tcount ++; } else if(tcount % 4 == 1) { if(en1_ == 1)//若倒计时器1启动 { //显示十位数(第一个倒计时器) P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮 if(en1 == 1)//若倒计时器1显示秒数 { P0 = DIG_CODE[sec1_ / 10]; } else { P0 = 0;//不显示数字 } t1 ++; } else//若倒计时器1暂停 { //显示十位数(第一个倒计时器) P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮 if(en1 == 1)//若倒计时器1显示秒数 { P0 = DIG_CODE[sec1_ / 10]; } else { P0 = 0;//不显示数字 } } tcount ++; } else if(tcount % 4 == 2) { if(en2_ == 1)//若倒计时器2启动 { //显示个位数(第二个倒计时器) P2 = 100 << 2;//P2 = 0001 0000 -> (P24, P23, P22) = (1, 0, 0) -> 右数第五个数字点亮 if(en2 == 1)//若倒计时器2显示秒数 { P0 = DIG_CODE[sec2_ % 10]; } else { P0 = 0;//不显示数字 } t2 ++; } else//若倒计时器2暂停 { //显示个位数(第二个倒计时器) P2 = 100 << 2;//P2 = 0001 0000 -> (P24, P23, P22) = (1, 0, 0) -> 右数第五个数字点亮 if(en2 == 1)//若倒计时器2显示秒数 { P0 = DIG_CODE[sec2_ % 10]; } else { P0 = 0;//不显示数字 } } tcount ++; } else if(tcount % 4 == 3) { if(en2_ == 1)//若倒计时器2启动 { //显示十位数(第二个倒计时器) P2 = 101 << 2;//P2 = 0001 0100 -> (P24, P23, P22) = (1, 0, 1) -> 右数第六个数字点亮 if(en2 == 1)//若倒计时器2显示秒数 { P0 = DIG_CODE[sec2_ / 10]; } else { P0 = 0;//不显示数字 } t2 ++; } else//若倒计时器2暂停 { //显示十位数(第二个倒计时器) P2 = 101 << 2;//P2 = 0001 0100 -> (P24, P23, P22) = (1, 0, 1) -> 右数第六个数字点亮 if(en2 == 1)//若倒计时器2显示秒数 { P0 = DIG_CODE[sec2_ / 10]; } else { P0 = 0;//不显示数字 } } tcount ++; } if(tcount == 200) { tcount = 0; } if(t1 == 100) { t1 = 0; if(-- sec1_ == -1) { sec1_ = sec1; } } if(t2 == 100) { t2 = 0; 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] = '\0';//手动添加字符串结束标志 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;//显示倒计时器1的秒数 } else if(strcmp(buf, "Hide countdown 1st.E") == 0)//Hide countdown 1st.E命令 { en1 = 0;//隐藏倒计时器1的秒数 } else if(strcmp(buf, "Show countdown 2nd.E") == 0)//Show countdown 2nd.E命令 { en2 = 1;//显示倒计时器2的秒数 } else if(strcmp(buf, "Hide countdown 2nd.E") == 0)//Hide countdown 2nd.E命令 { en2 = 0;//隐藏倒计时器2的秒数 } else if(strcmp(buf, "Start countdown 1st.E") == 0)//Start countdown 1st.E命令 { en1_ = 1;//倒计时器1开始倒计时 } else if(strcmp(buf, "Stop countdown 1st.E") == 0)//Stop countdown 1st.E命令 { en1_ = 0;//倒计时器1暂停倒计时 } else if(strcmp(buf, "Start countdown 2nd.E") == 0)//Start countdown 2nd.E命令 { en2_ = 1;//倒计时器2开始倒计时 } else if(strcmp(buf, "Stop countdown 2nd.E") == 0)//Stop countdown 2nd.E命令 { en2_ = 0;//倒计时器2暂停倒计时 } } } } return 0;}

 

转载地址:http://ejsg.baihongyu.com/

你可能感兴趣的文章
前端常用知识随手记
查看>>
11.2.6 时间值的小数秒
查看>>
11.2.7 日期和时间类型之间的转换
查看>>
redis 内存溢出_从数据存储的角度告诉你Redis为什么这么快!
查看>>
实例分析Facebook激励视频广告接入
查看>>
实例:使用OKGO下载网络压缩包资源,然后解压缩放在本地使用
查看>>
解决mybatis嵌套查询使用PageHelper分页不准确
查看>>
Redis源码分析(七)--- zipmap压缩图
查看>>
大规模集群自动化部署工具--Chef的安装部署
查看>>
HDFS源码分析(六)-----租约
查看>>
自定义Hive Sql Job分析工具
查看>>
聊聊HDFS RBF第二阶段的主要改进
查看>>
【MySQL】(九)触发器
查看>>
关于Altium Designer 09导出BOM表不能正确分类问题
查看>>
Oracle 11G环境配置
查看>>
【Spark】(六)Spark 运行流程
查看>>
【Python】(十二)IO 文件处理
查看>>
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
查看>>
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
查看>>
Java8新特性——并行流与顺序流
查看>>