单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..

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)

联系客服:779662525#qq.com(#替换为@)