1、/*1、按键可以调整当时时间2、按键可以调节定时时间3、定时时间到继电器吸合*8位数码管显示 时间格式格式 05-59-00 标示 05点 59分 00秒S1 用于小时 加 1操作 S2 用于小时减 1操作S3 用于分钟 加 1操作S4 用于分钟减 1操作*/*-名称:光时钟枕巾日期:2011.3.6编写:董鲁北内容:RT-*/#include /包含头文件sbit KEY1=P30; /定义端口参数sbit KEY2=P31;sbit KEY3=P32;sbit KEY4=P33;sbit SPK=P34; /定义蜂鸣器code unsigned char tab=0xc0,0xf9,0xa
2、4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阴数码管 0-9unsigned char StrTab8; /定义缓冲区unsigned char minute=59,hour=5,second; /定义并且初始化值 12:30:00/*/* 延时函数 */*/void delay(unsigned int cnt)while(-cnt);void delay1()unsigned int i,j;for(i=0;i1000;i+)for(j=0;j1000;j+);/*/* 显示处理函数 */*/void Displaypro(void)StrTab0=ta
3、bhour/10; /显示小时StrTab1=tabhour%10;StrTab2=0xbf; /显示“-“StrTab3=tabminute/10; /显示分钟StrTab4=tabminute%10;StrTab5=0xbf; /显示“-“StrTab6=tabsecond/10; /显示秒StrTab7=tabsecond%10;void time(void)unsigned int i;P1=0x7e;delay1();P1=0x3c;delay1();P1=0x18;delay1();P1=0x00;delay1();P1=0xff;delay(10000);for(i=0;i160
4、;i+)P1=0x00;delay(10000);P1=0xff;delay(10000);while(1)for(i=0;i200;i+)/喇叭发声的时间循环,改变大小可以改变发声时间长短delay(100); /参数决定发声的频率,估算值,可以自行更改参数并SPK=!SPK;SPK=1; /喇叭停止工作,间歇的时间,可更改delay(20000);/*/* 主函数 */*/main()/主函数TMOD |=0x01;/定时器 0 10ms in 12M crystal 用于计时TH0=0xd8; /初值TL0=0xf0;ET0=1;TR0=1;TMOD |=0x10; /定时器 1用于动态
5、扫描TH1=0xF8; /初值TL1=0xf0;ET1=1;TR1=1;EA =1;Displaypro(); /调用显示处理while(1)/主循环if(!KEY1) /按键 1去抖以及动作delay(10000);if(!KEY1) hour+;if(hour=24)hour=0; /正常时间 小时 加 1Displaypro();if(!KEY2) /按键 2去抖以及动作delay(10000);if(!KEY2)hour-;if(hour=255)hour=23; /正常时间 小时减 1Displaypro();if(!KEY3) /按键去抖以及动作delay(10000);if(!K
6、EY3)minute+;if(minute=60)minute=0;/分加 1Displaypro();if(!KEY4) /按键去抖以及动作delay(10000);if(!KEY4)minute-;if(minute=255)minute=59; /分减 1Displaypro();if(hour=6/*/* 定时器 1中断 */*/void time1_isr(void) interrupt 3 using 0/定时器 1用来动态扫描static unsigned char num;TH1=0xF8;/重入初值TL1=0xf0;switch (num)case 0:P2=0xfe;P0=
7、StrTabnum;break; /分别调用缓冲区的值进行扫描case 1:P2=0xfd;P0=StrTabnum;break;case 2:P2=0xfb;P0=StrTabnum;break;case 3:P2=0xf7;P0=StrTabnum;break;case 4:P2=0xef;P0=StrTabnum;break;case 5:P2=0xdf;P0=StrTabnum;break;case 6:P2=0xbf;P0=StrTabnum;break;case 7:P2=0x7f;P0=StrTabnum;break;default:break;num+; /扫描 8次,使用 8
8、个数码管if(num=8)num=0; /*/* 定时器 0中断 */*/void tim(void) interrupt 1 using 1static unsigned char count;/定义内部静态变量TH0=0xd8; /重新赋值TL0=0xf0;count+;switch (count)case 0:case 20:case 40:case 60:case 80:Displaypro(); /隔一定时间调用显示处理break;default:break;if (count=100)count=0;second+; /秒加 1if(second=60)second=0;minute+; /分加 1if(minute=60)minute=0;hour+; /时加 1if(hour=24)hour=0;