tianwei-KEEP-MOVING

这次做了51单片机的实验数字秒表显示,用到了定时器,中断服务函数,还有就是数码管的动态显示,还有就是程序的逻辑考虑

初次在这里写,经验不足,排版不够美观

代码如下:

#include<reg52.h>

#define uchar unsigned char

sbit s0=P1^0;

sbit s1=P1^1;

sbit s2=P1^2;

sbit s3=P1^3;    //数码管的位选

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9的数码管段码

uchar count=0;

uchar second=0;

uchar minite=0;

 

uchar number=200;

void delay(void)  

{    

uchar a,b;    

for(b=1;b>0;b--)    

for(a=90;a>0;a--);

}

void delay_LED()

{      uchar a,b;           

    for(b=38;b>0;b--)            

    for(a=80;a>0;a--);

}

void ini_display()     //初始化数码管 显示“ help” 字样

{    uchar x=1000;  

  while(x--)  

{   

s0=0;  

  s1=1;  

  s2=1;   

s3=1;   

P0=0x89;

   delay();   

P0=0xff;   

s0=1;    s1=0;    s2=1;    s3=1;   P0=0x86;    delay();    P0=0xff;

s0=1;    s1=1;    s2=0;    s3=1;    P0=0xc7;    delay();    P0=0xff;      

s0=1;    s1=1;    s2=1;    s3=0;    P0=0x8c;    delay();    P0=0xff;  

}

}

void display()    //   显示   XX(分):XX(秒)   四个数码管共阳极

{      

if(second<=9)  

  {        

 s0=1;   s1=1;   s2=1;   s3=0;      P0=table[second];   delay_LED();   P0=0xff;     

 s0=1;   s1=1;   s2=0;   s3=1;      P0=table[0];   delay_LED();   P0=0xff;     

 s0=1;   s1=0;   s2=1;   s3=1;      P0=table[minite%10];      delay_LED();      P0=0xff;      

 s0=0;   s1=1;   s2=1;   s3=1;       P0=table[minite/10];   delay_LED();   P0=0xff;        

}       

if(second>=10&&second<60)   

{                     

 s0=1;     s1=1;     s2=0;     s3=1;     P0=table[second/10];       delay_LED();       delay_LED();     P0=0xff;        

 s0=1;     s1=1;     s2=1;     s3=0;     P0=table[second%10];       delay_LED();     P0=0xff;       

 s0=1;     s1=0;     s2=1;     s3=1;     P0=table[minite%10];        delay_LED();     P0=0xff;         

 s0=0;     s1=1;     s2=1;     s3=1;     P0=table[minite/10];     delay_LED();     P0=0xff;        

 }  

  if(second==60)   

   {       

     minite++;      

     second=0;   

 }   

  if(minite==60)    

  {    

    minite=0;

   

  }             

  }

 

void main()

{    uchar flag=0;    

      EA=1;

     ET1=0;  

     ET0=1;         

   TMOD = 0x21;   //定时器0作定时50ms

   TH0  = 0x3c;   

  TL0  = 0xb0;  

  TR0  = 1;     

  TH1  = 0xfd;  

  TL1  = 0xfd;     // 定时器1做波特率发生器

   TR1  = 1;

   EX1  = 1;       

  IT1  = 1;    

  ES  = 1;   

 SM0 = 0;  

  SM1 = 1;   

  REN = 1;         //设置串口方式

  SBUF=temp;   //触发串口处的中断

   while(1)   

{           

  if(flag==0)     

{    

ini_display();    

    flag = 1;   

  }     

  else  

  {     

display();   

   }   

}

}

void  timezhongduan( ) interrupt 1      //定时50ms后,计数20次,就是一秒----->秒表计时器

{      

 TH0  = 0x3c;  

 TL0  = 0xb0;   

count++;  

 if(count==20)                 

  {   

 count=0;      

 SBUF=table[minite/10];   

 SBUF=table[minite%10];

 SBUF=table[second/10];  

 SBUF=table[second%10];

 second++;    

  }

}

void waibuint()interrupt 2    //外部中断1,会清零从头开始计数

{   

EX1=0;   

second=0;

minite=0;   

EX1=1;

 

}

void series()interrupt 4      //置零TI

{    

  if(TI)    

{      

TI=0;     

   }

}

分类:

技术点:

相关文章: