通过8051单片机,在p1口接一位数码管,让数码管从0显示到9,循环显示。试画出AT89S51与外设的连接图

程序及连接图 、、、急!急!急!

ORG 0000H

LJMP START

ORG 000BH

LJMP INTERRUPT_T0

ORG 0030H

START:

MOV SP,#60H

MOV TMOD,#01H

MOV TH0,#4CH

MOV TL0,#00H

MOV R7,#00H

MOV R6,#00H

SETB ET0

SETB EA

SETB TR0

MOV DPTR,#TAB

MAIN:

MOV A,R6

MOVC A,@A+DPTR

MOV P1,A

LJMP MAIN

INTERRUPT_T0:

MOV TH0,#4CH

MOV TL0,#00H

INC R7

CJNE R7,#20,LOOP1

MOV R7,#00H

INC R6

CJNE R6,#10,LOOP1

MOV R6,#00H

LOOP1:

RETI

TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

END

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-11

这是一个十进制计数器,但是只循环显示0~9,显示位数可以设定,按键按下,开始循环。

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned  int

#define  dispseg   P0

#define  dispbit   P2

#define disnum 3

uchar dispp[disnum],TimeCount,count;

sbit  sb=P1^0;

sbit  ssb=P1^0;

uint ttt,i,ii;

uchar duan[ ]={0Xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; 

uchar xuan[ ]={0X01,0X02,0X04,0X08,0X10,0X20};

void delay(uint z)

    { uint x,y;

  for(x=z;x>0;x--)

    for(y=110;y>0;y--) ;

}

void outside_init(void)

  {  TMOD=0x01;

     TH0=(65536-50000)/256;  //定时

 TL0=(65536-50000)%256;

 IE=0X00;

 ET0=1;

 EA=0;

 TR0=1;

  }

void outside_int(void) interrupt 1

  {   ET0=0;

      TH0=(65536-50000)/256;  //定时

  TL0=(65536-50000)%256;

      count++;

  if(count>15)

   {count=0;

     ttt++;

if(ttt>10)

  ttt=0;  

   }

   ET0=1;

  }

 void displayy()

  { uint ii; 

     dispp[0]=duan[ttt%10];

     dispp[1]=duan[ttt/10];    

   for(ii=0;ii<2;ii++)

     {  P0=0xff;

    P2=xuan[ii];

    P0=dispp[ii] ;

   

     }

 P0=0xff;

P2=0xff;

  }

void  main()

{   outside_init();

delay(1);

  while(1)

   { if(sb==0)

        {delay(1);

   if(sb==0)

   {   EA=~EA  ;

    while(sb==0) 

 { displayy(); 

    ET0=0;}

       ttt=0;

          }

}

 ET0=1;

    displayy();  

 }

}

相似回答