博客
关于我
基于8051实现的双倒计时器(Version1.0)
阅读量:361 次
发布时间: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/

你可能感兴趣的文章
网络编程一 tcp的一些信号处理
查看>>
简单Makefile的编写
查看>>
使用BAT批处理 匹配查找指定文件夹,并在当文件夹下创建空文件
查看>>
wxpython的Hello,World代码探索
查看>>
IDEA出现错误:找不到或无法加载主类 io.xxx.XXXApplication
查看>>
【数字图像处理】OpenCV3 学习笔记
查看>>
【单片机开发】智能小车工程(经验总结)
查看>>
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
查看>>
【单片机开发】基于stm32的掌上游戏机设计(终章)
查看>>
PHP编译步骤参考和FASTCGI方式(PHP-FPM)配置PHP
查看>>
iptables NAT表之SNAT、DNAT、REDIRECT介绍
查看>>
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
查看>>
web服务器处理网络请求过程、I/O与I/O模型介绍、select、poll、epoll介绍
查看>>
【Numpy学习】np.count_nonzero()用法解析
查看>>
Scala集合-数组、元组
查看>>
Flink Standalone集群安装和部署
查看>>
JAVA网络爬虫01-http client爬取网络内容
查看>>
04 程序流程控制
查看>>
java并发编程(1)
查看>>
C++&&STL
查看>>