第1 页 #include #define uint unsigned int #define uchar unsigned char #define LED P0 // 数码管的段选 #define LIGHT P1 // 时分秒位的指示灯 #define WS P2 // 数码管的位选 sbit key1=P3^0; // 时间暂停/开始 sbit key2=P3^1; // 时间/闹钟设置 sbit key3=P3^2; // 增加 sbit key4=P3^3; // 减少 sbit alarm=P3^6; // 闹铃 uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; // 0-9 uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef} ; // 0.-9.(带小数点) uchar data1[]={0,0,0,0,0,0} ; uchar data2[]={0,0,0,0,0,0} ; uint t,k,kk,k1,flag; uint bbh,bbm,bbs,bbh1,bbm1,bbs1; uint sec,min,hour,sec1,min1,hour1; // 定义 秒,分,时 void init(); void display(); void display_bb(); void delay( uint ); void keyscan(); void main() { init(); while(1) { keyscan(); if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间 { display(); 第2 页 } if(k1==4||k1==5||k1==6) // 显示调节闹钟 { display_bb(); } if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s 报时 { alarm=~alarm; delay(1); } if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时 { alarm=~alarm; delay(1); } } } void init() { WS=LIGHT=flag=0; sec=min=hour=0; // 将0 赋给时分秒 TMOD=0x01; // 方式1 P129(见课本) TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本) TL0=0xb0; EA=1; // 开总中断 P161(见课本) TR0=1; // 定时/计数器 0 开启 ET0=1; // 定时器/计数器 0 溢出中断启动 P161(见课本) } void delay( unsigned int t) // 延时函数 { unsigned int i; while(t--) for(i=0;i<125;i++); } void display() // 显示时间函数 { if(TF0==1) // 定时器/计数器溢出 P130(见课本) { TF0=0; // 清中断标志位 t++; 第3 页 if(t==20) // (50ms*20=1s) { t=0; sec++; // 秒加1 if(sec==60) // 秒为 60,则清零,分加1 { sec=0; min++; } if(min==60) // 分为 60,则清零,时加1 { min=0; hour++; } if(hour==24)// 时为 24,则清零 { hour=0; } ...