} } display();
void timer1(void) interrupt 3 using 1 { TH1=0x3c; /* 100ms定时常数 */ TL1=0xb0; count++; /* 中断次数加1*/ if(count!=5) /* 判到10次(1s)否,不到直接返回 */ return; ss=!ss; /* ss闪烁标志求反 */ count=0; } void settime(void) { uchar i; while(S1); /* 等待S1键开始设置 */ for(i=0;i<4;i++) delay20ms(); /* 延时去抖动 */ while(S1); setflag=0; ss=0; hh=1; /* 设置当前位标志 */
TR1=1; /* 启动定时器T1 */ ET1=1; /* 允许T1溢出中断 */ void settime(void) { uchar i; while(S1); /* 等待S1键开始设置 */ for(i=0;i<4;i++) delay20ms(); /* 延时去抖动 */ while(S1); setflag=0; ss=0; hh=1; /* 设置当前位标志 */
TR1=1; /* 启动定时器T1 */ ET1=1; /* 允许T1溢出中断 */ break; case 0x04: buf[2]=0x0b; break; case 0x08: buf[3]=0x0b; break; } } /****************************************************/ display(); if(S1) goto sett_1; for(i=0;i<4;i++) delay20ms(); /* 延时去抖动 */ if(S1) goto sett_1; if(ml) { TR1=0; /* 关闭定时器T1 */ ET1=0; /* 禁止T1溢出中断 */ buf[0]=hourh; buf[1]=hourl; buf[2]=minuh; buf[3]=minul; return; /* 如果当前编辑的份低位,则按S1键结束设定 */ } setflag<<=1; /* 当前位右移(标志左移1位) */ continue; sett_1: if(S2) continue; for(i=0;i<4;i++) delay20ms(); /* 延时去抖动 */
if(S2) continue; if(!hh) goto sett_2; { hourh++; /* 时高位加1处理 */ if(hourh!=2) continue; hourh=0; /* 时高位只能是0,1 */ continue; } sett_2: if(!hl) goto sett_3; { hourl++;/* 时低位加1处理,高位为0,可以是0~9,否则,只能0~2 */
if(hourh) goto sett_20; if(hourl==10) goto sett_21; continue; sett_21: hourl=0; continue; sett_20: if(hourl==3) goto sett_22; continue; sett_22: hourl=0; continue; }
sett_3: if(!mh) goto sett_4; { minuh++; /* 分高位加1处理,只能是0~5 */ if(minuh==6) goto sett_30; continue; sett_30: minuh=0; continue; } sett_4: minul++; /* 分低位加1处理,只能是0~9 */ if(minul==10) goto sett_40; continue; sett_40: minul=0; continue;
}
} #include "REG51.H" #define uchar unsigned char #define PSEG 0x30 /* P.的段码 */
/* 0~9和P,暗的的段码(共阳数码管) */ uchar code seg[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x30,0xff}; /***************************************************************** ;74LS164的3 4 5 6 10 11 12 13 对应数码管的A,B,C,D,E,F,G,DP DB 0C0h,0F9H,0A4H,0B0H,99H ; DB 92H,82H,0F8H,80H,90H *****************************************************************/
/* 输入输出定义 */ sbit DISPCON =P3^2; /* 显示控制 */ sbit S1 =P1^3; /* 设置键 */ sbit S2 =P1^2; /* 数字+1键 */ sbit L1 =P1^7; /* L1,L2构成秒指示":" */ sbit L2 =P1^6;
/* 全局变量定义 */ uchar buf[4]; /* 显示缓冲区 */ uchar hourh; /* BCD时钟各位 */ uchar hourl;
uchar minuh; uchar minul; uchar second; /* 秒变量 */
uchar count; /* 溢出中断计数器 */ uchar bdata setflag; /* 设置用标志字节 */ uchar bdata uflag; /* 通用标志字节 */
/* 位变量定义 */ /* 以下4个位变量在setflag中,便于移位处理 */
sbit hh =setflag^0; /* 当前设置位标志 */ sbit hl =setflag^1; sbit mh =setflag^2; sbit ml =setflag^3;
/* 以下位变量在uflag */ sbit fresh =uflag^0; /* 显示刷新标志 */ sbit ss =uflag^1; /* 位闪烁标志 */ sbit sec =uflag^2; /* 秒指示标志 */ sbit warning =uflag^3; /* 定时标志 */
/*-----------------------------------------------------------------*/ sbit tfix =uflag^4; /* 开始修正标志 */ #define N 60 /* 误差值,单位:1/10秒,默认为0,即不修正 */ /*-----------------------------------------------------------------*/
/* 函数说明 */ void sys_init(void); void t0_init(void); void uart_init(void); void display(void); void delay20ms(void) ; void settime(void);
void t1_init(void);
/***************************************************************** ;时钟主函数:main() ;定时器T0工作于中断方式 ;一旦走时开始,无法进行设置。如要重新设置,则必须复位 ;24小时制 ;如果某74LS164的1,2脚与其他74LS164的1,2脚错连了,则会出现同显示的状态 ; ;带编辑设定位闪烁功能和走时误差自动纠正功能.与此相关的函数是: ; settime(),位闪烁标志ss ; timer1(),在settime()中启动,每1s将标志ss求反,达到闪烁目的 ;******************************************************************* ;******************************************************************/ void main(void) { sys_init(); t0_init(); t1_init(); uart_init(); buf[0]=0x0a; buf[1]=0x0b; buf[2]=0x0b; buf[3]=0x0b; display(); settime(); display(); TR0=1; ET0=1; while(1) { if(fresh) { buf[0]=hourh; buf[1]=hourl; buf[2]=minuh; buf[3]=minul; display(); if(sec) { sec=0; L1=!L1; L2=!L2; delay20ms(); } } else { if(sec) { sec=0; L1=!L1; L2=!L2; delay20ms(); } } } } /***************************************************************** ;****************************************************************/ void display(void) { uchar out; DISPCON=1; out=seg[buf[0]]; SBUF=out; while(!TI); TI=0;
首页 上一页 1 2 3 下一页 尾页 2/3/3