本文共 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/