AT89C51单片机24.00.00到00.00.00倒计时程序 6位或8位数码管显示 C语言和汇编都行 急用 带电路图 十分感谢

急用 自己没做出来 求高手 万分感谢
2025-01-24 09:38:47
推荐回答(1个)
回答1:

#include      //包括一个52标准内核的头文件

  #include

/****************************声明函数*****************************/

  void x8led(unsigned long ddd);

  void delay882us(void);

/*****************************定义IO******************************/

  sbit P20=P2^0;

  sbit P21=P2^1;

  sbit S20=P3^0;

  sbit S19=P3^1;

  sbit S18=P3^2;

  sbit P10=P1^0;

  sbit P11=P1^1;

  sbit P12=P1^2;

  sbit P13=P1^3;

  sbit P14=P1^4;

  sbit P15=P1^5;

  sbit P16=P1^6;

  sbit P17=P1^7;

  bit f=0;//位变量

 /***************************定时器2中断**************************/

timer2() interrupt 5  

{

 static unsigned char t;

 TF2=0;

 t++; 

 if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ

 {

  t=0;

  f=1;//每次长时间的溢出,就置一个标记,以便主程序处理

 }

}

/*****************************数码管扫描**************************/

void x8led(unsigned long ddd)

{

   unsigned char q,r=0;

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

   //0-9的字段码

   unsigned char xx[6]={0,0,0,0,0,0};

   unsigned char y[6]={0x80,0x40,0x20,0x10,0x8,0x4};

   xx[0]=ddd%10;

   xx[1]=ddd/10%10;

   xx[2]=ddd/100%10;

   xx[3]=ddd/1000%10;

   xx[4]=ddd/10000%10;

   xx[5]=ddd/100000%10;

    

   for(q=0;q<6;) //循环扫描

   {

       q++;

       r++;

    if(r==6)r=0;

    P1=y[r];

       P21=1;

    delay882us();

    P21=0;

    

    P20=1;

    P1=l[xx[r]];

    delay882us();

    P1=0xff;

    P20=0;

   }

}  

/*******************************延时882us*************************/

void delay882us(void)

{

 unsigned char i;

 for(i=0;i<255;i++)

 {

  _nop_();

 }

}

/*****************************主程序******************************/

  void main(void)

  {

      

   

   unsigned long a=240000;

   RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟

   RCAP2L =0x00; 

   TR2=1;   //启动定时器

   ET2=1;    //打开定时器2中断

   EA=1;     //打开总中断

      while(1)

   {

    if(f)//发现标记进入处理

    {

              f=0;//清除标记

     a--;

     if(a<0)a=240000;

    }

        x8led(a);//将a的值送到数码管显示

   }

  

  }

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