AT89S51单片机计时计数的程序?

用C语言编写
2025-03-04 19:54:54
推荐回答(1个)
回答1:

不知道你要什么功能的 ,给你三个比较典型的,希望能够帮助到你,电路是显示部分的

/*

 用定时器控制LED亮和灭

 */

#include

sbit LED=P1^2;

void Init_Timer1(void)

{

 TMOD |= 0x10;        

 TH1=0x00;                /* Init value */

 TL1=0x00;

 EA=1;                      /* interupt enable */

 ET1=1;                     /* enable timer1 interrupt */

 TR1=1;  

}

main()

{

 Init_Timer1();

 while(1);

}

void Timer1_isr(void) interrupt 3 using 1

{

 TH1=0x00;  /* Init value */

 TL1=0x00;

 LED=~LED;

}

再给你一个用定时器做的时钟程序

/*

1、按键可以调整当时时间

2、按键可以调节定时时间

3、定时时间到继电器吸合

*8位数码管显示 时间格式格式 12-08-00 标示12点08分00秒

P30 用于小时 加1操作  

P31 用于小时减1操作

P32 用于分钟 加1操作

P33 用于分钟减1操作

*/

#include 

sbit KEY1=P3^0;

sbit KEY2=P3^1;

sbit KEY3=P3^2;

sbit KEY4=P3^3;

sbit LED=P1^2;

code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

   //共阳数码管 0-9

unsigned char StrTab[8];  //定义缓冲区

unsigned char minute=30,hour=12,second;  //定义并且初始化值 12:30:00

void delay(unsigned int cnt)//延时函数

{

 while(--cnt);

}

void Displaypro(void)

{

         StrTab[0]=tab[hour/10];    //显示正常时间

   StrTab[1]=tab[hour%10];

   StrTab[2]=0xBF;

   StrTab[3]=tab[minute/10];

   StrTab[4]=tab[minute%10];

   StrTab[5]=0xBF;

            StrTab[6]=tab[second/10];

   StrTab[7]=tab[second%10];

 

}

main()//主函数

{

    

    TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时

 TH0=0xd8;

 TL0=0xf0;

 ET0=1;

 TR0=1;

    TMOD |=0x10; //定时器1用于动态扫描

 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;     //正常时间 小时 加1

         Displaypro();

    }

 }

////////////////////////////////////////////////////////////////

   if(!KEY2) //按键2去抖以及动作

    {

    delay(10000);

    if(!KEY2)

    {

    hour--;if(hour==0)hour=23;   //正常时间 小时减1

    Displaypro();

   }

 }

////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

  if(!KEY3) //按键去抖以及动作

    {

    delay(10000);

    if(!KEY3)

    {

     minute++;if(minute==59)minute=0;//分加1

     Displaypro();

   }

 }

/////////////////////////////////////////////////////////////////

  if(!KEY4) //按键去抖以及动作

    {

    delay(10000);

    if(!KEY4)

    {

     minute--;if(minute==0)minute=59;  //分减1

     Displaypro();

   }

 }

  }

}

////////////////////////////////////////////////////////////////

/********************************/

/*      定时中断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=StrTab[7-num];break; //分别调用缓冲区的值进行扫描

  case 1:P2=0xFD;P0=StrTab[7-num];break;

  case 2:P2=0xFB;P0=StrTab[7-num];break;

  case 3:P2=0xF7;P0=StrTab[7-num];break;

  case 4:P2=0xEF;P0=StrTab[7-num];break;

  case 5:P2=0xDF;P0=StrTab[7-num];break;

     case 6:P2=0xBF;P0=StrTab[7-num];break;

  case 7:P2=0x7F;P0=StrTab[7-num];break;

  default:break;

}

num++;     //扫描8次,使用8个数码管

if(num==8)

   num=0;

}

//////////////////////////////////////////////////////////////////

/********************************/

/*      定时中断0                */

/********************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count;//定义内部静态变量

TH0=0xd8;//重新赋值

TL0=0xf0;

count++;

   switch (count)

          {

           case 0:

           case 20:

           case 40:

           case 60:

           case 80:Displaypro(); //隔一定时间调用显示处理

                   break;

           case 50:LED=!LED; //半秒 LED闪烁

                   break;

           default:break;

          }

if (count==100)

    {

    count=0;

    second++;//秒加1

 if(second==60)

    {

    second=0;

    minute++; //分加1

    if(minute==60)

    {

     minute=0;

     hour++;  //时加1

     if(hour==24)

        hour=0;

    }  

      

    }

    

   } 

 

}

再给你一个计数器功能的

/*

1、程序目的:使用外部中断学习计数 这里使用100以内计数,2位数码管 

2、硬件要求:数码管、晶振12M

*/

#include 

code unsigned char tab[]=

   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

   //共阳数码管 0-9 

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

void delay(unsigned int cnt)

{

 while(--cnt);

}

main()

{

  EA=1;//全局中断开

  EX0=1;//外部中断0开

  IT0=1;//边沿触发

while(1)

  {

  P0=Dis_Shiwei;//显示十位

  P2=0xFD;

  delay(300);//短暂延时

  P0=Dis_Gewei; //显示个位

  P2=0xFE;

  delay(300);

  }

}

/********************************/

/*      定时中断                */

/********************************/

void INT0_ISR(void) interrupt 0 using 1

{

static unsigned char second;//定义静态变量,退出该程序后内容不变

    second++;//加1

 if(second==100)

    second=0;

 Dis_Shiwei=tab[second/10];//十位显示值处理

    Dis_Gewei=tab[second%10]; //个位显示处理

    

}