if(dispbuf[pos]==0)dispbuf[pos]=9; else dispbuf[pos]--; } }
2、秒表模式下,无法很好地区分当前计时所达到的具体数值。在秒的个位数位子设置一个小数点,使秒表的显示更加直观。
修改后代码如下:
在程序开始处,添加如下代码: unsigned char code segtab_dot[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 数点的数码管代码
在void t0int(void) interrupt 1 using 1之中添加如下代码: if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句 {
P0=segtab_dot[dispbuf[dispindex]]; } else {
P0=segtab[dispbuf[dispindex]]; }
//带小
3、在秒表运行一遍后,进入其他模式操作完毕,再次进入秒表模式下发现秒表无法清零。检查代码后发现,在闹钟模式下,进入秒表模式时,未对秒表清零。
修改后代码如下:
附完整实验代码:
/*********************************************************************** 基于单片机的数字时钟 功能:时钟、闹钟、秒表
模式0:时钟显示模式-分、秒
模式0下,数码管显示时钟时间-分、秒。
按键说明:
按键1:选择下一模式。
模式1:时钟显示模式-时、分
模式1下,数码管显示时钟时间-时、分。
按键说明:
按键1:选择下一模式。
模式2:时钟调整模式
模式2下,调整时钟时间,仅调整时、分时间。
按键说明:
按键1:选择下一模式。
按键2:增加选中数码管的数值。
if(keyval==0x7f)//1号按键 模式 进入秒表模式 {
mode=4; old_ss=0; old_ms=0;
miaobiao_ss=old_ss; miaobiao_ms=old_ms;
dispbuf[0]=miaobiao_ss/10; dispbuf[1]=miaobiao_ss; dispbuf[2]=miaobiao_ms/10; dispbuf[3]=miaobiao_ms; clocksing=0; }
按键3:减少选中数码管的数值。
按键4:移位键,按键选择下一数码管。
模式3:闹钟模式
模式3下,设置闹铃时间之后,等时钟到达相应时间,发出铃声。
按键说明:
按键1:选择下一模式。
按键2:增加选中数码管的数值。 按键3:减少选中数码管的数值。
按键4:移位键,按键选择下一数码管。
按键5:设置闹铃时间后,按键确认,数码管显示当前时钟时间。
模式4:秒表模式
模式4为秒表模式,可记录0-59秒。最小时间单位为0.01秒。
按键说明:
按键1:选择下一模式。 按键2:清除秒表当前数值。 按键3:清除秒表当前数值。 按键4:开始、暂停秒表。
***********************************************************************/
#include
unsigned char dispbuf[4]={0,0,0,0}; unsigned char code segtab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的数码管代码
unsigned char code segtab_dot[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的数码管代码
unsigned char code bittab[]={0xfe,0xfd,0xfb,0xf7}; unsigned char dispindex; unsigned char mode; unsigned char pos; unsigned char keyval;
unsigned char hh,mm,ss;
unsigned char miaobiao_ms=0,miaobiao_ss=0; //秒表 unsigned char old_ms,old_ss; //保存秒表时间
unsigned char clock_hh,clock_mm; //用于存放所设闹钟时间
unsigned int clock_shanshuo; //用于控制闹钟调整时间时是否闪烁 0:闪烁 1:不闪烁
sbit clocksing=P1^5; //闹钟所用蜂鸣器
unsigned int cnt; //用于10ms转1s计数
unsigned char cnt1; //用于10ms转0.5s处计数(用于闪烁) unsigned char cnt2; //用于秒表处计时
unsigned char keyscan(void); void delay(unsigned int t); void keypro(void);
bit flash;
/******************主函数******************/ void main(void) {
TMOD=0x11;
TH0=(0-2000)/256; TL0=(0-2000)%6; ET0=1; TR0=1;
TH1=(0-2000)/256; TL1=(0-2000)%6; ET1=1;
TR1=0; //秒表 先不开
EA=1;
mode=0; hh=02; mm=03; ss=15;
while(1) {
if(mode==3) {
if(hh==clock_hh) {
if(mm==clock_mm)