|  | 
 
 楼主|
发表于 2013-6-11 20:06
|
显示全部楼层 
| #include <reg51.h> #define uint unsigned int
 #define uchar unsigned char
 uint b;
 uchar c,e;
 char h,m;
 uchar gewei,shiwei,baiwei,qianwei;//a为模式标志,
 //mswc为模式选择完成标志,gewei,shiwei,baiwei,qianwei
 //为个位寄存器,十位寄存器,百位寄存器,千位寄存器
 sbit qian =P3^7;
 sbit bai =P3^5;
 sbit shi =P3^4;
 sbit ge =P3^1;
 sbit out =P3^3;
 sbit set =P3^2;//设置键
 sbit up =P3^0;//加
 sbit md =P1^7;//秒点
 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
 0x92,0x82,0xf8,0x80,0x90};
 void delay(uchar z);
 void display();
 void delay(uchar z)
 {
 uint x,y;
 for(x=z;x>0;x--)
 for(y=74;y>0;y--);
 }
 void main()//定时模式
 {
 out=0;
 EA=1;
 EX0=1;//开set键中断
 ET0=1;//开定时器0做计时基准
 TMOD=0x02;
 TH0=(256-240);
 TL0=(256-240);
 b=0;
 c=0;
 e=1;//在定时模式中第一次按SET键时个位闪烁
 m=0;
 h=0;
 h=qianwei*10+baiwei;
 m=shiwei*10+gewei;
 TR0=0;
 while(1)
 {
 if(up==1)//按下SET键时的显示程序根据按下的次序显示
 {
 switch(e)
 {
 case 0://定时进行中的显示
 display();
 break;
 case 1://个位闪烁                                                          02/06/2011 14:22:14 PAGE 2
 
 P1=table[gewei];
 ge=1;
 shi=0;
 bai=0;
 qian=0;
 delay(250);
 ge=0;
 shi=0;
 bai=0;
 qian=0;
 delay(250);
 break;
 case 2://十位闪烁
 P1=table[shiwei];
 ge=0;
 shi=1;
 bai=0;
 qian=0;
 delay(250);
 ge=0;
 shi=00;
 bai=0;
 qian=0;
 delay(250);
 break;
 case 3:
 P1=table[baiwei];
 ge=0;
 shi=0;
 bai=1;
 qian=0;
 delay(250);
 ge=0;
 shi=0;
 bai=0;
 qian=0;
 delay(250);
 break;
 case 4:
 P1=table[qianwei];
 ge=0;
 shi=0;
 bai=0;
 qian=1;
 delay(250);
 ge=0;
 shi=0;
 bai=0;
 qian=0;
 delay(250);
 break;
 }
 }
 if(up==0)//当UP键按下时
 {
 delay(10);
 if (up==0)
 while(!up);
 switch(e)
 {
 case 1:
 gewei++;
 
 if(gewei>9)
 gewei=1;
 break;
 case 2:
 shiwei++;
 if(shiwei>5)
 shiwei=1;
 break;
 case 3:
 baiwei++;
 if(baiwei>9)
 baiwei=1;
 break;
 case 4:
 qianwei++;
 if(qianwei>9)
 qianwei=1;
 break;
 }
 h=(qianwei*10+baiwei);
 m=(shiwei*10+gewei);
 }
 }
 }
 void EX0_set()interrupt 0//set键
 {
 EX0=0;
 delay(10);
 if(set==0)
 {
 while(!set);
 
 TR0=0;
 e=e++;
 if(e>4)
 {
 e=0;
 TR0=1;//第五次按SET键则开始定时
 out=1;
 }
 }
 EX0=1;
 }
 void t0_time() interrupt 1
 {
 b=b++;
 if(b>=1250)
 {
 b=0;
 c=c++;
 }
 if(c>=120)
 {
 c=0;
 m=m--;
 }
 if(m==0)
 if(h==0)
 {          //当定时时间到后关闭定时器1,显示00:00不闪烁
 ET0=0;
 TR0=0;
 P1=table[0];
 md=0;
 while(1)
 {
 out=0;
 ge=1;
 shi=1;
 bai=1;
 qian=1;//全亮,继电器动作,整个程序将停在这里。
 }
 }
 if(m<0)
 {
 m=59;
 h=h--;
 }
 }
 
 void display()
 {
 P1=0xff;//消隐
 ge=1;
 shi=0;
 bai=0;
 qian=0;
 P1=table[m%10];//gewei
 delay(2);
 P1=0xff;
 ge=0;
 shi=1;
 bai=0;
 qian=0;
 P1=table[m/10];//shiwei
 delay(2);
 P1=0xff;
 ge=0;
 shi=0;
 bai=1;
 qian=0;
 P1=table[h%10];//baiwei
 delay(2);
 P1=0xff;
 ge=0;
 shi=0;
 bai=0;
 qian=1;
 P1=table[h/10];//qianwei
 delay(2);
 md=c%2;
 delay(2);
 }
 
 | 
 |