定时器数码管显示秒表

来源:互联网 发布:matlab矩阵输入 编辑:程序博客网 时间:2024/05/16 08:02

/**********************************
用定时器0的方式1实现第一个发光二极管以
200ms间隔闪烁,用定时器1的方式1实现数码
     管的前两位59S循环计时 时间2月11
**************************************/

#include<reg52.h>
#define uchar unsigned char
//#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
sbit led=P1^0;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39 ,0x5e,0x79,0x71};
uchar shu,count0,count1,flag;


/**********初始化函数***************/
void init()
{
flag=1;
  wei=0;
  P0=0xff;
  duan=0;
  P0=0x00;// 初始化关显示

  shu=0;
  count0=0;
  count1=0;

  TMOD=0x11;//选择计数器TO模式1定时器1选择模式1
  TH0=(65536-46080)/256;
  TL0=(65536-46080)%256;//定时器0实现50MS定时
  TH1=(65536-46080)/256;
  TL1=(65536-46080)%256;//定时器1实现50MS定时 
  EA=1;//开总中断
  ET0=1;//开定时器0中断
  ET1=1;
  TR0=1; //定时器0开始计数
  TR1=1;
}

 

 /*******延时函数***************/
 void delay(uchar xms)
 {
   char x,y;
   for(x=xms;x>0;x--)
      for(y=110;y>0;y--);
 }

/************显示函数***********/
void display(uchar temp)
{
  uchar shi,ge;
  temp=shu;
  shi=temp/10;
  ge=temp%10;
 if(flag==1)
 {
  
  P0=0xff; //消隐
  wei=1;
  P0=0x3e;//第一个数码管选中
  wei=0;
  duan=1;
  P0=table[shi];
  duan=0;
  delay(1);

  P0=0xff;//消隐
     
  wei=1;
  P0=0x3d;//第二个数码管选中
  wei=0;
  duan=1;
  P0=table[ge];
  duan=0;
  delay(1);

}

}

 


/******定时器0中断函数*********/
void t0() interrupt 1 //定时器0中断级别为1
{
 
 TH0=(65536-46080)/256;//数据重载
 TL0=(65536-46080)%256;
 count0++;
 if(count0==4)//200MS
    {
 count0=0;
 led=~led;
    }


}

 

/******定时器1中断函数*********/
void t1() interrupt 3 //定时器1中断级别为3
{
  TH1=(65536-46080)/256;//数据重载
  TL1=(65536-46080)%256;
  count1++;
  if(count1==20)
     {
    count1=0;
    shu++;
    flag=1; 
       if(shu>59)
         {
       shu=0;
    flag=1;
    //display(shu);
    flag=0;
      }
   }

}

 

void main()
{
 init();
 while(flag)
      {
       display(shu);
      }
}

 

 

 

实验开始时没有设置消隐,出现了所有数码管都显示数字。前两位数码管能过很亮的显示0到59秒,后面几位数码管有阴暗的显示。加了消隐的两行程序则没有出现那样的现象。

位标志的设置非常重要,不然则在59后出下乱显示。