⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51clock.txt

📁 这 是 一 篇 基 于 C 语 言 的 单 片 机 电 子 时 钟 的 程 序
💻 TXT
字号:
基于C语言的单片机电子时钟


#include<reg52.h>         //定义头文件和各个输入管脚以及变量声明
#include<absacc.h>
#define unit unsigned int
#define uchar unsigned char
#define DIGPORT XBYTE [0x8000]       /*定义字型字位口*/
#define WORDPORT XBYTE[0x4000]
sbit K0=P1^0;                 /*定义P1口各管脚*/
sbit K1=P1^1;
sbit K2=P1^2;
sbit BEEP=P1^3;
sbit L0=P1^4;
sbit L1=P1^5;
sbit L2=P1^6;
sbit L3=P1^7;
uchar data BUFFER[2]={0,0};       /*显示缓冲区(依次为低位,高位)*/
uchar data CLOCK[4]={0,0,0,0}/*存放时钟时间(依次为百分秒、秒、分和时位)*/
uchar data SECOND[2]={0,0};     /*存放秒表时间(依次为百分秒,秒)*/
uchar data REVERSE[4]={0,0,0,0};//存放倒计时时间(依次为百分秒、秒、分和时位)
uchar data STATE=0;             /*定义运行状态*/
bit bdata SND=0;               /*秒表START*/
bit bdata RST=0;               /*秒表RESET*/
bit bdata STP=0;               /*倒计时STOP*/
uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};/*数码管显示编码“0”-“9”,“A”,"-"*/
void display(void);
void main(void)
{
uchar stabak;                 /*上一次程序运行的状态*/
P1=0x0f;
EA=1;IT1=1;ET0=1;
TMOD=0x61;                   /*T1方式2计数,T0方式1计时*/   
TH0=-5000/256;TL0=-5000%256;
TH1=0xff;TL1=0xff;
T2CON=0;TH2=-5000/256;TL2=-5000%256;
K0=1;K1=1;K2=1;
STATE=P1&0x07;
stabak=STATE;
for(;;)
{
  switch(STATE)
  {
  case 0:                     /*START=0,秒表*/
  {
  EX1=0;ET1=1;ET2=1;TR1=1;SND=1;
  L1=1;L0=0;L2=0;
  SECOND[0]=0;
  SECOND[1]=0;
  }break;
  case 1:                     /*START=1,倒计时分调整*/
  {
    EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
    L2=1;L0=0;L1=0;
    REVERSE[0]=0;
    REVERSE[1]=0;
  }break;
  case 2:                     /*START=2,倒计时小时调整*/
  {
    EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
    L2=1;L0=0;L1=0;
    REVERSE[0]=0;
    REVERSE[1]=0;
  }break;
  case 3:                     /*START=3,倒计时运行*/
  {
    EX1=0;ET1=1;ET2=1;TR1=1;
    if((REVERSE[2]==0)&&(REVERSE[3]==0))L2=1;
    else TR2=1;
    L0=0;L1=0;
  }break;
  case 5:                     /*START=5,时钟分调整*/
  {
    IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
    L0=1;L1=0;L2=0;
  }break;
  case 6:                     /*START=6,时钟时调整*/
  {
    IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
    L0=1;L1=0;L2=0;
  }break;
  default:                   /*START=4or7,时钟运行*/
  {
    EX1=0;ET1=0;ET2=1;TR0=1;
    L1=0;L2=0;
  }
  }
while(STATE==stabak)
{
  switch(STATE)
  {
    case 0:                   /*START=0,秒表*/
    {
    BUFFER[0]=SECOND[0];
    BUFFER[1]=SECOND[1];
    }break;
    case 1:                   /*START=1,倒计时分调整*/
    {
    BUFFER[0]=REVERSE[2];
    BUFFER[1]=101;
    }break;
    case 2:                   /*START=2,倒计时小时调整*/
    {
    BUFFER[0]=110;
    BUFFER[1]=REVERSE[3];
    }break;
    case 3:                   /*START=3,倒计时运行*/
    {
    BUFFER[0]=REVERSE[2];
    BUFFER[1]=REVERSE[3];
    }break;
    case 5:                   /*START=5,时钟分调整*/ 
    {
    BUFFER[0]=CLOCK[2];
    BUFFER[1]=101;
    }break;
    case 6:                   /*START=6,时钟时调整*/
    {
    BUFFER[0]=110;
    BUFFER[1]=CLOCK[3];
    }break;
  default:                   /*START=4or7,时钟运行*/     
  {
    BUFFER[0]=CLOCK[2];
    BUFFER[1]=CLOCK[3];
  }
  }
display();                     /*显示函数*/
K0=1;K1=1;K2=1;
STATE=P1&0x07;
}
stabak=STATE;
}
}

void timer0(void) interrupt 1 using 1
{
TH0=-5000/256;                     /*重置定时初值*/   
TL0=-5000%256;
CLOCK[0]=CLOCK[0]+1;                 /*时钟处理*/
if((CLOCK[0]==50)&&(STATE>=4))
{
  L0=!L0;
}
if(CLOCK[0]==100)
{
  if(STATE>=4) L0=!L0;
  CLOCK[0]=0;
  CLOCK[1]=CLOCK[1]+1;
  if(CLOCK[1]==60)
  {
    CLOCK[1]=0;
    CLOCK[2]=CLOCK[2]+1;
    if(CLOCK[2]==60)
    {
    CLOCK[2]=0;
    CLOCK[3]=CLOCK[3]+1;
    if(CLOCK[3]==24)
    {
      CLOCK[3]=0;
    }
    }
  }
}
}

void timer2(void) interrupt 5 using 3
{
TF2=0;
TH2=-5000/256;
TL2=-5000%256;
if(STATE==0)                       /*秒表处理*/
{
  SECOND[0]=SECOND[0]+1;
  if(SECOND[0]==50)
  {
  L1=!L1;
  }
  if(SECOND[0]==100)
  {
  L1=!L1;
  SECOND[0]=0;
  SECOND[1]=SECOND[1]+1;
  if(SECOND[1]==100)
  {
    SECOND[1]=0;
  }
  }
}
if(STATE==3)                       /*倒计时处理*/
{
  REVERSE[0]=REVERSE[0]+1;
  if(REVERSE[0]==50)
  {
    L2=!L2;
  }
if(REVERSE[0]==100)
{
  L2=!L2;
  REVERSE[0]=0;
  REVERSE[1]=REVERSE[1]+1;
  if(REVERSE[1]==60)
  {
    REVERSE[1]=00;
    REVERSE[2]=REVERSE[2]-1;
    if((REVERSE[2]==0)&&(REVERSE[3]==0))
    {
    TR2=0;
    STP=1;
    BEEP=0;
    }
  else if(REVERSE[2]==0xff)
  {
    REVERSE[2]=59;
    REVERSE[3]=REVERSE[3]-1;
  }
  }
}
}
}

void intsvr1(void) interrupt 2 using 2
{
if(STATE==5)
{
  CLOCK[2]=CLOCK[2]+1;
  if(CLOCK[2]==60) CLOCK[2]=0;
}
if(STATE==6)
{
  CLOCK[3]=CLOCK[3]+1;
  if(CLOCK[3]==24) CLOCK[3]=0;
}
}

void timer1(void) interrupt 3 using 3
{
if(STATE==0)
{
  if(RST)
  {
    SECOND[0]=0;
    SECOND[1]=0;
    L1=1;
    RST=0;
  }
  else
  {
  if(SND) TR2=1;
  else
  {
    L1=1;
    TR2=0;
    RST=1;
  }
  SND=!SND;
  }
}
else if(STATE==1)
{
  REVERSE[2]=REVERSE[2]+1;
  if(REVERSE[2]==60) REVERSE[2]=0;
}
else if(STATE==2)
{
  REVERSE[3]=REVERSE[3]+1;
  if(REVERSE[3]==24) REVERSE[3]=0;
}
else
    {
    if(STP)
    {
      BEEP=1;
      L2=1;
      STP=0;
    }
    else TR2=0;
    }
}

void display(void)
{
uchar i;                           /*显示缓冲区首址*/
uchar delay;                       /*显示延时*/
uchar disp;                         /*显示内容*/
uchar digit;                       /*定义数码管显示位*/   
digit=0x08;
for(i=0;i<2;i++)                     /*秒表,显示百分秒和秒*/ 
{
  if(BUFFER>100) disp=BUFFER%10+10;
  else disp=BUFFER%10;
  DIGPORT=digit;
  WORDPORT=TABLE[disp];
  for(delay=0;delay<=200;delay++);
  digit=digit>>1;
  disp=BUFFER/10;
  DIGPORT=digit;
  WORDPORT=TABLE[disp];
  for(delay=0;delay<=200;delay++);
  digit=digit>>1;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -