/******************************************************************** 
                            汇诚科技 
 
实现功能:定时器 T0 的应用---9.9 秒计时设计 
使用芯片:AT89S52 
晶振:11.0592MHZ 
波特率:9600 
编译环境:Keil 
作者:zhangxinchunleo 
网站:www.ourhc.cn 
淘宝店:汇诚科技 http://shop36330473.taobao.com 
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      
 
*********************************************************************/ 
#include<reg52.h>                 //库文件 
#define uchar unsigned char//宏定义无符号字符型 
#define uint unsigned int  //宏定义无符号整型 
/******************************************************************** 
                            初始定义 
*********************************************************************/ 
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟 
uchar wei[4]={0XEf,0XDf,0XBf,0X7f};  //位的控制端 
uchar sec; //定义计数值,每过1/10 秒,sec 加一 
uchar keycnt=0;//按下次数值 
uint tcnt; //键值判断 
sbit P2_0=P2^0; 
/******************************************************************** 
                            延时函数 
*********************************************************************/ 
void delay(uchar t) 
{ 
  uchar i,j; 
   for(i=0;i<t;i++) 
   { 
            for(j=13;j>0;j--); 
         { ; 
         } 
   } 
} 
 
/******************************************************************** 
                            显示函数 
*********************************************************************/         
void Led(int date) //显示函数 
{ 
/*****************数据转换*****************************/  
 uint z,x,c,v; 
  z=date/1000;                         //求千位 
  x=date%1000/100;                 //求百位 
  c=date%100/10;                 //求十位 
  v=date%10;                         //求个位 
 
      P2=0XFF; 
          P0=seg7code[z]; 
          P2=wei[0]; 
          delay(80); 
          P2=0XFF;   
      P0=seg7code[x]; 
          P2=wei[1]; 
          delay(80); 
          P2=0XFF;   
             P0=seg7code[c]; 
          P2=wei[2]; 
          delay(80); 
          P2=0XFF;   
      P0=seg7code[v]; 
          P2=wei[3]; 
          delay(80);  
          P2=0XFF; 
} 
/******************************************************************** 
                            按键扫描函数 
*********************************************************************/ 
void KEY() //按键扫描程序 
{ 
uchar i,j; 
if(P2_0==0) 
        { 
        delay(20); 
        if(P2_0==0) 
                { 
                        keycnt++; 
/******************************************************************** 
                            按下次数判断函数 
*********************************************************************/ 
switch(keycnt) //按下次数判断 
        { 
        case 1: //第一次按下 
        TH0=0x06; //对TH0 TL0 赋值 
        TL0=0x06; 
        TR0=1; //开始定时 
        break; 
        case 2: //第二次按下 
        TR0=0; //定时结束 
        break; 
        case 3: //第三次按下 
        keycnt=0; //重新开始判断键值 
        sec=0; //计数重新从零开始 
        break; 
        } 
        while(P2_0==0); 
                }  
        } 
} 
/******************************************************************** 
                            定时中断服务函数 
*********************************************************************/ 
void t0(void) interrupt 1 using 0 //定时中断服务函数 
{ 
        tcnt++; //每过250ust tcnt 加一 
        if(tcnt==400) //计满400 次(1/10 秒)时 
        { 
                tcnt=0; //重新再计 
                sec++; 
                if(sec==100) //定时10 秒,在从零开始计时 
                { 
                        sec=0; 
                } 
        } 
} 
 
/******************************************************************** 
                            主函数 
*********************************************************************/ 
void main() 
{ 
        TMOD=0x02; //定时器工作在方式2 
        ET0=1; 
        EA=1; 
        sec=0; 
        while(1) 
        { 
                KEY(); 
                Led(sec); 
        } 
}                 
 
         
/******************************************************************** 
                              结束 
*********************************************************************/ 
 
 
 |