1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义  
  2.  
  3.  
  4. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换  
  5. #define CtrlPort P1 //定义控制端口  
  6.  
  7.  
  8. unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9  
  9. unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码  
  10. unsigned char TempData[8]; //存储显示值的全局变量  
  11. void Delay(unsigned int t); //函数声明  
  12. void Display(unsigned char FirstBit,unsigned char Num);  
  13.  
  14.  
  15.  
  16.  
  17. unsigned char j,k,flag=1,flag1=1,flag2=1,aa=1,bb=1,cc=1,flag22=1;  
  18. unsigned char num=25,num1=30,num11=30,num22=25;  
  19. void init()  
  20. {  
  21. TMOD=0x11;  
  22. TH1=(65536-50000)/256;  
  23. TL1=(65536-50000)%6;  
  24. TH0=(65536-50000)/256;  
  25. TL0=(65536-50000)%6;  
  26. EA=1;  
  27. ET1=1;  
  28. ET0=1;  
  29. TR1=1;  
  30. TR0=1;  
  31. }  
  32.  
  33.  
  34.  
  35.  
  36. void main()  
  37. {  
  38. init();  
  39.  
  40.  
  41. while(1)  
  42. {  
  43.    if(aa==1)  
  44. {  
  45. if(flag==1)  
  46. {  
  47. if(j==20)   
  48.     {  
  49.  j=0;  
  50.  num--;  
  51. }  
  52.   TempData[0]=DuanMa[num];  
  53.   TempData[1]=DuanMa[num/10];  
  54.   Display(0,2);  
  55.   Display(2,2);  
  56. }  
  57. else 
  58.     {  
  59.         num=0;  
  60.    TempData[0]=DuanMa[num];  
  61.    TempData[1]=DuanMa[num/10];  
  62.    Display(0,2);  
  63.    Display(2,2);  
  64. if(j==120)  
  65. {  
  66. j=0;  
  67. num=25;  
  68. flag=1;  
  69.       flag1=1;  
  70. aa=0;  
  71. }  
  72.     }  
  73. }  
  74. if(num==0)  
  75. {  
  76. if(flag1==1)  
  77. {  
  78. TR0=0;  
  79. flag=0;  
  80. TH0=(65536-50000)/256;  
  81. TL0=(65536-50000)%6;  
  82. TR0=1;  
  83. flag1=0;  
  84. }  
  85. }  
  86. if(aa==0)  
  87. {  
  88.  if(j==20)  
  89.  {  
  90.  j=0;  
  91.  num11--;    
  92.  }  
  93.  TempData[0]=DuanMa[num11];  
  94.  TempData[1]=DuanMa[num11/10];  
  95.  Display(0,2);  
  96.  Display(2,2);  
  97.  if(num11==-1)  
  98.   {  
  99. num11=30;  
  100. aa=1;  
  101. }  
  102. }  
  103.    if(bb==1)  
  104. {  
  105.  if(k==20)  
  106.  {  
  107.  k=0;  
  108.  num1--;    
  109.  }  
  110.  TempData[0]=DuanMa[num1];  
  111.  TempData[1]=DuanMa[num1/10];  
  112.  Display(4,2);  
  113.  Display(6,2);  
  114. if(num1==-1)  
  115. {  
  116. bb=0;  
  117. num1=30;  
  118. }  
  119. }  
  120. if(bb==0)  
  121. {  
  122. if(cc==1)  
  123. {  
  124. if(flag22==1)  
  125. {  
  126. if(k==20)   
  127.     {  
  128.  k=0;  
  129.  num22--;  
  130. }  
  131.   TempData[0]=DuanMa[num22];  
  132.   TempData[1]=DuanMa[num22/10];  
  133.   Display(4,2);  
  134.   Display(6,2);  
  135. }  
  136. else 
  137.     {  
  138.         num22=0;  
  139.    TempData[0]=DuanMa[num22];  
  140.    TempData[1]=DuanMa[num22/10];  
  141.    Display(4,2);  
  142.    Display(6,2);  
  143. if(k==120)  
  144. {  
  145. k=0;  
  146. flag22=1;  
  147. num22=25;  
  148. flag2=1;  
  149. bb=1;  
  150. }  
  151.     }  
  152. }  
  153. if(num22==0)  
  154. {  
  155. if(flag2==1)  
  156. {  
  157. TR1=0;  
  158. flag22=0;  
  159. TH1=(65536-50000)/256;  
  160. TL1=(65536-50000)%6;  
  161. TR1=1;  
  162. flag2=0;  
  163. }  
  164. }  
  165. }  
  166. }  
  167. }  
  168. void Delay(unsigned int t)  
  169. {  
  170.   while(--t);  
  171. }  
  172. void Display(unsigned char FirstBit,unsigned char Num)  
  173. {  
  174.       unsigned char i;  
  175.    
  176.  for(i=0;i<Num;i++)  
  177.   {   
  178.   DataPort=0;   //清空数据,防止有交替重影  
  179.       CtrlPort=WeiMa[i+FirstBit]; //取位码   
  180.       DataPort=TempData[i]; //取显示数据,段码  
  181.         
  182.   Delay(100); // 扫描间隙延时,时间太长会闪烁,  
  183.                   //太短会造成重影  
  184.  
  185.  
  186.        }  
  187.  
  188.  
  189. }  
  190.  
  191.  
  192. void exter0() interrupt 1  
  193. {  
  194. TH0=(65536-50000)/256;  
  195. TL0=(65536-50000)%6;  
  196. j++;  
  197. }  
  198.  
  199.  
  200. void exter1() interrupt 3  
  201. {  
  202. TH1=(65536-50000)/256;  
  203. TL1=(65536-50000)%6;  
  204. k++;  
  205. }