历史上的今天
今天是:2025年08月05日(星期二)
2021年08月05日 | 基于8051实现的可启停/显示或隐藏时间/设定当前时间的时钟
2021-08-05 来源:eefocus
程序实现的功能:
1. 实验箱上电后, 不显示当前时间.
2. 向8051发送"Show.E"后, 显示当前时间.
3. 向8051发送"Hide.E"后, 隐藏当前时间.
4. 向8051发送"Start.E"后, 时钟开始计时.
5. 向8051发送"Stop.E"后, 时钟停止计时(若当前处于"Show"状态, 则显示停止计时前的时间).
6.向8051发送"hour:minute:second.E(hour、minute、second均为具体的数字, 且不足10 十位要添零补位)"后, 时钟按照给出的时间的整点开始计时.
#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;//记录经过的2ms区间段个数 int t = 0; int hour = 23, minute = 59, second = 55; char en = 0;//电子时钟显示表示, 默认为不显示 char en_ = 0;//电子时钟启停标志, 默认为停止 void clear(int i)//清屏函数 { P2 = i << 2; P0 = 0; } void T0_INT() interrupt 1 //timer0中断, 每2ms触发一次 { TR0 = 0;//关闭timer0 TH0 = 0xF8; TL0 = 0x30;//65536 - 2000 = 63536 = F830H if(tcount % 6 == 0) { //秒数个位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 0;//右数第一个数字亮 P0 = DIG_CODE[second % 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 0; P0 = DIG_CODE[second % 10]; } else//时钟不显示 { clear(tcount % 6);; } tcount ++; } } else if(tcount % 6 == 1) { //秒数十位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 1 << 2;//右数第二个数字亮 P0 = DIG_CODE[second / 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 1 << 2; P0 = DIG_CODE[second / 10]; } else//时钟不显示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 2) { //分钟个位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 2 << 2;//右数第三个数字亮 P0 = DIG_CODE[minute % 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 2 << 2; P0 = DIG_CODE[minute % 10]; } else//时钟不显示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 3) { //分钟十位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 3 << 2;//右数第四个数字亮 P0 = DIG_CODE[minute / 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 3 << 2; P0 = DIG_CODE[minute / 10]; } else//时钟不显示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 4) { //小时个位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 4 << 2;//右数第二个数字亮 P0 = DIG_CODE[hour % 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 4 << 2; P0 = DIG_CODE[hour % 10]; } else//时钟不显示 { clear(tcount % 6); } tcount ++; } } else if(tcount % 6 == 5) { //小时十位 if(en_ == 1)//时钟启动状态 { if(en == 1)//时钟显示 { P2 = 5 << 2;//右数第二个数字亮 P0 = DIG_CODE[hour / 10]; } else//时钟不显示 { clear(tcount % 6); } t ++; tcount ++; } else//时钟暂停状态 { if(en == 1)//时钟显示 { P2 = 5 << 2; P0 = DIG_CODE[hour / 10]; } else//时钟不显示 { clear(tcount % 6); } tcount ++; } } if(tcount == 500) { tcount = 0; } if(t == 500)//2ms * 500 = 1000ms = 1s -> 1s时间到 { t = 0; second ++; if(second == 60) { second = 0; minute ++; if(minute == 60) { minute = 0; hour ++; if(hour == 24) { hour = 0; } } } } TR0 = 1;//重新开启timer0 } int main() { int i = 0; clear(7); TMOD = 0x21; SCON = 0x50;//设置串行通信格式 TH0 = 0xF8; TL0 = 0x30; TH1 = 0xE6; TL1 = 0xE6; IE = 0x82; TR0 = 1;//开启timer0 TR1 = 1;//开启timer1以产生波特率 while(1) { if(RI == 1)//收到数据 { RI = 0; buf[i ++] = SBUF;//接收串口发来的数据 buf[i] = '




