
基于8051实现的双倒计时器(Version1.0)
发布日期:2021-05-08 01:18:20
浏览次数:12
分类:精选文章
本文共 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;}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月06日 06时43分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
从浏览器输入网址到服务器返回经历的过程
2021-05-08
CPU过载内存溢出分析
2021-05-08
解决Genymotion无法拖拽的问题
2021-05-08
中国石油大学《计算机文化基础》在线考试(客观题)
2021-05-08
中国石油大学《 管理心理学(行政管理专业禁选)》在线考试
2021-05-08
机器学习(numpy/matplotlib/scipy)学习笔记
2021-05-08
HTML CSS JS 特殊字符表
2021-05-08
codeforces The Eternal Immortality 题解
2021-05-08
蓝桥杯 历届试题 幸运数 (堆+DFS)
2021-05-08
better-sroll 下拉刷新,下拉加载vue.js参考代码
2021-05-08
微信js-sdk使用简述(分享,扫码功能等)
2021-05-08
selenium 的介绍和爬取 jd数据
2021-05-08
python-selenium优化方案
2021-05-08
【分享-免费OCR工具 在线+移动端】免费在线图片多国文字识别
2021-05-08
服务器 centos 系统漏洞快速修复简易方法
2021-05-08
docker配置centos+宝塔面板+phpstorm-xdebug记录
2021-05-08
【分享-一键在线抠图】在线免费去除图片背景
2021-05-08
Thinkphp3.2.3 多图上传,同类型只能上传一张问题
2021-05-08